调用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 等问题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
React并没有提供直接调用浏览器自带搜索高亮功能的API,但你可以借助一些浏览器API或者第三方库实现这个功能。 一种实现方式是使用`window.find()`方法,它可以在页面中查找指定的文本,并将匹配的文本高亮显示。可以在React组件中通过`componentDidMount()`或者`useEffect()`钩子函数调用该方法,例如: ```jsx import React, { useEffect, useRef } from 'react'; function SearchableText({ text }) { const searchRef = useRef(null); useEffect(() => { if (searchRef.current) { const isMatch = window.find(searchRef.current.value, false, false, true, false, true, false); if (!isMatch) { window.getSelection().removeAllRanges(); } } }, [text]); return ( <div> <input type="text" ref={searchRef} placeholder="Search..." /> <p>{text}</p> </div> ); } ``` 这个组件会在`text`属性发生变化调用`window.find()`方法,将搜索框中的文本作为参数传递给它。如果找到了匹配的文本,它会将匹配的文本高亮显示;如果没有找到匹配的文本,它会清空高亮显示。 另一种实现方式是使用第三方库,例如react-highlight-words或者react-text-highlight。这些库可以方便地在React应用中实现搜索高亮功能,同还提供了更多的定制化选项。例如,使用react-highlight-words库可以这样实现: ```jsx import React from 'react'; import Highlighter from 'react-highlight-words'; function SearchableText({ text }) { return ( <div> <Highlighter highlightClassName="highlight" searchWords={[this.state.searchText]} autoEscape={true} textToHighlight={text} /> </div> ); } ``` 这个组件使用Highlighter组件将`text`属性作为`textToHighlight`属性传递给它。搜索框中的文本作为`searchWords`属性传递给它,它会自动在`text`中查找匹配的文本并高亮显示。`highlightClassName`属性用于指定高亮文本的CSS类名。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值