FreeRTOS实用指南内容总结(一)

第一章 任务管理

  1. 任务函数

函数返回值和传参都是void,函数原型void ATaskFuncton(void *pvParameters);

任务函数都是独立执行实例,拥有属于自己的栈空间。

可以调用vPrintString(pcTaskName);打印出任务名进行调试。

  1. 顶层任务状态

任务分为两种状态:运行状态和非运行状态,处理起执行的是运行状态。非运行状态还有其他状态,后面讲。

  1. 创建任务

portBASE_TYPE xTaskCreate ( 指向任务函数的指针,任务的文本名字,栈深度,任务参数,优先级,任务句柄);

创建的任务需要开启调度器后,任务开始执行。

vTaskStartScheduler();

  1. 任务优先级

原则:处于就绪状态的高优先级任务永远先执行。

优先级号小表示任务的优先级低,有效的优先级号范围从0到(config MAX_PRIORITES-1)

每个任务的运行都有时段称为时间片,调度器需要在每个时间片的结束时刻运行自己本身,称为心跳,可以在configTICK_RATE_HZ进行配置/

portTick_RATE_MS用于将以心跳为单位的时间值转化为毫秒。

  1. 扩充“非运行态”

阻塞状态两大事件:

定时时间——可以延时到期-vTaskDelay()或是绝对时间到点-vTaskDelayUntil()

这两个函数最大的区别在于vTaskDelayUntil有时间戳,延迟的更近准,但不代表执行的更精准。

阻塞任务的目的是为了不占用CPU资源,提高CPU利用率。

同步时间——源于其他任务或中断的事件

挂起状态:此状态调度器不可见,唯一调用途径vTaskSuspend();vTaskResume()或vTaskResumeFromISR()

就绪状态:处于就绪态的任务能被运行,但尚未运行。因为存在优先级高的任务在运行。

完整的任务状态机

FreeRTOS实用指南内容总结(一)_第1张图片

  1. 空闲任务与空闲钩子函数

空闲任务优先级最低,不妨碍其他任务的前提下,不让CPU真的闲下来,因为CPU总要干点儿事情。

空闲任务钩子函数vApplicationIdleHook()被用于:

执行低优先级,后台或需要不停处理的功能码;

测试系统处理裕度;

将处理起配置到低功耗模式。

  1. 改变任务优先级

void vTaskPrioritySet(任务句柄,新的优先级号);

查询一个任务的优先级uxTaskPriorityGet(任务的句柄)

这里提一下任务句柄,任务句柄一般是个指针的指针,通过任务句柄可以获得任务的整个信息

,可以传入NULL值都是对本任务进行操作

调度器总是在所有就绪任务中选择具有最高优先级的任务,并使其进入运行状态。

  1. 删除任务

vTaskDelete(任务句柄)

空闲任务负责将任务给已删除的内存释放掉,也就是说删除任务这个API,也需要给空闲任务留执行时间。

  1. 调度算法-简述

固定优先级,是指每个任务被赋予一个优先级,优先级不能被内核本身改变。

抢占式优先级,当任务进入就绪或优先级被改变时,如果处于运行态的优先级更低,侧该任务总是抢占当前的运行任务。

单调速率调度,根据任务周期执行的速率来分配一个唯一的优先级,最大化整个应用调度性,但运行时间不定,除非所有任务都有周期性。

抢占式调度,协作式调度器,只能在运行态任务进入阻塞态或运行态让你无显式调用taskYIELD()时,才能进行上下文切换,任务永远不会被抢占,而具有相同优先级的任务也不会自动共享处理器时间。写作式调度的工作方式比较简单,可能会导致系统相应不够快。

混合调度方案,需要在中断服务例程中显式地进行上下文切换,从而允许同步时间产生抢占行为,但时间事件却不行。

你可能感兴趣的:(FreeRTOS,单片机,嵌入式实时数据库)