FreeRTOS学习笔记——FreeRTOS任务挂起和恢复实验

6.4 任务挂起和恢复API 函数
有时候我们需要暂停某个任务的运行,过一段时间以后在重新运行。这个时候要是使用任务删除和重建的方法的话那么任务中变量保存的值肯定丢失了!FreeRTOS 给我们提供了解决这种问题的方法,那就是任务挂起和恢复,当某个任务要停止运行一段时间的话就将这个任务挂起,当要重新运行这个任务的话就恢复这个任务的运行。FreeRTOS 的任务挂起和恢复API 函数如表6.2.1.1 所示:


1、函数vTaskSuspend()
此函数用于将某个任务设置为挂起态,进入挂起态的任务永远都不会进入运行态。退出挂起态的唯一方法就是调用任务恢复函数vTaskResume()或xTaskResumeFromISR()。,函数原型如下:

void vTaskSuspend( TaskHandle_t xTaskToSuspend)
参数:
xTaskToSuspend: 要挂起的任务的任务句柄,创建任务的时候会为每个任务分配一个任务句柄。如果使用函数xTaskCreate()创建任务的话那么函数的参数pxCreatedTask 就是此任务的任务句柄,如果使用函数xTaskCreateStatic()创建任务的话那么函数的返回值就是此任务的任务句柄。也可以通过函数xTaskGetHandle()来根据任务名字来获取某个任务的任务句柄。注意!如果参数为NULL 的话表示挂起任务自己。

返回值:
无。
2、函数vTaskResume()
将一个任务从挂起态恢复到就绪态,只有通过函数vTaskSuspend()设置为挂起态的任务才可以使用vTaskRexume()恢复!函数原型如下:

void vTaskResume( TaskHandle_t xTaskToResume)
参数:
xTaskToResume: 要恢复的任务的任务句柄。
返回值:
无。
3、函数xTaskResumeFromISR()

此函数是vTaskResume()的中断版本,用于在中断服务函数中恢复一个任务。函数原型如下:

BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume)
参数:
xTaskToResume: 要恢复的任务的任务句柄。
返回值:
pdTRUE: 恢复运行的任务的任务优先级等于或者高于正在运行的任务(被中断打断的任务),这意味着在退出中断服务函数以后必须进行一次上下文切换。pdFALSE: 恢复运行的任务的任务优先级低于当前正在运行的任务(被中断打断的任务),这意味着在退出中断服务函数的以后不需要进行上下文切换。

6.5 任务挂起和恢复实验
6.5.1 实验程序设计
1、实验目的
学习使用FreeRTOS 的任务挂起和恢复相关API 函数,包括vTaskSuspend()、vTaskResume()和xTaskResumeFromISR()。
2、实验设计
本实验设计4 个任务:start_task、key_task、task1_task 和task2_task,这四个任务的任务功能如下:
start_task:用来创建其他3 个任务。
key_task: 按键服务任务,检测按键的按下结果,根据不同的按键结果执行不同的操作。
task1_task:应用任务1。
task2_task: 应用任务2。
实验需要四个按键,KEY0、KEY1、KEY2 和KEY_UP,这四个按键的功能如下:

KEY0: 此按键为中断模式,在中断服务函数中恢复任务2 的运行。
KEY1: 此按键为输入模式,用于恢复任务1 的运行。
KEY2: 此按键为输入模式,用于挂起任务2 的运行。
KEY_UP: 此按键为输入模式,用于挂起任务1 的运行。
3、实验工程

FreeRTOS 实验6-3 FreeRTOS 任务挂起和恢复实验。

点击下载代码

4、实验程序与分析
● 任务设置
实验中任务优先级、堆栈大小和任务句柄等的设置如下:


● main()函数



在main 函数中我们主要完成硬件的初始化,在硬件初始化完成以后创建了任务start_task()并且开启了FreeRTOS 的任务调度。

● 任务函数





(1)、start_task 任务,用于创建其他3 个任务。
(2)、在key_tssk 任务里面,KEY_UP 被按下,调用函数vTaskSuspend()挂起任务1。
(3)、KEY1 被按下,调用函数vTaskResume()恢复任务1 的运行。
(4)、KEY2 被按下,调用函数vTaskSuspend()挂起任务2。
(5)、任务1 的任务函数,用于观察任务挂起和恢复的过程。
(6)、任务2 的任务函数,用于观察任务挂起和恢复的过程(中断方式)。

● 中断初始化及处理过程




(1)、设置中断优先级,前面在讲解FreeRTOS 中断的时候就讲过,如果中断服务函数要使用FreeRTOS 的API 函数的话那么中断优先级一定要低于configMAX_SYSCALL_INTERRUPT_PRIORITY!这里设置为6。
(2)、调用函数xTaskResumeFromISR()来恢复任务2 的运行。
(3)、根据函数xTaskResumeFromISR()的返回值来确定是否需要进行上下文切换。当返回值为pdTRUE 的时候就需要调用函数portYIELD_FROM_ISR()进行上下文切换,否则的话不需要。
6.5.2 程序运行结果分析
编译并下载程序到开发板中,通过按不同的按键来观察任务的挂起和恢复的过程,如图

6.5.2.1 所示:


图6.5.2.1 程序运行结果

从图6.5.2.1 可以看出,一开始任务1 和任务2 都正常运行,当挂起任务1 或者任务2 以后任务1 或者任务2 就会停止运行,直到下一次重新恢复任务1 或者任务2 的运行。重点是,保存任务运行次数的变量都没有发生数据丢失,如果用任务删除和重建的方法这些数据必然会丢失掉的!


猜你喜欢

转载自blog.csdn.net/tichimi3375/article/details/80671840