未包含FreeRTOSConfig.h时,projdefs.h为何能使用其configTICK_RATE_HZ宏?
FreeRTOS中projdefs.h未显式包含FreeRTOSConfig.h却能用configTICK_RATE_HZ的原理
这个现象的核心是C语言的宏预处理机制,并非projdefs.h自己偷偷包含了FreeRTOSConfig.h,而是编译时的头文件包含顺序在起作用:
编译单元的头文件包含顺序:实际项目里,
FreeRTOSConfig.h一定会被先于projdefs.h引入到编译流程中。比如你的应用代码里,会先包含FreeRTOSConfig.h,再包含task.h这类FreeRTOS核心头文件;而task.h内部会包含projdefs.h。等到预处理阶段处理projdefs.h时,configTICK_RATE_HZ已经被提前定义好了,所以pdMS_TO_TICKS宏能直接引用它。FreeRTOS的强制约定:FreeRTOS官方明确要求,用户必须在所有FreeRTOS核心头文件之前包含FreeRTOSConfig.h。这个约定保证了所有依赖config开头宏的核心头文件,在预处理时都能拿到已经定义好的配置宏。
验证方法:用编译器的预处理输出功能(比如GCC加
-E参数),可以看到完整的宏展开顺序,能清楚看到configTICK_RATE_HZ是在pdMS_TO_TICKS之前被定义的。
代码示例
// projdefs.h #ifndef pdMS_TO_TICKS #define pdMS_TO_TICKS( xTimeInMs ) ( ( TickType_t ) ( ( ( TickType_t ) ( xTimeInMs ) * ( TickType_t ) configTICK_RATE_HZ ) / ( TickType_t ) 1000U ) ) #endif // FreeRTOSConfig.h #ifndef configTICK_RATE_HZ #define configTICK_RATE_HZ (1000) #endif
内容的提问来源于stack exchange,提问作者Casper Knudsen
相关产品推荐
相关产品推荐

