前言
本人是一名嵌入式学习者,在大学期间也参加了不少的竞赛并获奖,包括但不限于:江苏省电子设计竞赛省一、睿抗机器人国二、中国高校智能机器人国二、嵌入式设计竞赛国三、光电设计竞赛国三、节能减排竞赛国三。
后面会经常写一下博客,分享一下资料、经验,如果想了解其他项目、技术,可以去B站搜:星汇极客,主页链接:星汇极客
此外,还开发了个人网站,里面有一些资料和源码供下载:星汇极客网站
二、任务管理
(1)几种FreeRTOS的任务函数:
1.任务挂起、暂停函数:vTaskSuspend()
例:vTaskSuspend(Task1Task_Handler); 或者 vTaskSuspend(NULL);
//参数是要暂停的对象(任务句柄),NULL为自己。
2.暂停所有的任务:vTaskSuspendAll()
例:vTaskSuspendAll();
3.恢复任务:vTaskResume()
例:vTaskResume(Task1Task_Handler);//参数是要暂停的对象(任务句柄)
4.删除函数: vTaskDelete()
例:vTaskDelete(Task1Task_Handler);或者 vTaskDelete(NULL);
//参数是要暂停的对象(任务句柄),NULL为自己。
5.相对延时函数:vTaskDelay()
例:vTaskDelay(1000);//单位是ms
6.绝对延时函数:vTaskDelayUntil()
(2)代码实现
在之前的代码基础上更改,
start_task函数里是创建task1、2...,创建完后自己删除。
task2函数先执行一次,将自己挂起,task1计时3秒后把task2恢复。
void task1(void *pvParameters)
{
int i=0;
while(1)
{
i++;
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
printf("LED翻转\r\n");
if(i == 6)
{
i=0;
printf("Task2恢复\r\n");
vTaskResume(Task2Task_Handler);
}
vTaskDelay(700);
}
}
void task2(void *pvParameters)
{
while(1)
{
printf("Task2Running\r\n");
printf("Task2挂起\r\n");
vTaskSuspend(NULL);
vTaskDelay(1000); /* 延时1000ticks */
}
}
烧录代码,串口输出“Task2Running”、“Task2挂起“后,挂起task2任务,然后每隔500ms输出“LED翻转”,等待3秒后输出“Task2恢复”,但是Task1优先级比Task2高所以先输出“LED翻转”、再输出“Task2Running”、“Task2挂起“。
至此,手把手教学STM32 HAL库+FreeRTOS之任务管理(2)结。