uTank-木头
每一个你不满意的现在,都有一个你没有努力的曾经。

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。

 

posted on 2022-09-08 16:33  uTank  阅读(355)  评论(0编辑  收藏  举报