任务挂起和恢复
1. 任务挂起和恢复API函数
- vTaskSuspend()函数:将任务置于挂起状态
void vTaskSuspend(TaskHandle_t xTaskToSuspend)
参 数:xTaskToSuspend 要挂起的任务的任务句柄
返 回 值:无
- vTaskResume()函数:将任务从挂起状态恢复到就绪态
void vTaskResume(TaskHandle_t xTaskToResume)
参 数:xTaskToResume 要恢复的任务的任务句柄
返 回 值:无
2. 任务挂起和恢复函数源码分析
void vTaskSuspend(TaskHandle_t xTaskToSuspend){
TCB_t *pxTCB;
taskENTER_CRITICAL();
{
pxTCB = prvGetTCBFromHandle(xTaskToSuspend);
if(uxListRemove(&(pxTCB->xStateListItem)) == (UBaseType_t)0){
taskRESET_READY_PRIORITY(pxTCB->uxPriority);
}
else{
mtCOVERAGE_TEST_MARKER();
}
if(listLIST_ITEM_CONTAINER(&(pxTCB->xEventListItem))!=NULL){
(void) uxListRemove(&(pxTCB->xEventListItem));
}
else{
mtCOVERAGE_TEST_MARKER();
}
vListInsertEnd(&xSuspendedTaskList, &(pxTCB->xStateListItem));
}
taskEXIT_CRITICAL();
if(xSchedulerRunning != pdFALSE){
taskENTER_CRITICAL();
{
prvResetNextTaskUnblockTime();
}
taskEXIT_CRITICAL();
}
else{
mtCOVERAGE_TEST_MARKER();
}
if(pxTCB == pxCurrentTCB){
if(xSchedulerRunning != pdFALSE){
configASSERT( uxSchedulerSuspended == 0 );
portYIELD_WITHIN_API();
}
else{
if(listCURRENT_LIST_LENGTH(&xSuspendedTaskList) == uxCurrentNumberOfTasks){
pxCurrentTCB = NULL;
}
else{
vTaskSwitchContext();
}
}
}
else{
mtCOVERAGE_TEST_MARKER();
}
}
void vTaskResume(TaskHandle_t xTaskToResume){
TCB_t * const pxTCB = (TCB_t *) xTaskToResume;
configASSERT( xTaskToResume );
if(( pxTCB != NULL ) && ( pxTCB != pxCurrentTCB )){
taskENTER_CRITICAL();
{
if(prvTaskIsTaskSuspended(pxTCB) != pdFALSE){
(void) uxListRemove(&( pxTCB->xStateListItem));
prvAddTaskToReadyList( pxTCB );
if(pxTCB->uxPriority >= pxCurrentTCB->uxPriority){
taskYIELD_IF_USING_PREEMPTION();
}
else{
mtCOVERAGE_TEST_MARKER();
}
}
else
{
mtCOVERAGE_TEST_MARKER();
}
}
taskEXIT_CRITICAL();
}
else{
mtCOVERAGE_TEST_MARKER();
}
}
3. 任务挂起和恢复函数实例
使用STM32CubeMX可以非常方便的将FreeRTOS移植到工程中。本实验就是利用STM32CubeMX移植FreeRTOS,并创建三个任务:
Led_Task:D2指示灯闪烁
Usart_Task:每隔1s向串口输出字符串
Key_Task:按下K_UP,挂起Led_Task任务;按下K_DOWN,恢复Led_Task任务
3.1 STM32CubeMX设置
- RCC设置外接HSE,时钟设置为72M
- PC1设置为GPIO推挽输出模式、上拉、高速、默认输出电平为高电平
- PA0设置为GPIO输入模式、下拉模式;PE2/PE3/PE4设置为GPIO输入模式、上拉模式
- USART1选择为异步通讯方式,波特率设置为115200Bits/s,传输数据长度为8Bit,无奇偶校验,1位停止位
- 激活FreeRTOS,添加任务,设置任务名称、优先级、堆栈大小、函数名称等参数
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210104223126573.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NodWFuZ2tlX0FuZHk=,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210104223502179.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NodWFuZ2tlX0FuZHk=,size_16,color_FFFFFF,t_70)
- 使用FreeRTOS操作系统,一定要将HAL库的Timebase Source从SysTick改为其他定时器,选好定时器后,系统会自动配置TIM
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210105112028414.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NodWFuZ2tlX0FuZHk=,size_16,color_FFFFFF,t_70#pic_center)
- 输入工程名,选择路径(不要有中文),选择MDK-ARM V5;勾选Generated periphera initialization as a pair of ‘.c/.h’ files per IP ;点击GENERATE CODE,生成工程代码
3.2 MDK-ARM软件编程
- 创建按键驱动文件key.c和key.h,参考按键输入例程
- 添加Led_Task、Usart_Task和Key_Task任务函数代码
void Led_Task(void const * argument){
for(;;){
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_RESET);
osDelay(500);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);
osDelay(500);
}
}
void Usart_Task(void const * argument){
for(;;){
printf("UsartTask is Runing!\r\n");
osDelay(1000);
}
}
void KeyTask(void const * argument){
uint8_t key = 0;
for(;;){
key = KEY_Scan(0);
switch(key){
case KEY_UP_PRES:
vTaskSuspend(Led_TaskHandle);
printf("Led_Task被挂起!\r\n");
key = 0;
break;
case KEY_DOWN_PRES:
vTaskResume(Led_TaskHandle);
printf("Led_Task被恢复!\r\n");
key = 0;
break;
}
osDelay(10);
}
}
3.3 下载验证
编译无误下载到开发板后,D2指示灯闪烁表示程序正常运行。打开串口调试助手,可以看到串口每隔1s输出相应字符;按下K_UP按键,Led_Task被挂起,D2指示灯停止闪烁,按下K_DOWN按键,Led_Task任务恢复,D2指示灯开始闪烁
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210105112327126.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NodWFuZ2tlX0FuZHk=,size_16,color_FFFFFF,t_70#pic_center)
关注我的公众号,在公众号里发如下消息,即可获取相应的工程源代码:
FreeRTOS任务挂起和恢复实例
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201126102636752.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NodWFuZ2tlX0FuZHk=,size_16,color_FFFFFF,t_70#pic_center)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)