0%

使用freeRTOS的队列和定时器

使用freeRTOS的队列和定时器

Cube

  • 注意必须用CMSIS_V2系统才可以设置定时器

image-20211218130310454

image-20211218130352028

然后在freeRTOS.c中的初始化函数MX_FREERTOS_Init中添加启动定时器的语句

void MX_FREERTOS_Init(void) {
/* USER CODE BEGIN Init */

/* USER CODE END Init */

/* USER CODE BEGIN RTOS_MUTEX */
/* add mutexes, ... */
/* USER CODE END RTOS_MUTEX */

/* USER CODE BEGIN RTOS_SEMAPHORES */
/* add semaphores, ... */
/* USER CODE END RTOS_SEMAPHORES */

/* Create the timer(s) */
/* creation of myTimer01 */
myTimer01Handle = osTimerNew(refreshScreen, osTimerPeriodic, NULL, &myTimer01_attributes);

/* creation of myTimer02 */
myTimer02Handle = osTimerNew(drawString, osTimerPeriodic, NULL, &myTimer02_attributes);

/* USER CODE BEGIN RTOS_TIMERS */
osTimerStart(myTimer01Handle, 500);
osTimerStart(myTimer02Handle, 500);
/* start timers, add new ones, ... */
/* USER CODE END RTOS_TIMERS */

/* Create the queue(s) */
/* creation of colorQ */
colorQHandle = osMessageQueueNew (16, sizeof(uint8_t), &colorQ_attributes);

/* USER CODE BEGIN RTOS_QUEUES */
/* add queues, ... */
/* USER CODE END RTOS_QUEUES */

/* Create the thread(s) */
/* creation of drawColor */
drawColorHandle = osThreadNew(StartDefaultTask, NULL, &drawColor_attributes);

/* USER CODE BEGIN RTOS_THREADS */
/* add threads, ... */
/* USER CODE END RTOS_THREADS */

/* USER CODE BEGIN RTOS_EVENTS */
/* add events, ... */
/* USER CODE END RTOS_EVENTS */

}
  • 队列从Cube里直接创建即可,不需要额外的代码启动。
  • 队列相关的操作函数在cmsis_os2.h中,如图
  • image-20211218130544220

测试CMSIS_V2使用ili9341驱动

  • 能开始像芯片发送一次左右的指令,然后就会不知道因为什么原因(猜测是SPI)进入hardFault无限循环

  • image-20211218132008015

  • 认为还是只能用CMSIS_V1进行操作。

  • 尝试过SPI和DMA都不使用freeRTOS的中断,中断都比RTOS高,也尝试过DMA不用而SPI用,都不行。