当前位置: 首页 > news >正文

刘火良 FreeRTOS内核实现与应用之5——补充知识(宏)

1. 断言

 configASSERT(x)

configASSERT( uxSchedulerSuspended == 0 ); 

引用了一系列的宏:

#define vAssertCalled(char,int) printf("Error:%s,%d\r\n",char,int)

#define configASSERT(x) if((x)==0) vAssertCalled(__FILE__,__LINE__)

备注:

 configASSERT(x):断言宏,如果 x 为 0(假),则调用 vAssertCalled 打印错误信息。

我的理解:x为真 断言宏不触发打印错误信息。

适用场景​:

  • 嵌入式系统​(如FreeRTOS,因为 configASSERT 是常见宏名)
  • 调试阶段,用于捕获非法状态
  • 替代标准库 assert(),提供自定义错误输出

如果需要进一步优化(如触发断点、重启系统等),可以在 vAssertCalled 里添加相应代码。

mtCOVERAGE_TEST_MARKER()

是一个 ​代码覆盖率测试的标记宏,主要用于 ​静态分析工具​(如 LDRA、Coverity、gcov 等)在覆盖率测试时识别未被执行的代码路径。以下是详细解析:


1. 作用

  • 标记不可达代码​:
    当某些代码分支在测试中 ​理论上不可能被执行​(例如,防御性编程中的错误处理分支),但为了满足覆盖率工具的要求(避免报告“未覆盖”的警告),用此宏标记。
  • 兼容性处理​:
    在覆盖率测试模式和非测试模式下,宏的行为不同:
    • 测试模式​:会被替换为可追踪的语句(如 printf 或空操作指令)。
    • 生产模式​:通常定义为空,不生成任何实际代码。

2. 典型使用场景

​(1) 防御性编程中的冗余检查

if( xParameter > MAX_VALUE ) {
/* 理论上不应进入此分支,但为防止极端情况保留 */
mtCOVERAGE_TEST_MARKER();  // 覆盖率工具会识别此标记
}

 (2) switch-case 的 default 分支

switch( xState ) {
case STATE_A: /* ... */ break;
case STATE_B: /* ... */ break;
default:
mtCOVERAGE_TEST_MARKER();  // 标记未覆盖的默认分支
break;
}

 

3. 实现方式

在 FreeRTOS 的 FreeRTOSConfig.h 中可能如下定义:

/* 覆盖率测试模式 */
#if defined( COVERAGE_TEST )
#define mtCOVERAGE_TEST_MARKER() do { \
volatile int __unused = 0;       \  // 防止编译器优化
(void)__unused;                 \
} while(0)
#else
/* 生产模式下无操作 */
#define mtCOVERAGE_TEST_MARKER() 
#endif

 

4. 与类似宏的对比

用途
mtCOVERAGE_TEST_MARKER()标记 ​逻辑上不可达但需保留的代码​(覆盖率测试用)。
configASSERT()运行时断言,用于检测非法条件(通常在生产模式下禁用)。
traceTASK_SWITCHED_IN()调试追踪宏,记录任务切换事件(与覆盖率无关)。

 

总结

  • 本质​:一种 ​代码覆盖率测试的占位符,平衡了防御性编程的严谨性和覆盖率工具的要求。
  • 中文语境​:可译为 ​​“覆盖率测试标记”​​ 或 ​​“不可达代码标记”​
  • 价值​:帮助团队在保证代码质量的同时,减少误报的覆盖率警告。

2. 调试追踪宏(Trace Macro)

traceTASK_DELAY() 

在 FreeRTOS 中,traceTASK_DELAY() 是一个 ​调试追踪宏(Trace Macro)​,通常用于在任务调用 vTaskDelay() 或 vTaskDelayUntil() 时触发跟踪事件,帮助开发者分析任务调度行为。以下是详细解析:


1. 作用

  • 调试与性能分析​:
    当任务主动延迟(如调用 vTaskDelay())时,traceTASK_DELAY() 会被触发,记录任务的延迟行为,便于:

    • 分析任务调度时序。
    • 检测任务是否因延迟导致实时性不足。
    • 统计任务休眠时间。
  • 可配置性​:
    该宏默认可能是空定义(无操作),需用户根据调试需求实现(如打印日志、记录时间戳等)。


2. 典型使用场景

​(1) 在 vTaskDelay() 中调用

FreeRTOS 内核源码中,vTaskDelay() 的实现会调用此宏:

void vTaskDelay( const TickType_t xTicksToDelay ) {
/* ... 其他代码 ... */
traceTASK_DELAY();  // 触发延迟跟踪
/* ... 进入阻塞状态 ... */
}

3. 如何自定义实现?​

若需启用跟踪功能,需在 FreeRTOSConfig.h 中定义该宏。例如:

​(1) 简单打印日志

#define traceTASK_DELAY() \
printf("[Trace] Task %s delayed at tick %lu\n", pcTaskGetName(NULL), xTaskGetTickCount())

 

4. 相关宏

FreeRTOS 提供了一系列类似的调试宏,例如:

触发时机
traceTASK_CREATE()任务创建时
traceTASK_SWITCHED_IN()任务切换进入时
traceMOVED_TASK_TO_READY_STATE()任务移至就绪列表时
traceBLOCKING_ON_QUEUE_RECEIVE()任务因队列接收阻塞时

总结

  • 用途​:traceTASK_DELAY() 是 FreeRTOS 调试工具链的一部分,用于监控任务延迟行为。
  • 自定义​:通过重定义该宏,可集成日志、性能分析工具或自定义跟踪逻辑。
  • 建议​:在调试阶段启用,发布版本中禁用以减少开销。
http://www.dtcms.com/a/275538.html

相关文章:

  • [Python] -实用技巧篇1-用一行Python代码搞定日常任务
  • Effective Modern C++ 条款9:优先考虑别名声明而非typedef
  • C++法则21:避免将#include放在命名空间内部。
  • Java-71 深入浅出 RPC Dubbo 上手 父工程配置编写 附详细POM与代码
  • Java使用Langchai4j接入AI大模型的简单使用(一)
  • 【跟我学运维】chkconfig jenkins on的含义
  • 使用 Java 开发大数据应用:Hadoop 与 Java API 的结合
  • Gas and Gas Price
  • MCP选型指南:AWS vs Azure vs GCP vs 国内云厂商深度对比
  • 从 Spring 源码到项目实战:设计模式落地经验与最佳实践
  • 批量自动运行多个 Jupyter Notebook 文件的方法!!!
  • 13. G1垃圾回收器
  • Edge浏览器:报告不安全的站点的解决方案
  • 【字符串移位包含问题】2022-8-7
  • Kotlin文件操作
  • 浅谈 Python 中的 yield——yield的返回值与send()的关系
  • Ether and Wei
  • Spring 框架中的设计模式:从实现到思想的深度解析
  • 贪心算法题解——跳跃游戏【LeetCode】
  • AI大模型(七)Langchain核心模块与实战(二)
  • Android音视频探索之旅 | C++层使用OpenGL ES实现视频渲染
  • CTFHub————Web{信息泄露[Git泄露(log)]}
  • 《Java Web程序设计》实验报告五 Java Script学习汇报
  • Redis Geospatial 功能详解及多边形包含判断实现
  • win10安装Rust Webassembly工具链(wasm-pack)报错。
  • Rust Web 全栈开发(五):使用 sqlx 连接 MySQL 数据库
  • Rust Web 全栈开发(六):在 Web 项目中使用 MySQL 数据库
  • 前端note
  • 【推荐】前端低端机和弱网环境下性能优化
  • 前端面试专栏-算法篇:24. 算法时间与空间复杂度分析