目录
一、任务概念
二、系统启动与空闲任务
三、任务创建
四、任务删除
五、任务挂起
六、任务恢复(普通模式和中断模式)
七、任务管理编程实战
一、任务概念
1、任务的基本概念
从系统的角度看,任务是竞争系统资源的最小运行单元
FreeRTOS是一个支持多任务的操作系统,在FreeRTOS中,任务可以使用或等待CPU,使用内存空间等系统资源,并独立于其他任务运行
每个任务在自己的环境中运行,在任何时刻,只有一个任务得到运行,FreeRTOS调度器决定运行哪个任务,调度器会不断的启动,停止每个任务,宏观上看每个任务都在同时运行
在FreeRTOS中,每个任务都有自己的栈空间(一段连续的内存)用于保存任务运行环境,任务越多,需要的栈空间就越大,而一个系统能运行多少个任务,主要取决于系统可用的内存
任务通常会运行在一个死循环,不会退出,如果不需要某个任务,可以调用FreeRTOS中的删除任务API函数将任务删除,释放系统资源
2、任务状态的概念
FreeRTOS系统中的任务有四种状态:
Running -- 运行态
当任务处于实际运行时被称之为运行态,即CPU的使用权被这个任务占用
Ready -- 就绪态
处于就绪态的任务是指那些能够运行(没有被阻塞和挂起)但是当前没有运行的任务,因为同优先级或者更高优先级的任务正在运行
Blocked -- 阻塞态
由于等待信号量,消息队列,事件标志组等而处于的状态被称之为阻塞态,另外任务调用延迟函数也会处于阻塞态
Suspenede -- 挂起态
类似阻塞态,通过调用函数 vTaskSuspend() 对指定任务进行挂起,挂起后这个任务将不被执行,只有调用 vTaskResume() 才可以将这个任务重新恢复
二、系统启动与空闲任务
1、系统启动
使用如下函数启动FreeRTOS调度
vTaskStartScheduler()
函数描述 :函数vTaskStartScheduler用于启动FreeRTOS调度器,既启动FreeRTOS的多任务执行
使用这个函数要注意以下几个问题
1、空闲任务和可选的定时器任务是在调用这个函数后自动创建的
2、正常情况下这个函数是不会被返回的,如果有返回,极有可能是用于定时器任务或空闲任务的内存空间不足造成创建失败,此时需要加大FreeRTOS可管理的内存空间
2、空闲任务
空闲任务是FreeRTOS系统中没有其他任务运行时自动进入的系统任务,不需要用户创建,启用调度器时,调度器会自动创建空闲任务
空闲任务的作用:
1、执行删除任务时,系统并不会立即释放任务的内存空间,只会将任务添加到结束列表中,真正的系统资源回收工作会在空闲任务中完成
2、可以在空闲任务中实现低功耗功能,后续会详细讲解
三、任务创建
创建任务的方式:
1、静态创建任务,xTaskCreateStatic(),需要自行定义任务栈空间与任务控制块,一般不采用
2、动态创建任务,xTaskCreate(),系统动态分配任务栈空间与任务控制块,应采用此办法
动态创建任务函数详解
函数 xTaskCreate() 用于实现FreeRTOS的任务创建,还可以自定义栈的大小
这个函数总共需要填六个参数
第一个参数:创建任务的函数名
第二个参数:任务名,主要用于调试时方便看是哪个任务
第三个参数:任务栈大小,单位word,也就是四字节
第四个参数:创建的任务函数的形参
第五个参数:定义任务优先级
第六个参数:任务句柄,用于区分不同的任务
四、任务删除
删除任务函数详解
使用这个函数要注意以下问题
1、使用此函数需要在 FreeRTOSConfig.h 配置文件中配置如下宏定义为1
#define INCLUDE_vTaskDelete 1
2、如果用往此函数里填的任务ID是NULL,既数值为0的话,那么删除的就是当前正在执行的任务,此任务被删除后,FreeRTOS会被切换到任务就绪列表里面下一个要执行的最高优先级任务
3、在FreeRTOS中,创建任务所需要的内存需要在空闲任务中释放,如果用户在FreeRTOS中调用了这个函数的话,一定要让空闲任务有执行的机会,否则这部分内存无法释放,另外,创建的这个任务在使用中申请了动态内存,这个内存不会因任务被删除而释放,这一点要注意,一定要在删除任务前将内存释放
4、注意要判断任务是否存在,如果不存在再去删除任务的话会出现错误
五、任务挂起
任务挂起函数详解
使用这个函数要注意以下问题
1、使用此函数需要在FreeRTOSConfig.h中配置如下宏定义为1
#define INCLUDE_vTaskSuspend 1
如果用往此里面填的任务ID是NULL,既数值为0的话,那么挂起的就是当前正在执行的任务,此任务被挂起之后,FreeRTOS会切换到任务就绪的列表里面下一个要执行的高优先级任务
3、多次调用此函数的话,只需要调用一次 vTaskResume 即可将任务从挂起态恢复
六、任务恢复(普通模式和中断模式)
普通模式恢复任务函数详解
使用这个函数需要注意以下问题
1、使用此函数需要在FreeRTOSConfig.h中配置如下宏定义为1
#define INCLUDE_vTaskSuspen 1
2、多次调用函数 vTaskSuspend 的话,只需要调用一次 vTaskResume 即可将任务恢复
3、此函数是用于任务代码中调用的,故不可以在中断服务程序中调用此函数,中断服务程序中使用的 xTaskResumeFromISR() 以后缀 FromISR 结尾
中断方式恢复函数详解
使用这个函数要注意以下问题
1、使用此函数需要在FreeRTOSConfig.h配置如下宏定义为1
#define INCLUDE_xResumeFromISR 1
2、多次调用函数 vTaskSuspend 的话,只需要调用一次 vTaskResumeFromISR 即可恢复任务
3、如果用户打算采用这个函数实现中断与任务的同步,要注意一种情况,如果此函数的调用优先于函数 vTaskSuspend 被调用,那么此次同步会丢失,这种情况下建议使用信号量来实现同步
4、此函数是用于中断服务程序中调用的,故不可以在任务中使用此函数,任务中使用的vTaskResume
七、任务管理编程实战
1、创建工程
打开STM32CubeMX 选择FreeRTOS 在 Config parameters 中找到 Memory management settings
设置为动态内存,栈大小设为10k,剩下默认就行
接下来我们点击 Tasks and Queues 创建三个任务,一个用于打印我们任务状态,其他两个设置为LED闪烁任务,STM32CubeMX我们就用到这里,接下来我们手动创建关于KEY按键的任务,打印任务的栈空间要大一些
首先我们需要定义我们的句柄,然后声明我们任务的函数
接下来我们手动配置函数
接下来我们编写一段按键删除与恢复任务的代码,我这里没有展示全部功能,同学们可以自己尝试,我这里按键也没有消抖,仅供参考