单片机型号:STM32F103VE
CubeMX中的配置:
1、首先配置好时钟和时钟树
注意配置时钟树前要先配置好RCC中的RCC Mode,否则时钟树中HSE不能选择
2、配置好需要的外设(不知道是不是这样叫),如本次我选择用LED的三个颜色作为测试对象,目的是通过LED灯颜色的变换来测试任务是否创建成功。
此处有一个小技巧,通过更改引脚名称方便后续编程。如:PB5为LED红灯,改为LED_R,后面生成的程序将会自动生成GPIO_Pin_5为GPIO_R_Pin
3、FreeRTOS任务的创建
按图中1,、2、3依次点击配置。选择1中的FREERTOS进行配置,再选择2中Mode有两个,一个V1,一个V2,两者就是不同版本,差别不大,随便选择一个就可以,本次选择V1。
3中更改Taks and Queues,点击Add添加任务。
然后4中设置任务名称,优先级,大小,对应函数,参数,动态创建/静态创建(一般选择动态),这些都和任务创建API函数对应。
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, // 对应函数
const char * const pcName, // 任务名称
const configSTACK_DEPTH_TYPE usStackDepth, // 堆大小
void * const pvParameters, // 参数
UBaseType_t uxPriority, // 优先级
TaskHandle_t * const pxCreatedTask ) // 句柄
4、生成代码,并在代码中添加需要的功能实现。
代码2中osDelay()函数为封装的vTaskDelay()函数,功能同HAL_Delay()函数。
2022.11.28(补充)
在阻塞、悬挂或者删除任务后,任务实现的状态有的不会被停止。如按键任务未按下时删除任务1,按下创建任务1,但是在任务1删除被删除时,当前若是红灯亮,则会保持红灯亮,并且和绿灯闪烁一起呈现;同样,当为红灯灭时,也会呈现只有绿灯闪烁现象。
void KEYS_Task3(void const * argument)
{
/* USER CODE BEGIN KEYS_Task3 */
/* Infinite loop */
for(;;)
{
if(HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == RESET)
{
HAL_Delay(50);
if(HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == RESET)
{
if(LED_RHandle == NULL)
{
printf("Task1 miss!\r\n");
osThreadDef(LED_R, LEDr_TwinkleTask1, osPriorityNormal, 0, 128);
LED_RHandle = osThreadCreate(osThread(LED_R), NULL);
printf("Task1 is Created!\r\n");
}
else
{
printf("Task1 is deleted!\r\n");
vTaskDelete(LED_RHandle);
LED_RHandle = NULL;
}
}
while(HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == RESET);
}
}