powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Очередь в С как в FreeRTOS.
3 сообщений из 3, страница 1 из 1
Очередь в С как в FreeRTOS.
    #39659377
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хочу сделать что то вроде
Код: 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
Очередь в С как в FreeRTOS.
    #39659502
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Очередь в С как в FreeRTOS.
    #39659593
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
3 сообщений из 3, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Очередь в С как в FreeRTOS.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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