调用ThreadX自带的任务时间统计功能时所踩的坑

跟着硬汉哥的教程来到了调用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栏中的位置调换了一下,发现没有作用。

参考:

  1. 条件编译 armasm-GNU
  2. 汇编语言中的#define #include #ifdef 等问题
posted @ 2022-04-21 15:10  中庭之园  阅读(207)  评论(0编辑  收藏  举报