目录
说明:
一、任务挂起与恢复
1.1、什么是任务挂起
1.2、任务挂起函数
1.3、什么是任务恢复
1.4、任务恢复函数
1.5、什么是中断任务恢复函数
1.6、中断任务恢复函数
二、任务挂起与恢复实例代码(任务中)
2.1、主要代码
2.2、结果
三、任务挂起与恢复实例代码(中断中)
3.1、主要代码
3.2、结果
说明:
关于内容:
1)以下内容多为概念了解与步骤分析
2)暂无个人示例代码,使用的是FreeRTOS的示例代码
3)若想移植代码测试的,请移步其它地方寻找,下文内容暂无个人示例代码供测试
关于其它:
1)操作系统:win 10
2)平台:keil 5 mdk
3)语言:c语言
4)板子:STM32系列移植FreeRTOS
一、任务挂起与恢复
1.1、什么是任务挂起
1)任务挂起,含义:任务挂起相当于暂停,把任务挂起了,任务就暂停运行,是可以恢复的。
2)任务挂起内部实现:
1、根据任务句柄获取任务控制块,如果任务句柄为NULL,表示挂起任务自身
2、将要挂起的任务从相应的状态列表和事件列表中移除
3、将待挂起任务的任务状态列表向插入到挂起态任务列表末尾
4、判断任务调度器是否运行,在运行,更新下一次阻塞时间,防止被挂起任务为下一次阻塞超时任务调度器正在运行,强制进行一次任务切换;
5、如果挂起的是任务自身调度器正在运行,强制进行一次任务切换;
调度器没有运行,判断挂起任务数是否等于任务总数:
是:代表所有任务均被挂起,则当前控制块赋值为NULL,调度器没有运行,判断挂起任务数是否等于任务总数,
否:通过函数vTaskSwitchContext寻找下一个最高优先级任务
1.2、任务挂起函数
1)函数原型:void vTaskSuspend(TaskHandle_t xTaskToSuspend)
2)形参描述:xTaskToSuspend是待挂起任务的任务句柄
3)使用条件:此函数用于挂起任务,使用时需将宏INCLUDE_ vTaskSuspend 配置为1
4)使用说明:无论优先级如何,被挂起的任务都将不再被执行,直到任务被恢复
5)注意点:当传入的参数为NULL, )则代表挂起任务自身当前正在运行的任务))
1.3、什么是任务恢复
1)任务恢复,含义:恢复被挂起的任务。
2)任务恢复内部实现:
1、恢复任务不能是正在运行任务且不能为NULL
2、判断任务是否被挂起,是:就会将该任务在挂起列表中移除,将该任务添加到就绪列
表中
3、判断恢复的任务优先级是否大于当前正在运行的是的话执行任务切换
1.4、任务恢复函数
1)函数原型:void vTaskResume(TaskHandle_t xTaskToResume)
2)形参描述:xTaskToResume,待恢复任务的任务句柄
3)使用条件:宏定义INCLUDE _vTaskSuspend必须定义为1
4)使用说明:注意:任务无论被yTaskSuspend挂起多少次,只需在任务中调vTakResume()恢复一次, 就可以继续运行。且被恢复的任务会进入就绪态! )
1.5、什么是中断任务恢复函数
中断任务恢复函数,含义:在中断服务函数中,恢复被挂起的任务函数。
1.6、中断任务恢复函数
1)函数原型: BaseType _t xTaskResumeFromlSR(TaskHandle_t xTaskToResume)
2)形参描述:xTaskToResume,待恢复任务的任务句柄
3)使用条件:宏定义 INCLUDE _vTaskSuspene和INCLODE_ xTaskResumeFromISR必须定义为 1
4)使用说明:必须是在中断服务函数中调用该函数5)返回值描述:返回值为pdTRUE,任务恢复后需要进行任务切换;返回值为pdFALSE,任务恢复后不需要进行任务切换;注意:任务切换是需要我们手动进行的,需要调用切换函数:
6)注意点:中断服务函数中调用FreeRTOS的API函数则中断优先级不能高于FreeRTOS所管理的最高优先级
二、任务挂起与恢复实例代码(任务中)
2.1、主要代码
板子不在身边,无法测试,之后补上。
FreeRTOS任务挂起函数官网用法示例:
void vAFunction( void ) {TaskHandle_t xHandle; //定义任务句柄// Create a task, storing the handle.xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );//创建了一个任务// ...// Use the handle to suspend the created task.vTaskSuspend( xHandle ); //调用挂起任务,传入要挂起任务的句柄// ...// The created task will not run during this period, unless// another task calls vTaskResume( xHandle ).//...// Suspend ourselves.vTaskSuspend( NULL ); //传入NULL,挂起正在运行的任务自身// We cannot get here unless another task calls vTaskResume// with our handle as the parameter.}
FreeRTOS任务恢复官方示例:
void vAFunction( void ) {TaskHandle_t xHandle;// Create a task, storing the handle.//先创建任务xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );// ...// Use the handle to suspend the created task.//挂起任务vTaskSuspend( xHandle );// ...// The created task will not run during this period, unless// another task calls vTaskResume( xHandle ).//...// Resume the suspended task ourselves.//恢复被挂起的任务vTaskResume( xHandle );// The created task will once again get microcontroller processing// time in accordance with its priority within the system.}
2.2、结果
板子不在身边,无法测试,之后补上。
三、任务挂起与恢复实例代码(中断中)
3.1、主要代码
板子不在身边,无法测试,之后补上。
FreeRTOS任务恢复函数官网用法示例(中断中):文章来源:https://www.toymoban.com/news/detail-594460.html
TaskHandle_t xHandle; //定义任务句柄 void vAFunction( void ) { // Create a task, storing the handle. xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); // ... Rest of code. } void vTaskCode( void *pvParameters ) { // The task being suspended and resumed. for( ;; ) { // ... Perform some function here. // The task suspends itself. vTaskSuspend( NULL ); // The task is now suspended, so will not reach here until the ISR resumes it. } } void vAnExampleISR( void ) { BaseType_t xYieldRequired; // Resume the suspended task. xYieldRequired = xTaskResumeFromISR( xHandle ); // We should switch context so the ISR returns to a different task. // NOTE: How this is done depends on the port you are using. Check // the documentation and examples for your port. portYIELD_FROM_ISR( xYieldRequired ); }
3.2、结果
板子不在身边,无法测试,之后补上。文章来源地址https://www.toymoban.com/news/detail-594460.html
到了这里,关于FreeRTOS任务的挂起和恢复 | FreeRTOS四的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!