**内容回顾:**上一节,我们通过使用优先级不同的三个任务,同时在串口打印了信息。但是大家肯定会有疑问,为什么相同优先级的任务不能同时通过串口打印数据,不同优先级的任务反倒可以“同时”打印?本节将深入探讨任务调用的顺序问题。
这是FreeRTOS系列的第二篇教程,在本教程中,我们将看到一些与Tasks相关的操作。这包括创建任务,在任务之间切换,暂停和恢复任务,终止任务等等。
CubeMX设置
让我们先从设置CubeMX开始。如下所示,我使用CMSIS V1,因为它被大多数STM32芯片型号支持。其他的一切都保持默认。
在包含参数选项卡中,使能vTaskDelayUntill选项。vTaskDelayUntill函数用于将任务延迟到指定的时间。周期性任务可以使用此函数,以确保固定的执行频率。关于函数vTaskDelayUntil的使用请阅读[官方文档](FreeRTOS - A FREE Open Source Simple RTOS Scheduler API documentation)。
函数原型 **void vTaskDelayUntil( TickType_t \*pxPreviousWakeTime, const TickType_t xTimeIncrement );**
官方示例
// Perform an action every 10 ticks.
void vTaskFunction( void * pvParameters )
{
TickType_t xLastWakeTime;
const TickType_t xFrequency = 10;
// Initialise the xLastWakeTime variable with the current time.
xLastWakeTime = xTaskGetTickCount();
for( ;; )
{
// Wait for the next cycle.
vTaskDelayUntil( &xLastWakeTime, xFrequency );
// Perform action here.
}
}
创建任务
按照教程1的方法,在CubeMX中新创建一个Task-2,优先级定义为“osPriorityNormal”,与默认的任务优先级相同。创建任务后,我们现在有两个可用的任务。一个是默认的Task,另一个是Task2。
在defaultTask和Task2的执行代码中添加内容
// 默认任务
void StartDefaultTask(void const *</