FreeRTOS 使用 FreeRTOSConfig.h 文件进行配置和裁剪。FreeRTOSConfig.h 文件中有几十个配置项,这使得用户能够很好地配置和裁剪 FreeRTOS。FreeRTOSConfig.h 文件中的配置项可分为三大类:“config”配置项、“INCLUDE”配置项和其他配置项
FreeRTOS 使用“INCLUDE”配置项对部分 API 函数进行条件编译,当“INCLUDE”配置
项被定义为 1 时,其对应的 API 函数则会加入编译。对于用不到的 API 函数,用户则可以将其
对应的“INCLUDE”配置项设置为 0,那么这个 API 函数就不会加入编译,以减少不必要的系
统开销。
INCLUDE_vTaskPrioritySet ?设置任务优先级
INCLUDE_uxTaskPriorityGet ?获取任务优先级
INCLUDE_vTaskDelete ?删除任务
INCLUDE_vTaskSuspend ?挂起任务
INCLUDE_xResumeFromISR ?恢复在中断中挂起的任务
INCLUDE_vTaskDelayUntil ?任务绝对延时
INCLUDE_vTaskDelay ?任务延时
INCLUDE_xTaskGetSchedulerState ?获取任务调度器状态
INCLUDE_xTaskGetCurrentTaskHandle ?获取当前任务的任务句柄
INCLUDE_uxTaskGetStackHighWaterMark ?获取任务堆栈历史剩余最小值
INCLUDE_xTaskGetIdleTaskHandle ?获取空闲任务的任务句柄
INCLUDE_eTaskGetState ?获取任务状态
INCLUDE_xEventGroupSetBitFromISR ?在中断中设置事件标志位
INCLUDE_xTimerPendFunctionCall ?将函数的执行挂到定时器服务任务
INCLUDE_xTaskAbortDelay ?中断任务延时
INCLUDE_xTaskGetHandle ?通过任务名获取任务句柄
INCLUDE_xTaskResumeFromISR ?恢复在中断中挂起的任务
“config"开始的宏,用于完成FreeRTOS的配置和裁剪
1. configUSE_PREEMPTION
????????此宏用于设置系统的调度方式。当宏 configUSE_PREEMPTION 设置为 1 时,系统使用抢
占式调度;当宏 configUSE_PREEMPTION 设置为 0 时,系统使用协程式调度。抢占式调度和
协程式调度的区别在于,协程式调度是正在运行的任务主动释放 CPU 后才能切换到下一个任
务,任务切换的时机完全取决于正在运行的任务。协程式的优点在于可以节省开销,但是功能
比较有限,现在的 MCU 性能都比较强大,建议使用抢占式调度。
2. configUSE_PORT_OPTIMISED_TASK_SELECTION
????????FreeRTOS 支持两种方法来选择下一个要执行的任务,分别为通用方法和特殊方法。
当宏 configUSE_PORT_OPTIMISED_TASK_SELECTION 设置为 0 时,使用通用方法。通
用方法是完全使用 C 实现的软件算法,因此支持所用硬件,并且不限制任务优先级的最大值,
但效率相较于特殊方法低。当宏 configUSE_PORT_OPTIMISED_TASK_SELECTION 设置为 1 时,使用特殊方法。特殊方法的效率相较于通用方法高,但是特殊方法依赖于一个或多个特定架构的汇编指令(一般是类似计算前导零[CLZ]的指令),因此特殊方法并不支持所有硬件,并且对任务优先级的最大值一般也有限制,通常为 32。
3. configUSE_TICKLESS_IDLE
????????当宏 configUSE_TICKLESS_IDLE 设置为 1 时,使能 tickless 低功耗模式;设置为 0 时,
tick 中断则会移植运行。tickless 低功耗模式并不适用于所有硬件。
4. configCPU_CLOCK_HZ
????????此宏应设置为 CPU 的内核时钟频率,单位为 Hz。
5. configSYSTICK_CLOCK_HZ
????????此宏应设置为 SysTick 的时钟频率,当 SysTick 的时钟源频率与内核时钟频率不同时才可
以定义,单位为 Hz。
6. configTICK_RATE_HZ
????????此宏用于设置 FreeRTOS 系统节拍的中断频率,单位为 Hz。
7. configMAX_PRIORITIES
????????此 宏 用 于 定 义 系 统 支 持 的 最 大 任 务 优 先 级 数 量 , 最 大 任 务 优 先 级 数 值 为
configMAX_PRIORITIES-1。
8. configMINIMAL_STACK_SIZE
????????此宏用于设置空闲任务的栈空间大小,单位为 word。
9. configMAX_TASK_NAME_LEN
????????此宏用于设置任务名的最大字符数。
10. configUSE_16_BIT_TICKS
????????此宏用于定义系统节拍计数器的数据类型,当宏 configUSE_16_BIT_TICKS 设置为 1 时,
系统节拍计数器的数据类型为 16 位无符号整形;当宏 configUSE_16_BIT_TICKS 设置为 0 时,
系统节拍计数器的数据类型为 32 为无符号整型。
11. configIDLE_SHOULD_YIELD
????????当宏 configIDLE_SHOULD_YIELD 设置为 1 时,在抢占调度下,同等优先级的任务可抢占
空闲任务,并延用空闲任务剩余的时间片。
12. configUSE_TASK_NOTIFICATIONS
????????当宏 configUSE_TASK_NOTIFICATIONS 设置为 1 时,开启任务通知功能。当开启任务通
知功能后,每个任务将多占用 8 字节的内存空间。
13. configTASK_NOTIFICATION_ARRAY_ENTRIES
????????此宏用于定义任务通知数组的大小。
14. configUSE_MUTEXES
????????此宏用于使能互斥信号量,当宏 configUSE_MUTEXS 设置为 1 时,使能互斥信号量;当宏
configUSE_MUTEXS 设置为 0 时,则不使能互斥信号量。
15. configUSE_RECURSIVE_MUTEXES
????????此宏用于使能递归互斥信号量,当宏 configUSE_RECURSIVE_MUTEXES 设置为 1 时,使
能递归互斥信号量;当宏 configUSE_RECURSIVE_MUTEXES 设置为 0 时,则不使能递归互斥
信号量。
16. configUSE_COUNTING_SEMAPHORES
????????此宏用于使能计数型信号量,当宏 configUSE_COUNTI
17. configUSE_ALTERNATIVE_API
????????此宏在 FreeRTOS V9.0.0 之后已弃用。
18. configQUEUE_REGISTRY_SIZE
????????此宏用于定义可以注册的队列和信号量的最大数量。此宏定义仅用于调试使用。
19. configUSE_QUEUE_SETS
????????此宏用于使能队列集,当宏 configUSE_QUEUE_SETS 设置为 1 时,使能队列集;当宏
configUSE_QUEUE_SETS 设置为 0 时,则不使能队列集。
20. configUSE_TIME_SLICING
????????此宏用于使能时间片调度,当宏 configUSE_TIMER_SLICING 设置为 1 且使用抢占式调度
时,使能时间片调度;当宏 configUSE_TIMER_SLICING 设置为 0 时,则不使能时间片调度。
21. configUSE_NEWLIB_REENTRANT
????????此 宏 用 于 为 每 个 任 务 分 配 一 个 NewLib 重 入 结 构 体 , 当 宏
configUSE_NEWLIB_REENTRANT 设置为 1 时,FreeRTOS 将为每个创建的任务的任务控制块中分配一个 NewLib 重入结构体。
22. configENABLE_BACKWARD_COMPATIBILITY
????????此宏用于兼容 FreeRTOS 老版本的 API 函数。
23. configNUM_THREAD_LOCAL_STORAGE_POINTERS
????????此宏用于在任务控制块中分配一个线程本地存储指着数组,当此宏被定义为大于 0 时,
configNUM_THREAD_LOCAL_STORAGE_POINTERS 为线程本地存储指针数组的元素个数;
当宏 configNUM_THREAD_LOCAL_STORAGE_POINTERS 为 0 时,则禁用线程本地存储指针
数组。
24. configSTACK_DEPTH_TYPE
????????此宏用于定义任务堆栈深度的数据类型,默认为 uint16_t。
25. configMESSAGE_BUFFER_LENGTH_TYPE
????????此宏用于定义消息缓冲区中消息长度的数据类型,默认为 size_t。
????????1. ureconfigMAX_SECURE_CONTEXTS
????????此宏为 ARMv8-M 安全侧端口的相关配置项,本文暂不涉及 ARMv8-M 安全侧端口的相关
内容,感兴趣的读者可自行查阅相关资料。
? ? ? ? 2. PendSVHandler ?和 vPortSVCHandler
????????这两个宏为 PendSV 和 SVC 的中断服务函数,主要用于 FreeRTOS 操作系统的任务切换,
有关 FreeRTOS 操作系统中任务切换的相关内容