FreeRTOS内核是高度可定制的,在实际使用FreeRTOS 的时候我们时常需要根据自己需求来配置FreeRTOS,而且不同架构的MCU在使用的时候配置也不同。FreeRTOS 的系统配置文件为FreeRTOSConfig.h,在此配置文件中可以完成FreeRTOS 的裁剪和配置。
每个FreeRTOS应用都必须包含这个头文件,用户根据实际应用来裁剪定制FreeRTOS内核。
这个配置文件是针对用户程序的,而非内核,因此配置文件一般放在应用程序目录下,不要放在RTOS内核源码目录下。
重要配置说明:
【"config"开始的宏】
configKERNEL_INTERRUPT_PRIORITY
用来设置RTOS内核自己的中断优先级。
因为RTOS内核中断不允许抢占用户使用的中断,因此这个宏一般定义为硬件最低优先级。
对于Cortex-M硬件,RTOS使用到硬件的PendSV和SysTick硬件中断,
在函数xPortStartScheduler()中(该函数在port.c中,由启动调度器函数vTaskStartScheduler()调用),
将PendSV和SysTick硬件中断优先级寄存器设置为宏configKERNEL_INTERRUPT_PRIORITY指定的值。
1 /* 2 PendSV 优先级设置寄存器地址为0xe000ed22 3 SysTick优先级设置寄存器地址为0xe000ed23 4 */ 5 #define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) 6 7 #define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) 8 #define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) 9 10 /* Make PendSV and SysTick the lowest priority interrupts. */ 11 portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; 12 portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
configMAX_SYSCALL_INTERRUPT_PRIORITY
用来设置可以在中断服务程序中安全调用FreeRTOS API函数的最高中断优先级。
优先级小于等于这个宏所代表的优先级时,程序可以在中断服务程序中安全的调用FreeRTOS API函数;
如果优先级大于这个宏所代表的优先级,表示FreeRTOS无法禁止这个中断,在这个中断服务程序中绝不可以调用任何API函数。
configGENERATE_RUN_TIME_STATS
设置为1开启时间统计功能,相应的API函数vTaskGetRunTimeStats/ulTaskGetIdleRunTimeCounter等会被编译,为0时关闭时间统计功能。
如果宏configGENERATE_RUN_TIME_STATS为1的话还需要定义宏portCONFIGURE_TIMER_FOR_RUN_TIME_STATS、portGET_RUN_TIME_COUNTER_VALUE;
portCONFIGURE_TIMER_FOR_RUN_TIME_STATS:用于初始化配置一个高精度定时器作为基准时钟;
portGET_RUN_TIME_COUNTER_VALUE:用于返回当前基准时钟的时钟值;
【"INCLUDE_"开始的宏】
使用“INCLUDE_”开头的宏用来表示使能或除能FreeRTOS 中相应的API 函数,作用就是用来配置FreeRTOS 中的可选API 函数的。比如当宏INCLUDE_vTaskPrioritySet 设置为0 的时候表示不能使用函数vTaskPrioritySet() , 当设置为1 的时候就表示可以使用函数vTaskPrioritySet()。
1、INCLUDE_xSemaphoreGetMutexHolder
如果要使用函数xQueueGetMutexHolder()的话宏INCLUDE_xSemaphoreGetMutexHolder 必须定义为1。
2、INCLUDE_xTaskAbortDelay
如果要使用函数xTaskAbortDelay()的话将宏INCLUDE_xTaskAbortDelay 定义为1。
3、INCLUDE_vTaskDelay
如果要使用函数vTaskDelay()的话需要将宏INCLUDE_vTaskDelay 定义为1。
4、INCLUDE_vTaskDelayUntil
如果要使用函数vTaskDelayUntil()的话需要将宏INCLUDE_vTaskDelayUntil 定义为1。
5、INCLUDE_vTaskDelete
如果要使用函数vTaskDelete()的话需要将宏INCLUDE_vTaskDelete 定义为1。
6、INCLUDE_xTaskGetCurrentTaskHandle
如果要使用函数xTaskGetCurentTaskHandle() 的话需要将宏INCLUDE_xTaskGetCurrentTaskHandle 定义为1。
7、INCLUDE_xTaskGetHandle
如果要使用函数xTaskGetHandle()的话需要将宏INCLUDE_xTaskGetHandle 定义为1。
8、INCLUDE_xTaskGetIdleTaskHandle
如果要使用函数xTaskGetIdleTaskHandle() 的话需要将宏INCLUDE_xTaskGetIdleTaskHandle 定义为1。
9、INCLUDE_xTaskGetSchedulerState
如果要使用函数xTaskGetSchedulerState()的话需要将宏INCLUDE_xTaskGetSchedulerState定义为1。
10、INCLUDE_uxTaskGetStackHighWaterMark
如果要使用函数uxTaskGetStackHighWaterMark() 的话需要将宏INCLUDE_uxTaskGetStackHighWaterMark 定义为1。
11、INCLUDE_uxTaskPriorityGet
如果要使用函数uxTaskPriorityGet()的话需要将宏INCLUDE_uxTaskPriorityGet 定义为1。
12、INCLUDE_vTaskPrioritySet
如果要使用函数vTaskPrioritySet()的话需要将宏INCLUDE_vTaskPrioritySet 定义为1。
13、INCLUDE_xTaskResumeFromISR
如果要使用函数xTaskResumeFromISR()的话需要将宏INCLUDE_xTaskResumeFromISR 和INCLUDE_vTaskSuspend 都定义为1。
14、INCLUDE_eTaskGetState
如果要使用函数eTaskGetState()的话需要将宏INCLUDE_eTaskGetState 定义为1。
15、INCLUDE_vTaskSuspend
如果要使用函数vTaskSuspend() 、vTaskResume() 、prvTaskIsTaskSuspended() 、xTaskResumeFromISR()的话宏INCLUDE_vTaskSuspend 要定义为1。如果要使用函数xTaskResumeFromISR() 的话宏INCLUDE_xTaskResumeFromISR 和INCLUDE_vTaskSuspend 都必须定义为1。
16、INCLUDE_xTimerPendFunctionCall
如果要使用函数xTimerPendFunctionCall() 和xTimerPendFunctionCallFromISR() 的话宏INCLUDE_xTimerPendFunctionCall 和configUSE_TIMERS 都必须定义为1。