Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Очередь в С как в FreeRTOS. / 3 сообщений из 3, страница 1 из 1
11.06.2018, 08:02
    #39659377
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очередь в С как в FreeRTOS.
Хочу сделать что то вроде
Код: c#
1.
2.
3.
check_sendToqueue = FRTOS1_xQueueSendToBack(Global_Queue_Handle, &lf_rec_buff , 0);

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



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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
#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. или я не прав?
...
Рейтинг: 0 / 0
11.06.2018, 18:17
    #39659502
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очередь в С как в FreeRTOS.
jenya7,

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

PS. Ну и тут заменить uint8_t на size_t
Код: sql
1.
2.
3.
    uint8_t idx;
    uint8_t capacity;
    uint8_t size;


А то одно неловкое движение и будет переполнение uint8
...
Рейтинг: 0 / 0
12.06.2018, 09:17
    #39659593
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очередь в С как в FreeRTOS.
Anatoly Moskovskyjenya7,

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

PS. Ну и тут заменить uint8_t на size_t
Код: sql
1.
2.
3.
    uint8_t idx;
    uint8_t capacity;
    uint8_t size;


А то одно неловкое движение и будет переполнение uint8
спасибо.
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Очередь в С как в FreeRTOS. / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]