刘火良 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 调试工具链的一部分,用于监控任务延迟行为。
  • 自定义​:通过重定义该宏,可集成日志、性能分析工具或自定义跟踪逻辑。
  • 建议​:在调试阶段启用,发布版本中禁用以减少开销。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值