在调用TaskGetRunTimeStats( char * pcWriteBuffer )函数之前,先要配置下面这些宏

配置configGENERATE_RUN_TIME_STATS为1,然后编译后出现了如下的错误:

.\freeRTOS\inc\FreeRTOS.h(762): error:  #35: #error directive: If configGENERATE_RUN_TIME_STATS is defined then portCONFIGURE_TIMER_FOR_RUN_TIME_STATS must also be defined.  portCONFIGURE_TIMER_FOR_RUN_TIME_STATS should call a port layer function to setup a peripheral timer/counter that can then be used as the run time counter time base.

与上文所说一致,所以对portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()这个函数进行配置,在其中写入定时器的初始化程序,时间为10us。

编译后发现错误仍然存在。

后续进行了如下宏定义才消除了错误:

extern uint32_t FreeRTOSRunTimeTicks;  
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()    ConfigureTimerForRunTimeStats()  
#define portGET_RUN_TIME_COUNTER_VALUE()            FreeRTOSRunTimeTicks            

问题一:为什么不能直接用portCONFIGURE_TIMER_FOR_RUN_TIME_STATS(),而是需要进行宏定义映射呢?

首先注意宏定义的对象,是ConfigureTimerForRunTimeStats()替换portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()。

然后portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()只是 FreeRTOS 定义的宏名,它本质是 FreeRTOS 内核里的一个预定义宏占位符,没有任何可执行代码,也不是函数(不能被修改、不能直接写逻辑),,只是一个起到一个标签的作用,真正实现功能的函数是:ConfigureTimerForRunTimeStats()。这个是由自己定义和编写的函数,来实现需要的功能。

所以portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()是 FreeRTOS 的跨平台抽象接口,通过宏定义映射到你写的硬件定时器初始化函数,实现 “内核与硬件解耦”。

问题二:关于portGET_RUN_TIME_COUNTER_VALUE()。

虽然写起来带括号(看似函数),但它是无参数宏。

FreeRTOS 把portGET_RUN_TIME_COUNTER_VALUE()写成带括号的形式,完全是设计层面的 “接口统一”。

问题三:在消除所有错误,并且完成编译后,还会出现一个警告,内容如下

意思是编译器在调用 ConfigureTimerForRunTimeStats() 函数时,找不到这个函数的声明(原型),只能 “隐式” 假设它的返回值是int类型、参数为空。

原因是在 FreeRTOSConfig.h 中定义了 portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() 映射到 ConfigureTimerForRunTimeStats() 函数;FreeRTOS 的内核文件 tasks.c 会调用这个宏(也就是调用 ConfigureTimerForRunTimeStats()),但 tasks.c 中没有看到这个函数的声明(编译器不知道这个函数的返回值类型、参数列表)。

解决方法是在定义 portCONFIGURE_TIMER_FOR_RUN_TIME_STATS 宏之前,添加函数声明:

void ConfigureTimerForRunTimeStats(void);

注意编译的作用域:即使在timer.h中已经声明了void ConfigureTimerForRunTimeStats(void)函数,但是但必须让 FreeRTOS 内核文件tasks.c能包含到这个声明,因为最终是由tasks.c(调用方)去调用这个函数。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐