FreeRTOS 基本配置
首次将FreeRTOS移植到目标系统上时,我们需要对其进行配置。
FreeRTOSConfig.h
FreeRTOSConfig.h文件是FreeRTOS的配置文件,我们可以通过修改宏定义的值,对其功能进行定制。下面依次说一下每个功能的作用。
#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H
Application specific definitions. 具体定义
这部分是需要根据我们的硬件平台来修改的。由于FreeRTOS为大多数平台都提供了Demo,我们可以直接复制Demo中的配置文件FreeRTOSConfig.h就能快速实现应用。
#define configUSE_PREEMPTION 1 //是否使用抢占式调度
#define configUSE_IDLE_HOOK 0 //是否使用空闲Hook
#define configUSE_TICK_HOOK 0 //是否使用滴答Hook
#define configCPU_CLOCK_HZ ( ( unsigned long ) 72000000 ) //CPU主频
#define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) // 系统滴答频率
#define configMAX_PRIORITIES ( 5 ) //最高优先级
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 ) //最小栈大小
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 17 * 1024 ) ) //总堆大小
#define configMAX_TASK_NAME_LEN ( 16 ) //最大任务名称长度
#define configUSE_TRACE_FACILITY 0 //是否使用跟踪
#define configUSE_16_BIT_TICKS 0 //是否是使用16位滴答定时器
#define configIDLE_SHOULD_YIELD 1 //是否允许空闲优先级任务抢占空闲任务
Co-routine definitions. 协程定义
协程目前已经很少使用了。
/* Co-routine definitions. */
#define configUSE_CO_ROUTINES 0
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
API function 定义
#define INCLUDE_vTaskPrioritySet 1 //改变任务优先级
#define INCLUDE_uxTaskPriorityGet 1 //查询任务优先级
#define INCLUDE_vTaskDelete 1 //删除任务
#define INCLUDE_vTaskCleanUpResources 0 //回收任务资源
#define INCLUDE_vTaskSuspend 1 //挂起任务
#define INCLUDE_vTaskDelayUntil 1 //任务延迟
#define INCLUDE_vTaskDelay 1 //任务延迟
中断优先级定义
/* This is the raw value as per the Cortex-M3 NVIC. Values can be 255
(lowest) to 0 (1?) (highest). */
#define configKERNEL_INTERRUPT_PRIORITY 255
// 这个值通常必须设置为可允许的最低优先级
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191
/* equivalent to 0xb0, or priority 11. */
// FreeRTOS API能够使用的最高优先级
/* This is the value being used as per the ST library which permits 16
priority values, 0 to 15. This must correspond to the
configKERNEL_INTERRUPT_PRIORITY setting.
Here 15 corresponds to the lowest NVIC value of 255. */
#define configLIBRARY_KERNEL_INTERRUPT_PRIORITY 15
// ST库函数能使用的优先级0-15
#endif /* FREERTOS_CONFIG_H */
示例:
当configMAX_SYSCALL_INTERRUPT_PRIORITY 设置为3,configKERNEL_INTERRUPT_PRIORITY 设置为1时:
- 不使用API的中断可以使用任何优先级,可以嵌套
- 中断优先级1~3可以使用API,但是有些情况下会被更高优先级任务屏蔽
- 中断优先级4~7不能使用API,不会被FreeRTOS内核干扰,可以嵌套。