Опубликован: 19.01.2025 | Доступ: свободный | Студентов: 0 / 0 | Длительность: 05:57:00
Тема: Программирование
Лекция 13:
Лабораторная работа №12. Очереди FreeRTOS (на основе очередей)
12.3.2 Пример выполнения
#define SEQUENCE_LEN 5 QueueHandle_t queues[SEQUENCE_LEN-1]; xSemaphoreHandle mutex_print; char str[40]; void queue_init_task_function(void *pvParameters){ int a=1, b=1; while(1){ for(int a = 1; a < 5; a++){ for (int b = 1; b < 5; b++) { xQueueSend( queues[0], &a, ( TickType_t ) 0 ); xQueueSend( queues[0], &b, ( TickType_t ) 0 ); if(xSemaphoreTake(mutex_print,2000)){ sprintf( str, "Init: f[0]=%d; f[1]=%d;", a, b); vSendString(str); xSemaphoreGive(mutex_print); } vTaskDelay(25000); } } } } void queue_forward_function(void *pvParameters){ int cnt = 0, val=0; int i = (int)pvParameters; int nb = 0; while(1){ if(xQueueReceive( queues[i],&val,( TickType_t ) 10 ) == pdPASS){ xQueueSend( queues[i+1], &val, ( TickType_t ) 0 ); cnt++; if(cnt > i){ nb += val; } if(cnt == (i + 2)){ if(xSemaphoreTake(mutex_print,2000)){ sprintf( str, "New: f[%d]=%d;",i+2, nb); vSendString(str); xSemaphoreGive(mutex_print); } xQueueSend( queues[i+1], &nb, ( TickType_t ) 0 ); nb = 0; cnt = 0; } } } } void queue_process_function(void *pvParameters){ int cnt = 0; int val = 0; int ks8 = 0; while(1){ if(xQueueReceive( queues[SEQUENCE_LEN-2],&val,( TickType_t ) 10 ) == pdPASS){ ks8+=val; cnt++; if(cnt==(SEQUENCE_LEN)){ cnt = 0; if(xSemaphoreTake(mutex_print,2000)){ sprintf( str, "Result: KS8=%d;", ((unsigned char)(~ks8))); vSendString(str); xSemaphoreGive(mutex_print); } ks8=0; } } } } int main_queue(){ mutex_print = xSemaphoreCreateMutex(); for(int i=0; i<SEQUENCE_LEN-1;i++){ queues[i] = xQueueCreate( 10, sizeof( int ) ); } xTaskCreate((TaskFunction_t )queue_init_task_function, (const char* )"Init_Task", (uint16_t )512, (void* )NULL, (UBaseType_t )2, (TaskHandle_t* )NULL); for(int i=0; i<SEQUENCE_LEN-2;i++){ xTaskCreate((TaskFunction_t )queue_forward_function, (const char* )"Forward_Task", (uint16_t )512, (void* )i, (UBaseType_t )2, (TaskHandle_t* )NULL); } xTaskCreate((TaskFunction_t )queue_process_function, (const char* )"Calc_Task", (uint16_t )512, (void* )NULL, (UBaseType_t )2, (TaskHandle_t* )NULL); vTaskStartScheduler(); return 0; } int main(){ main_queue(); while(1); }
Представлен код основных задач: определения начальных элементов, формирования новых байтов, формирования результата. Продемонстрированы основные результаты их работы: формирование начальных данных, генерация новых элементов, вычисление контрольной суммы. Длину последовательности можно регулировать изменением SEQUENCE_LEN.
12.4 Вопросы для контроля
- Какие основные параметры нужно определить при создании очереди?
- Можно ли использовать очередь во FreeRTOS для реализации стека?
- Что происходит при попытке записи элемента в заполненную очередь?