1、配置 FreeRTOSFreeRTOS 是高度可配置的。所有的可配置项都在 FreeRTOSConfig.h 文件中。每一个 Demo 程序中都包含了一个配置好的 FreeRTOSConfig.h 文件,可以以Demo 程序中的 FreeRTOSConfig.h 文件作为模板,在其基础上加以修改。下面先给出一个典型的 FreeRTOSConfig.h 文件,然后再逐项加以说明。cpp view plaincopy1. #ifndef FREERTOS_CONFIG_H 2. #define FREERTOS_CONFIG_H 3. 4. /* Here is a good place to i
2、nclude header files that are required across 5. your application. */ 6. #include “something.h“ 7. 8. #define configUSE_PREEMPTION 1 9. #define configUSE_IDLE_HOOK 0 10. #define configUSE_TICK_HOOK 0 11. #define configCPU_CLOCK_HZ 58982400 12. #define configTICK_RATE_HZ 250 13. #define configMAX_PRIO
3、RITIES 5 14. #define configMINIMAL_STACK_SIZE 128 15. #define configTOTAL_HEAP_SIZE 10240 16. #define configMAX_TASK_NAME_LEN 16 17. #define configUSE_TRACE_FACILITY 0 18. #define configUSE_16_BIT_TICKS 0 19. #define configIDLE_SHOULD_YIELD 1 20. #define configUSE_MUTEXES 0 21. #define configUSE_REC
4、URSIVE_MUTEXES 0 22. #define configUSE_COUNTING_SEMAPHORES 0 23. #define configUSE_ALTERNATIVE_API 0 24. #define configCHECK_FOR_STACK_OVERFLOW 0 25. #define configQUEUE_REGISTRY_SIZE 10 26. #define configGENERATE_RUN_TIME_STATS 0 27. 28. #define configUSE_CO_ROUTINES 0 29. #define configMAX_CO_ROUT
5、INE_PRIORITIES 1 30. 31. #define configUSE_TIMERS 1 32. #define configTIMER_TASK_PRIORITY 3 33. #define configTIMER_QUEUE_LENGTH 10 34. #define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE 35. 36. #define configKERNEL_INTERRUPT_PRIORITY dependent of processor 37. #define configMAX_SYSCALL_I
6、NTERRUPT_PRIORITY dependent on processor and application 38. 39. #define configASSERT( ( x ) ) if( ( x ) = 0 ) vCallAssert( _FILE_,_LINE_ ) 40. 41. #define INCLUDE_vTaskPrioritySet 1 42. #define INCLUDE_uxTaskPriorityGet 1 43. #define INCLUDE_vTaskDelete 1 44. #define INCLUDE_vTaskSuspend 1 45. #def
7、ine INCLUDE_xResumeFromISR 1 46. #define INCLUDE_vTaskDelayUntil 1 47. #define INCLUDE_vTaskDelay 1 48. #define INCLUDE_xTaskGetSchedulerState 1 49. #define INCLUDE_xTaskGetCurrentTaskHandle 1 50. #define INCLUDE_uxTaskGetStackHighWaterMark 0 51. #define INCLUDE_xTaskGetIdleTaskHandle 0 52. #define
8、INCLUDE_xTimerGetTimerDaemonTaskHandle 0 53. #define INCLUDE_pcTaskGetTaskName 0 54. 55. #endif /* FREERTOS_CONFIG_H */ 可配置的参数configUSE_PREEMPTION设为 1 则采用抢占式调度器, 设为 0 则采用协作式调度器。configUSE_IDLE_HOOK设为 1 则使能 idle hook,设为 0 则禁止 idle hook。configUSE_TICK_HOOK设为 1 则使能 tick hook,设为 0 则禁止 tick hook。configCPU
9、_CLOCK_HZ设置为 MCU 内核的工作频率,以 Hz 为单位。配置 FreeRTOS 的时钟 Tick 时会用到。对不同的移植代码也可能不使用这个参数。如果确定移植代码中不用它就可以注释掉这行。configTICK_RATE_HZFreeRTOS 的时钟 Tick 的频率,也就是 FreeRTOS 用到的定时中断的产生频率。这个频率越高则定时的精度越高,但是由此带来的开销也越 大。FreeRTOS 自带的 Demo 程序中将 TickRate 设为了 1000Hz 只是用来测试内核的性能的。实际的应用程序应该根据需要改为较小的数值。当多个任务共用一个优先级时,内核调度器回来每次时钟中断到
10、来后轮转切换任务(round robin),因此,更高的 Tick Rate 会导致任务的时间片“time slice”变短。configMAX_PRIORITIES程序中可以使用的最大优先级。FreeRTOS 会为每个优先级建立一个链表,因此没多一个优先级都会增加些 RAM 的开销。所以,要根据程序中需要多少种不同的优先级来设置这个参数。configMINIMAL_STACK_SIZE任务堆栈的最小大小,FreeRTOS 根据这个参数来给 idle task 分配堆栈空间。这个值如果设置的比实际需要的空间小,会导致程序挂掉。因此,最好不要减小 Demo 程序中给出的大小。configTOTA
11、L_HEAP_SIZE设置堆空间(Heap)的大小。只有当程序中采用 FreeRTOS 提供的内存分配算法时才会用到。configMAX_TASK_NAME_LEN任务名称最大的长度,这个长度是以字节为单位的,并且包括最后的 NULL 结束字节。configUSE_TRACE_FACILITY如果程序中需要用到 TRACE 功能,则需将这个宏设为 1。否则设为 0。开启TRACE 功能后,RAM 占用量会增大许多,因此在设为 1 之前请三思。configUSE_16_BIT_TICKS将 configUSE_16_BIT_TICKS 设为 1 后 portTickType 将被定义为无符号的
12、16位整形类型,configUSE_16_BIT_TICKS 设为 0 后 portTickType 则被定义为无符号的 32 位整型。configIDLE_SHOULD_YIELD这个参数控制那些优先级与 idle 任务相同的任务的行为,并且只有当内核被配置为抢占式任务调度时才有实际作用。内核对具有同样优先级的任务会采用时间片轮转调度算法。当任务的优先级高于 idle 任务时,各个任务分到的时间片是同样大小的。但当任务的优先级与 idle 任务相同时情况就有些不同了。当configIDLE_SHOULD_YIELD 被配置为 1 时,当任何优先级与 idle 任务相同的任务处于就绪态时,id
13、le 任务会立刻要求调度器进行任务切换。这会使 idle任务占用最少的 CPU 时间,但同时会使得优先级与 idle 任务相同的任务获得的时间片不是同样大小的。因为 idle 任务会占用某个任务的部分时间片。configUSE_MUTEXES设为 1 则程序中会包含 mutex 相关的代码,设为 0 则忽略相关的代码。configUSE_RECURSIVE_MUTEXES设为 1 则程序中会包含 recursive mutex 相关的代码,设为 0 则忽略相关的代码。configUSE_COUNTING_SEMAPHORES设为 1 则程序中会包含 semaphore 相关的代码,设为 0 则
14、忽略相关的代码。configUSE_ALTERNATIVE_API设为 1 则程序中会包含一些关于队列操作的额外 API 函数,设为 0 则忽略相关的代码。这些额外提供的 API 运行速度更快,但是临界区(关中断)的长度也更长。有利也有弊,是否要采用需要用户自己考虑了。configCHECK_FOR_STACK_OVERFLOW控制是否检测堆栈溢出。configQUEUE_REGISTRY_SIZE队列注册表有两个作用,但是这两个作用都依赖于调试器的支持:1. 给队列一个名字,方便调试时辨认是哪个队列。2. 包含调试器需要的特定信息用来定位队列和信号量。如果你的调试器没有上述功能,哪个这个注册
15、表就毫无用处,还占用的宝贵的RAM 空间。configGENERATE_RUN_TIME_STATS设置是否产生运行时的统计信息,这些信息只对调试有用,会保存在 RAM 中,占用 RAM 空间。因此,最终程序建议配置成不产生运行时统计信息。configUSE_CO_ROUTINES设置为 1 则包含 co-routines 功能,如果包含了 co-routines 功能,则编译时需包含 croutine.c 文件 configMAX_CO_ROUTINE_PRIORITIESco-routines 可以使用的优先级的数量。configUSE_TIMERS设置为 1 则包含软件定时器功能。con
16、figTIMER_TASK_PRIORITY设置软件定时器任务的优先级。 configTIMER_QUEUE_LENGTH设置软件定时器任务中用到的命令队列的长度。configTIMER_TASK_STACK_DEPTH设置软件定时器任务需要的任务堆栈大小。configKERNEL_INTERRUPT_PRIORITY 和 configMAX_SYSCALL_INTERRUPT_PRIORITYCortex-M3, PIC24, dsPIC, PIC32, SuperH 和 RX600 的移植代码中会使用到 configKERNEL_INTERRUPT_PRIORITY.PIC32, RX60
17、0 和 Cortex-M 系列 会使用到 configMAX_SYSCALL_INTERRUPT_PRIORITYconfigKERNEL_INTERRUPT_PRIORITY 应该被设为最低优先级。对那些只定义了 configKERNEL_INTERRUPT_PRIORITY 的系统:configKERNEL_INTERRUPT_PRIORITY 决定了 FreeRTOS 内核使用的优先级。所有调用 API 函数的中断的优先级都应设为这个值,不调用 API 函数的中断可以设为更高的优先级。 对那些定义了 configKERNEL_INTERRUPT_PRIORITY 和configMAX_S
18、YSCALL_INTERRUPT_PRIORITY 的系统:configKERNEL_INTERRUPT_PRIORITY 决定了 FreeRTOS 内核使用的优先级。configMAX_SYSCALL_INTERRUPT_PRIORITY 决定了可以调用 API 函数的中断的最高优先级。高于这个值的中断处理函数不能调用任何 API 函数。configASSERT宏 configASSERT()的作用类似 C 语言标准库中的宏 assert(),configASSERT() 可以帮助调试,但是定义了 configASSERT()后会增加程序代码,也会使程序变慢。以 INCLUDE 开头参数以 INCLUDE 开头的宏允许我们将部分不需要的 API 函数排除在编译生成的代码之外。这可以使内核代码占用更少的 ROM 和 RAM。比如,如果代码中需要用到 vTaskDelete 函数则这样写:#defineINCLUDE_vTaskDelete 1如果不需要,则这样写:#defineINCLUDE_vTaskDelete 0