Очередь в С как в FreeRTOS.

jenya7
Дата: 11.06.2018 08:02:32
Хочу сделать что то вроде
check_sendToqueue = FRTOS1_xQueueSendToBack(Global_Queue_Handle, &lf_rec_buff , 0);

check_queue = FRTOS1_xQueueReceive(Global_Queue_Handle, &lt_rec_buff, 0);


и что то я запутался

#define QUEU_ELEMENT_COUNT 4
#define QUEU_ELEMENT_SIZE 64

typedef struct 
{
    uint8_t idx;
    uint8_t capacity;
    uint8_t new_element;
    uint8_t size;
    
    uint8_t queue_array[QUEU_ELEMENT_COUNT][QUEU_ELEMENT_SIZE];
}S_QUEUE;

int QUEUE_Push(S_QUEUE* queue, uint8_t *item)
{
    if ((queue->size) >= queue->capacity)
    {
        queue->new_element = 0;
        return QUEUE_FULL;
    }
    
    memcpy(&queue->queue_array[queue->idx][0], item, sizeof(item));
    queue->new_element = 1;
    queue->size++;
    queue->idx++;
    
    return QUEUE_OK;
}

int QUEUE_Pop(S_QUEUE* queue, uint8_t *item)
{
    if (queue->size > 0)
    {
        memcpy(item, &queue->queue_array[queue->idx][0], sizeof(item));
        queue->size--;
        queue->idx--;
        return QUEUE_NEW;   
    }
    else
        return QUEUE_OK; 
}

но так не соблюдается принцип FIFO. или я не прав?
Anatoly Moskovsky
Дата: 11.06.2018 18:17:33
jenya7,

Это у вас стек.
Чтобы сделать FIFO используйте кольцевой буфер.
У вас уже все почти есть, только вместо одного idx используйте 2 указателя: write_idx и read_idx.
При чтении и записи в очередь инкрементируйте соотв. указатель, и при достижении края массива заворачивайте в 0.

PS. Ну и тут заменить uint8_t на size_t
    uint8_t idx;
    uint8_t capacity;
    uint8_t size;

А то одно неловкое движение и будет переполнение uint8
jenya7
Дата: 12.06.2018 09:17:14
Anatoly Moskovsky
jenya7,

Это у вас стек.
Чтобы сделать FIFO используйте кольцевой буфер.
У вас уже все почти есть, только вместо одного idx используйте 2 указателя: write_idx и read_idx.
При чтении и записи в очередь инкрементируйте соотв. указатель, и при достижении края массива заворачивайте в 0.

PS. Ну и тут заменить uint8_t на size_t
    uint8_t idx;
    uint8_t capacity;
    uint8_t size;

А то одно неловкое движение и будет переполнение uint8

спасибо.