[ English | 简体中文 ]
Feature Trace API
Feature 框架中用于性能追踪(trace)打点的宏定义。这些宏在启用时调用 NuttX 的 sched_note 接口记录事件,未启用时展开为空操作。
头文件:#include <feature_trace.h>
openvela 实现说明
- 条件编译:所有 trace 宏由
CONFIG_FEATURE_USE_SCHED_NOTE配置项控制- 启用时,展开为
sched_note_*系列调用,使用NOTE_TAG_ALWAYS标签 - 未启用时,展开为空操作(不产生任何 CPU / 内存开销),适合生产环境编译
- 启用时,展开为
- 依赖:依赖 NuttX 内核的
sched_note机制,需同时启用CONFIG_SCHED_INSTRUMENTATION相关配置 - 使用场景:在 Feature 接口实现或 JS-Native 边界处打点,配合 openvela 的 trace 分析工具(如 SystemView、Perfetto)可视化性能瓶颈
- 成对使用:
FEATURE_NOTE_BEGIN*/FEATURE_NOTE_END*必须成对调用,否则 trace 事件配对会失败
基础打点宏
FEATURE_NOTE_PRINTF
FEATURE_NOTE_PRINTF(format, ...)
以格式化字符串打点,类似 printf。用于记录自定义调试信息。
参数:
format格式化字符串。...可变参数列表,与 format 占位符对应。
FEATURE_NOTE_BEGIN
FEATURE_NOTE_BEGIN()
标记一段代码执行的开始(无附加信息)。必须与 FEATURE_NOTE_END 成对使用。
FEATURE_NOTE_END
FEATURE_NOTE_END()
标记一段代码执行的结束。与最近一次 FEATURE_NOTE_BEGIN 配对。
带标签的打点宏
FEATURE_NOTE_BEGIN_STR
FEATURE_NOTE_BEGIN_STR(str)
带字符串标签的起始打点,用于标识代码段的语义。
参数:
str事件标签字符串,该字符串需在整个 trace 事件期间保持有效。
FEATURE_NOTE_END_STR
FEATURE_NOTE_END_STR(str)
带字符串标签的结束打点,与对应 FEATURE_NOTE_BEGIN_STR 的标签一致。
参数:
str事件标签字符串(必须与起始打点的标签一致)。
FEATURE_NOTE_MARK
FEATURE_NOTE_MARK(str)
打一个即时标记点,不需要配对。用于在时间线上标记单一事件。
参数:
str标记标签字符串。
作用域打点宏
FEATURE_NOTE_BEGIN_LOCAL / FEATURE_NOTE_END_LOCAL
FEATURE_NOTE_BEGIN_LOCAL(str)
// 被追踪的代码
FEATURE_NOTE_END_LOCAL()
带局部变量作用域的起止打点。内部通过局部变量保存标签,避免上层代码传参复杂。
参数:
str事件标签字符串。
使用示例:
void my_feature_func(void)
{
FEATURE_NOTE_BEGIN_LOCAL("my_feature_func");
// ... 业务逻辑 ...
FEATURE_NOTE_END_LOCAL();
}
注意:
FEATURE_NOTE_BEGIN_LOCAL与FEATURE_NOTE_END_LOCAL必须在同一作用域内成对使用,宏内部使用do { ... } while(0)模式封装,依赖编译器能够识别作用域。- 宏内部会引入名为
note_temp_str的局部变量,同一作用域内不要使用该变量名。