400-035-6699
当前位置: 首页 » 技术支持 » 博文资讯 »

FreeRTOS配置选项深度解析与操作指南

FreeRTOS是一款广泛应用于嵌入式系统实时操作系统,其高度可配置的特性使其能够适应各种不同的硬件环境。FreeRTOS的所有配置选项都集中在`FreeRTOSConfig.h`文件中,每个示例程序都提供了一个已配置的`FreeRTOSConfig.h`文件,我们可以基于这些文件进行修改,以适应具体的应用需求。
首先,让我们来看看一个典型的`FreeRTOSConfig.h`文件结构。文件以预编译指令开始,定义了`FREERTOS_CONFIG_H`宏,确保文件只被包含一次。
配置文件中,首先包含了一些可能在整个应用程序中都需要使用的头文件。这一步是必要的,因为它确保了编译器能够找到所有需要的定义和声明。
接下来是具体的配置选项:
- `configUSE_PREEMPTION`:这个选项决定是否使用抢占式调度。如果设置为1,FreeRTOS将采用抢占式调度;如果设置为0,则采用协作式调度。 - `configUSE_IDLE_HOOK`和`configUSE_TICK_HOOK`:这两个选项分别用于启用或禁用空闲钩子(idle hook)和时钟钩子(tick hook)。钩子是一种特殊的函数,可以在特定的时间点执行自定义代码。 - `configCPU_CLOCK_HZ`和`configTICK_RATE_HZ`:这两个参数分别设置CPU的工作频率和FreeRTOS时钟Tick的频率。时钟Tick的频率影响定时的精度,同时也影响任务切换的频率。
为了优化内存使用,FreeRTOS允许配置任务堆栈的最小大小、堆空间的大小以及任务名称的最大长度。这些参数可以根据具体应用的需求进行调整,以确保既不会浪费资源,也不会因为配置过小而导致程序运行异常。
- `configMAX_PRIORITIES`定义了程序中可以使用的最大优先级数。每个优先级都对应一个任务列表,因此优先级的数量会影响RAM的占用。 - `configMINIMAL_STACK_SIZE`和`configTOTAL_HEAP_SIZE`分别设置了任务堆栈的最小大小和堆空间的总大小。正确设置这些值对于确保程序稳定运行至关重要。
此外,还有许多其他配置选项,例如`configUSE_TRACE_FACILITY`用于启用或禁用跟踪功能,`configUSE_16_BIT_TICKS`用于定义时钟Tick的类型,以及`configIDLE_SHOULD_YIELD`用于控制与空闲任务同优先级的任务的行为。
FreeRTOS还提供了一系列可选的功能,如互斥锁、递归互斥锁、计数信号量等。这些功能可以通过`INCLUDE_xxx`宏来启用或禁用。例如,`INCLUDE_vTaskPrioritySet`用于设置任务的优先级,`INCLUDE_uxTaskPriorityGet`用于获取任务的优先级。
最后,`configASSERT`宏用于断言检查,它可以在调试过程中帮助识别错误。
通过合理配置这些选项,我们可以使FreeRTOS更好地适应特定的硬件和应用需求。每个项目可能都有其特定的要求,因此理解这些配置选项的作用和影响是非常重要的。掌握了这些配置技巧,我们就能够充分利用FreeRTOS的强大功能,为嵌入式系统开发提供稳定的支持。

FreeRTOS 是高度可配置的。所有的可配置项都在FreeRTOSConfig.h 文件中。每一个Demo 程序中都包含了一个配置好的FreeRTOSConfig.h 文件,可以以Demo程序中的FreeRTOSConfig.h 文件作为模板,在其基础上加以修改。

FreeRTOS配置选项深度解析与操作指南

下面先给出一个典型的FreeRTOSConfig.h 文件,然后再逐项加以说明。
#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

/* Here is a good place to include header files that are required across
your application. */
#include "something.h"

#define configUSE_PREEMPTION 1
#define configUSE_IDLE_HOOK 0
#define configUSE_TICK_HOOK 0
#define configCPU_CLOCK_HZ 58982400
#define configTICK_RATE_HZ 250
#define configMAX_PRIORITIES 5
#define configMINIMAL_STACK_SIZE 128
#define configTOTAL_HEAP_SIZE 10240
#define configMAX_TASK_NAME_LEN 16
#define configUSE_TRACE_FACILITY 0
#define configUSE_16_BIT_TICKS 0
#define configIDLE_SHOULD_YIELD 1
#define configUSE_MUTEXES 0
#define configUSE_RECURSIVE_MUTEXES 0
#define configUSE_COUNTING_SEMAPHORES 0
#define configUSE_ALTERNATIVE_API 0
#define configCHECK_FOR_STACK_OVERFLOW 0
#define configQUEUE_REGISTRY_SIZE 10
#define configGENERATE_RUN_TIME_STATS 0

#define configUSE_CO_ROUTINES 0
#define configMAX_CO_ROUTINE_PRIORITIES 1

#define configUSE_TIMERS 1
#define configTIMER_TASK_PRIORITY 3
#define configTIMER_QUEUE_LENGTH 10
#define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE

#define configKERNEL_INTERRUPT_PRIORITY [dependent of processor]
#define configMAX_SYSCALL_INTERRUPT_PRIORITY [dependent on pRoCEssor and application]

#define configASSERT( ( x ) ) if( ( x ) == 0 ) vCallAssert( __FILE__, __LINE__ )

#define INCLUDE_vTaskPrioritySet 1
#define INCLUDE_uxTaskPriorityGet 1
#define INCLUDE_vTaskDelete 1
#define INCLUDE_vTaskSuspend 1
#define INCLUDE_xResumeFromISR 1
#define INCLUDE_vTaskDelayUntil 1
#define INCLUDE_vTaskDelay 1
#define INCLUDE_xTaskGetSchedulerState 1
#define INCLUDE_xTaskGetCurrentTaskHandle 1
#define INCLUDE_uxTaskGetStackHighWaterMark 0
#define INCLUDE_xTaskGetIdleTaskHandle 0
#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0
#define INCLUDE_pcTaskGetTaskName 0

#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_CLOCK_HZ

设置为 MCU 内核的工作频率,以Hz为单位。配置FreeRTOS的时钟Tick时会用到。对不同的移植代码也可能不使用这个参数。如果确定移植代码中不用它就可以注释掉这行。

configTICK_RATE_HZ

FreeRTOS的时钟Tick的频率,也就是FreeRTOS用到的定时中断的产生频率。这个频率越高则定时的精度越高,但是由此带来的开销也越大。FreeRTOS 自带的Demo 程序中将TickRate 设为了1000Hz只是用来测试内核的性能的。实际的应用程序应该根据需要改为较小的数值。
当多个任务共用一个优先级时,内核调度器回来每次时钟中断到来后轮转切换任务(round robin),因此,更高的Tick Rate 会导致任务的时间片“time slice”变短。

configMAX_PRIORITIES

程序中可以使用的最大优先级。FreeRTOS 会为每个优先级建立一个链表,因此没多一个优先级都会增加些RAM 的开销。所以,要根据程序中需要多少种不同的优先级来设置这个参数。

configMINIMAL_STACK_SIZE

任务堆栈的最小大小,FreeRTOS根据这个参数来给idle task 分配堆栈空间。这个值如果设置的比实际需要的空间小,会导致程序挂掉。因此,最好不要减小Demo 程序中给出的大小。

configTOTAL_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 将被定义为无符号的16位整形类型,configUSE_16_BIT_TICKS 设为0 后portTickType 则被定义为无符号的32位整型。

configIDLE_SHOULD_YIELD

这个参数控制那些优先级与idle 任务相同的任务的行为,并且只有当内核被配置为抢占式任务调度时才有实际作用。

内核对具有同样优先级的任务会采用时间片轮转调度算法。当任务的优先级高于idle任务时,各个任务分到的时间片是同样大小的。

【限时免费】一键获取网络规划系统模板+传输架构设计+连通性评估方案

相关文章

服务电话:
400-035-6699
企服商城