Опубликован: 19.01.2025 | Доступ: свободный | Студентов: 0 / 0 | Длительность: 05:57:00
Лекция 13:

Лабораторная работа №12. Очереди FreeRTOS (на основе очередей)

< Лекция 12 || Лекция 13: 12 || Лекция 14 >

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 Вопросы для контроля

  1. Какие основные параметры нужно определить при создании очереди?
  2. Можно ли использовать очередь во FreeRTOS для реализации стека?
  3. Что происходит при попытке записи элемента в заполненную очередь?
< Лекция 12 || Лекция 13: 12 || Лекция 14 >