FreeRTOS学习--3、配置文件FreeRTOSConfig.h详解

    FreeRTOSConfig.h 是一个用户级别的配置文件,不属于内核文件。每个用户可以有不同的FreeRTOSConfig.h,从而实现不同的功能配置。 

   FreeRTOS 作为一个可高度配置的实时内核,其绝大多数配置选项都体现在 FreeRTOS.h(注意是 FreeRTOS.h 不是FreeRTOSConfig.h)中。为什么这么说?打开 FreeRTOS.h 看看就知道了,这个文件唯一要干的活就是负责根据宏值来对 FreeRTOS 进行配置的。

1、 配置实现

        当用户需要根据自己的需求修改FreeRTOS,不是直接修改FreeRTOS.h文件,而是修改FreeRTOSConfig.h文件,FreeRTOS.h根据FreeRTOSConfig.h中用户的配置实现对FreeRTOS的配置,这样可以保证所有用户使用FreeRTOS的内核源码一致。

        用户只需要根据需要,在 FreeRTOSConfig.h 中以宏值的形式给出定义即可。用户可用的宏值几乎全部来自于 FreeRTOS.h 这个系统级头文件,用户需要什么功能,需要在该文件中查找对应的宏值;FreeRTOS.h 中会检查特定功能的宏值有没有在 FreeRTOSConfig.h 中定义,如果用户定义了指定宏值,则 FreeRTOS 就根据用户的定义来实现。

2、配置详解

(1)configUSE_PREEMPTION

        为 1 时 RTOS 使用抢占式调度器,即当进程位于内核空间时,有一个更高优先级的任务出现时,如果当前内核允许抢占,则可以将当前任务挂起,执行优先级更高的进程;为 0 时 RTOS 使用协作式调度器(时间片)高优先级的进程不能中止正在内核中运行的低优先级的进程而抢占 CPU 运行。

(2)configUSE_PORT_OPTIMISED_TASK_SELECTION

        某些运行 FreeRTOS 的硬件有两种方法选择下一个要执行的任务:通用方法和特定于硬件的方法,port.c文件是特定硬件相关的实现。

通用方法: 

        1) configUSE_PORT_OPTIMISED_TASK_SELECTION 设置为 0 或者没有实现特定于硬件方法时,将显式或者隐式使用通用方法;

        2)不强制要求限制最大可用优先级数量;

        3)可以用于所有 FreeRTOS 支持的硬件。

特定于硬件方法:  

        1)不是所有硬件都支持;

        2)configUSE_PORT_OPTIMISED_TASK_SELECTION 设置为 1;

        3)效率高,一般限定最大可用优先级数目为32;

        4)在portmacro.h中以宏的方式实现一些接口。

(3)configUSE_TICKLESS_IDLE  

        设置为1使用低功耗tickless模式,设置为0保持系统节拍中断一直运行。通常情况下,需要设计者自己实现 FreeRTOS 回调空闲任务钩子函数,在空闲任务钩子函数中设置微处理器进入低功耗模式来达到省电的目的。

(4)configUSE_IDLE_HOOK

        设置为 1 使用空闲钩子(类似于回调函数),为 0 忽略空闲钩子。空闲任务钩子是一个函数,这个函数由用户来实现,FreeRTOS 规定了函数的名字和参数,这个函数在每个空闲任务周期都会被调用。创建空闲钩子步骤:

        1)设置 FreeRTOSConfig.h 文件中的 configUSE_IDLE_HOOK 为 1;
        2)定义一个函数,函数名和参数如下所示:void vApplicationIdleHook(void );
        3)该钩子函数不可以调用会引起空闲任务阻塞的 API 函数;
        4)使用空闲钩子函数设置 CPU 进入省电模式是很常见的用法。

在config文件中还有许多类似上诉的宏,这里就不一一描述,后续有时间在进行补充,关于详细的介绍可以参考博客:FreeRTOS 之三 全配置项(FreeRTOSConfig.h)详解、裁剪、使用示例-CSDN博客

3、FreeRTOSConfig.h模板

最后放上官网上给出的FreeRTOSConfig.h的模板:

#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

/* 再此包含自己的头文件,例如使用 STM32 系列芯片时,可以再次包含 STM32 库的头文件 */
#include "something.h"
/* 以下为一些常用的配置项目 */
#define configUSE_PREEMPTION                    1
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0
#define configUSE_TICKLESS_IDLE                 0
#define configCPU_CLOCK_HZ                      60000000	/* 这个 必须 更改为自己芯片的实际频率 */
#define configTICK_RATE_HZ                      250			/* FreeRTOS 的中断频率,根据需要修改 */
#define configMAX_PRIORITIES                    5			/* 任务的最大优先级,根据需要修改*/
#define configMINIMAL_STACK_SIZE                128
#define configMAX_TASK_NAME_LEN                 16
#define configUSE_16_BIT_TICKS                  0
#define configIDLE_SHOULD_YIELD                 1
#define configUSE_TASK_NOTIFICATIONS            1
#define configUSE_MUTEXES                       0
#define configUSE_RECURSIVE_MUTEXES             0
#define configUSE_COUNTING_SEMAPHORES           0
#define configUSE_ALTERNATIVE_API               0 			/* Deprecated! */
#define configQUEUE_REGISTRY_SIZE               10
#define configUSE_QUEUE_SETS                    0
#define configUSE_TIME_SLICING                  0
#define configUSE_NEWLIB_REENTRANT              0
#define configENABLE_BACKWARD_COMPATIBILITY     0
#define configNUM_THREAD_LOCAL_STORAGE_POINTERS 5

/* Memory allocation related definitions. */
#define configSUPPORT_STATIC_ALLOCATION         1
#define configSUPPORT_DYNAMIC_ALLOCATION        1
#define configTOTAL_HEAP_SIZE                   10240	/* 为FreeRTOS分配的内存,具体和选择的heap_x.c相关 */
#define configAPPLICATION_ALLOCATED_HEAP        1

/* Hook function related definitions. */
#define configUSE_IDLE_HOOK                     0
#define configUSE_TICK_HOOK                     0
#define configCHECK_FOR_STACK_OVERFLOW          0
#define configUSE_MALLOC_FAILED_HOOK            0
#define configUSE_DAEMON_TASK_STARTUP_HOOK      0

/* Run time and task stats gathering related definitions. */
#define configGENERATE_RUN_TIME_STATS           0
#define configUSE_TRACE_FACILITY                0
#define configUSE_STATS_FORMATTING_FUNCTIONS    0

/* Co-routine related definitions. */
#define configUSE_CO_ROUTINES                   0
#define configMAX_CO_ROUTINE_PRIORITIES         1

/* Software timer related definitions. */
#define configUSE_TIMERS                        1
#define configTIMER_TASK_PRIORITY               3
#define configTIMER_QUEUE_LENGTH                10
#define configTIMER_TASK_STACK_DEPTH            configMINIMAL_STACK_SIZE

/* Interrupt nesting behaviour configuration. */
#define configKERNEL_INTERRUPT_PRIORITY         [dependent of processor]
#define configMAX_SYSCALL_INTERRUPT_PRIORITY    [dependent on processor and application]
#define configMAX_API_CALL_INTERRUPT_PRIORITY   [dependent on processor and application]

/* Define to trap errors during development. */
#define configASSERT( ( x ) ) if( ( x ) == 0 ) vAssertCalled( __FILE__, __LINE__ )

/* FreeRTOS MPU specific definitions. */
#define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS 0

/* Optional functions - most linkers will remove unused functions anyway. */
#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_eTaskGetState                   0
#define INCLUDE_xEventGroupSetBitFromISR        1
#define INCLUDE_xTimerPendFunctionCall          0
#define INCLUDE_xTaskAbortDelay                 0
#define INCLUDE_xTaskGetHandle                  0
#define INCLUDE_xTaskResumeFromISR              1

/* A header file that defines trace macro can be included here. */

#endif /* FREERTOS_CONFIG_H */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值