跟着硬汉哥的教程来到了调用utility文件夹中tx_execution_profile.c的阶段,开始尝试使用ThreadX自带的任务时间统计功能。
配置很简单,封装的真方便啊,那就试试吧。
按照响应的步骤,移植到了我的F103单片机上。咦,怎么时间都是0?
在tx_execution_profile.c文件中所有的程序末尾对一个全局变量赋值,观察发现,该全局变量一直没有被赋值。说明一个函数都没被调用!
这些函数大多在.s文件中被调用,尤其是tx的调度器tx_thread_schedule.s。
震惊,这个时间统计功能不用也罢,但是调度器不会有bug吧,这ThreadX不是过了很多安全评审么?不过虽然过了不少评审,但从github上看到也确实在不断修补。
调试一下午无果。
第二天上午,经过各种尝试,删除了.s文件中相关的所有条件编译之后发现可以使用了,类似这些地方。
为什么之前的ASM宏定义没有起作用呢?
从map文件中也发现tx_thread_schedule.o没有调用两个主要函数_tx_execution_thread_enter和_tx_execution_thread_exit。
后来查资料,有人在stackflow里问到汇编条件编译相关的问题,说是.S和.s文件是有区别的,一个是使用了预处理,一个是没有使用。试了一下,MDK不认这个区别。此外发现ASM中添加的–cpreproc就是调用了ARMCC进行预处理。
再后来因缘际会,发现和硬汉哥的.s文件有不同的地方,进而发现原来这个条件编译的格式,KEIL使用的ARMCC并不认!!!
#ifdef 应该写为 IF :DEF:
#endif 应该写为 ENDIF
那#ifndef
呢?找到了这个资料(真难找)
将其全部修改后,这个让我差点放弃探索的自带任务统计模块终于可以使用了。
p.s. ARM keil手册上使用ELIF 代替 ELSE IF,上图中使用ELSEIF,推荐按照ARM keil手册来。
P.S.令我奇怪的是,在之前的教程里,ASM的宏里已经用过
TX_PORT_USE_BASEPRI
开启BASEPRI中断屏蔽寄存器,而其.s文件中的条件编译也是#ifdef
这种格式,却可以正常使用。尝试将宏在ASM栏中的位置调换了一下,发现没有作用。
参考: