任务状态
在freertos里任务状态可大致分为四类:
运行态,就绪态,阻塞态,挂起态。
任务在创建完成并退出临界区后,各任务进入到就绪态①,最高优先级的首先运行进入到运行态开始运行②,其他任务仍为就绪态。当任务遇到延时,或者需要等待信号量,事件通知需要等待的时候,这时运行态的任务转到阻塞态④。次优先级高的任务接着运行进入到运行态②。当处于阻塞态的高优先级任务被唤醒(延时时间达到或有信号释放)进入到就绪态⑤,由于优先级比正在运行的任务要高,所以会立即抢占CPU进行运行,而被抢占的任务则回到就绪态③,等待高优先级任务被阻塞或挂起再继续运行。处在运行态的任务可以通过函数将自己和其他任务给挂起⑥⑦⑧,和退出挂起态的任务退出后处于就绪态。
就绪态:处在就绪态的任务具备运行的能力和条件,但还没挨到他运行。
(FreeRTOS属于伪并发的,是基于时间片轮转的并发模型,微观上还是同一时间只能运行一个任务,只是多个任务每运行一个时间片就进行来回的切换,宏观上看起来像是多个任务一块运行的。)
运行态:获得 CPU使用权,正在运行的任务。
阻塞态:正在运行的任务,因延时一段时间或等待外部事件发生,而处于阻塞的状态。
挂起态:通过函数 vTaskSuspend()和 vTaskResums()进入和退出挂起态与阻塞态一样,处于挂起态的任务也无法被运行。
任务优先级:FreeRTOS任务优先级和他的数值成正比。数值越大,对应的任务优先级也越高。
API函数
创建
动态创建:
BaseType_t xTaskCreate(
TaskFunction_t pxTaskCode,
const char * const pcName,
const configSTACK_DEPTH_TYPE usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pxCreatedTask);
参数一; 指向任务函数的指针(任务函数的名称)
参数二:任务名称
参数三:任务堆栈大小,单位:字
参数四:传给任务函数的参数。没有填NULL
参数五:任务优先级
参数六:任务句柄
通常在前面使用define进行定义如:
//任务优先级
#define START_TASK_PRIO 1
//任务堆栈大小
#define START_STK_SIZE 70
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);
删除
被删除的任务将被从就绪态任务列表、阻塞态任务列表、挂起态任务列表和事件列表中移除。(注:在任务被删除之前要把手动申请的内存给提前释放调,否则会导致内存泄漏。系统分配的内存则会由空闲任务自动释放)
void vTaskDelete(TaskHandle_t xTaskToDelete);
参数:要删除的任务句柄。NULL:删除自身。
挂起
被挂起的任务不再参与任务调度,不占用CPU资源。直到退出。
任务中:
void vTaskSuspend(xTaskToSuspend)
参数:要挂起的任务句柄。
中断中:
xTaskResumeFromISR(xTaskToSuspend)
参数:要挂起的任务句柄。
恢复
不论一个任务被函数 vTaskSuspend()挂起多少次,只需要使用函数
vTakResumeFromISR()恢复一次,就可以继续运行。
任务中:
void vTaskResume(TaskHandle_t xTaskToResume)
参数:要恢复的任务句柄。
恢复全部任务:
void vTaskResumeAll(void)
中断中:
BaseType_t xTaskResumeFromISR(TaskHandle_t xTaskToResume)
参数:要恢复的任务句柄。
返回值:pdTRUE:恢复任务的优先级比正在运行的高或相等时。(需要进行上下文切换)
pdFALSE:恢复任务的优先级比正在运行的低时。(不需要进行上下文切换)
暂停
暂停任务调度器:
void vTaskSuspendAll(void)
执行完这句函数后,程序将关闭系统中的任务调度器不再进行任务间的调度,使程序一直运行在该任务中,保护共享资源。
退出暂停任务调度器:
void xTaskResumeAll(void)
可通过该函数来重新开启任务调度器,使任务可以正常的进行切换。
切换
void taskYLELD(void)
在同优先级使用时间片调度模式时,执行该函数可以使任务退出本次的CPU使用权,让给其他任务,进行任务间的切换。
延时
相对延时,延时时间受多种因素影响。可以理解为执行到这个函数时,任务进入到阻塞状态,经过xTicksToDelay 个节拍后任务退出阻塞,进入到就绪态,等待任务调度。如果此时有比他任务优先级高的任务在运行或等待,那么即使他延时时间到了也不会立即运行而是等待比他优先级高的任务都运行完才会继续运行。
void vTaskDelay( const TickType_t xTicksToDelay )
参数:延时时间
延时的时间单位为系统时钟节拍,系统时钟节拍的长短取决于FreeRTOSConfig.h 文 件 中 的 配 置 项configTICK_RATE_HZ 的大小,一般configTICK_RATE_HZ 为1000,换算一个时钟节拍等于1毫秒。