一、单任务系统和多任务系统
单任务系统一般为裸机系统,while(1)做一个大循环,也包含一些中断,完成所有的程序逻辑处理。如果应用程序需求繁多,程序设计复杂,应考虑多任务系统。
多任务系统在操作系统基础上实现,可将繁杂的应用程序“分而治之”,将大问题划分为多个小问题,由不同的任务去解决,可以认为它们是并发运行的(其实是多个任务轮转运行,每个任务执行时间很短),RTOS中有一个任务调度器决定哪个任务先运行,哪个后运行。
二、FreeRTOS任务特点:
在程序设计中,一个应用业务可以单独作为一个任务,每个任务都拥有自己独立的运行环境,不依赖于其他任务,一个时刻同时只有一个任务在运行,由任务调度器决定哪个任务运行。在调度过程中,任务调度器需保证一个任务在开始运行时,其上下文环境与任务上一次退出的时候相同。故,每个任务都必须有独立的堆栈保存上下文环境。
任务支持抢占/优先级/独立的堆栈。
三、任务的状态
FreeRTOS任务的状态有4种:运行态,就绪态,阻塞态,挂起态。
- 运行态
该任务正在运行,正占用处理器。
2. 就绪态
指已经准备好运行的任务(没有被挂起或阻塞),就绪态还没有运行,在等待同优先级任务或者更高优先级任务让出处理器。
3. 阻塞态
任务在等待某个外部事件,处于阻塞状态。如任务调用vTaskDelay(),在等待延时完成,等待队列/信号量/事件组/通知/互斥信号量等,阻塞态会有超时时间,超过改时间,退出阻塞态。
4. 挂起态
与阻塞态类似,进入挂起态也不能被调用进入运行态,但是挂起态没有超时时间,调用vTaskSuspend()和xTaskResume()使任务进入和退出挂起态。
状态之间转换如下图:
每个任务都有优先级,0~(configMAX_PRIOIRTES-1),0的优先级最低,FreeRTOS调度器确保处于就绪态的最高优先级任务优先执行,当宏configUSE_TIME_SLICING定义为1时,多个任务可以使用相同优先级,数量不限,对于处于就绪态的优先级相同的任务,将由时间片轮转调度器决定谁先运行。
四、任务的创建
FreeRTOS中创建任务使用xTaskCreate()或者xTaskCreateStatic()来创建任务,
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
const char * const pcName, const configSTACK_DEPTH_TYPE usStackDepth,
void * const pvParameters,