1、任务的基本概念
从系统的角度看,任务是竞争系统资源的最小运行单元。
FreeRTOS 是一个支持多任务的操作系统,在 FreeRTOS 中,任务可以使用或等待 CPU 、使用内存空间等系统资源,并独立于其他任务运行。
每个任务在自己的环境中运行,在任何时刻,只有一个任务得到运行, FreeRTOS 调度器决定运行哪个任务。调度器会不断的启动、停止每一个任务(这个过程很快),宏观上看,所有的任务都在同时进行。
在 FreeRTOS 中,每个任务都有自己的栈空间(一段连续的内存),用于保存任务运行环境。任务越多,需要的栈空间就越大,而一个系统能运行多少个任务,取决于系统可用的内存。
任务通常会运行在一个死循环中,不会退出,如果不需要某个任务,可以调用 FreeRTOS 中的删除任务 API 函数将任务删除,释放系统资源。
2、任务状态的概念
FreeRTOS 系统中的任务有四种状态:
口 Running 一运行态
当任务处于实际运行时被称之为运行态,即 CPU 的使用权被这个任务占用。
□ Ready ﹣就绪态
处于就绪态的任务是指那些能够运行(没有被阻塞和挂起),但是当前没有运行的任务,因为同优先级或更高优先级的任务正在运行。
Blocked ﹣阻塞态
由于等待信号量,消息队列,事件标志组等而处于的状态被称之为阻塞态,另外任务调用延迟函数也会处于阻塞态。
□ Suspended 一挂起态
类似阻塞态,通过调用函数 vTaskSuspend ()对指定任务进行挂起,挂起后这个任务将不被执行,只有调用函数 xTaskResume ()才可以将这个任务从挂起态恢复。
3.任务状态的切换
后续讲解的任务状态函数参考此图分析
4.系统启动
使用此函数启动FreeRTOS调度:
void vTaskStartScheduler(void);
下图为使用cubemx创建freertos的调度任务函数。
5.空闲任务
空闲任务是FreeRTOS系统中没有其他任务运行时自动进入的系统任务,不需要用户创建,启动调度器时,调度器会自动创建空闲任务。
空闲任务的作用:
- 执行删除任务时,系统并不会立即释放任务的内存空间,只会将任务添加到结束列表中,真正的系统资源回收工作在空闲任务中完成。这里又有1点要说明:第一种情况:当任务删除自己时,即自杀,这时必须要有空闲任务来清理内存(抽象理解:你这个任务都自杀了,还怎么清理自己的尸体,必须由其他任务来清理);第二种情况:当任务是被其他任务调用删除函数删除,即被杀时,这时是在vTaskDelete函数内部清理内存(由凶手调用这个函数来清理)
- 可以在空闲任务中实现低功耗功能
6.任务创建
创建任务的方式:
静态创建任务:xTaskCreateStatic(),需要自行定义任务栈空间与任务控制块,一般不采用,不作介绍。
动态创建任务:xTaskCreate(),系统动态分配任务栈空间与任务控制块。
函数原型:
举例:
STM32cubeMX自动创建:
7.任务删除
函数原型:
void vTaskDelete(TaskHandle_t xTask) 参数为某一需要删除任务的句柄。
举例:
这里插空简单讲述一下句柄,这里的句柄可以看作是指向任务控制块的指针(空类型),任务控制块是一个结构体,用来控制任务参数等。创建任务后句柄指向任务控制块(句柄需要先定义),就可以操作任务了。
8.任务挂起
函数原型:
void vTaskSuspend(TaskHandle_t xTaskToSuspend) 参数为需要挂起任务的句柄。
举例:
9.任务恢复(分为普通恢复和中断恢复方式,这里只讲普通恢复方式)
函数原型:
void vTaskResume(TaskHandle_t xTaskToResume) 参数为需要恢复任务的句柄。
举例:
实例编程
配置cubeMX
手动创建按键任务:
自动创建的4个任务分别为:3个LED灯的闪烁和一个串口打印检测任务(用来打印检测各任务在CPU的占用率) ,按键任务为分别检测4个按键的电平状态,控制LED2_Task任务的创建、删除、挂起与恢复功能,这里就不再列举出代码了。