Skip to content

支持对 RAM 代码区的调用栈回溯 - #93

Open
Baseline-K wants to merge 1 commit into
armink:masterfrom
Baseline-K:feature/ram-code-backtrace
Open

支持对 RAM 代码区的调用栈回溯#93
Baseline-K wants to merge 1 commit into
armink:masterfrom
Baseline-K:feature/ram-code-backtrace

Conversation

@Baseline-K

@Baseline-K Baseline-K commented Aug 10, 2026

Copy link
Copy Markdown

背景

Cortex-M7 等 MCU 允许把对时序要求高的函数放到 RAM 中执行(如 ITCM),
会把固件拆分成多个代码区。这些函数的地址落在CMB_CODE_SECTION_NAME(Flash)之外,
原回溯扫描会把所有跨过 Flash 边界的帧当作无效帧丢弃——调用栈恰好断在最关键的代码处。

改动

新增可选的多代码区回溯支持,代码区采用可自定义的表格声明:

  • cmb_cfg.h:新增开关 CMB_USING_USER_CODE_SECTION;开启后可用
    CMB_USER_CODE_SECTIONS 配置额外代码区——一个 const 的
    { start, end } 结构体数组初始化器,可声明任意多个代码区
    (ITCM、CCM、其他Flash区等)
  • cmb_def.h:新增 CMB_CODE_REGION_MAX(默认 8),代码区表容量上限,
    仿 CMB_CALL_STACK_MAX_DEPTH#ifndef 默认值,可在 cmb_cfg.h 覆盖
  • cm_backtrace.ccm_backtrace_init() 填充代码区表 code_regions[]
    (自动检测的 Flash 区在前,随后按 CMB_USER_CODE_SECTIONS 追加);
    将原单区域判定替换为 cmb_pc_in_code() / cmb_pc_in_code_skip_first()
    遍历所有已登记区域
  • 未定义 CMB_USING_USER_CODE_SECTION 时,所有新增代码均被预处理裁剪,
    与 v1.5.0 逐字节一致

@armink

armink commented Aug 10, 2026

Copy link
Copy Markdown
Owner

感谢你的 PR 。我建议最好能支持自定义的 Section 这样会更加灵活

  • 自定义 Section 是 Section 的结构体数组,const 类型
  • 在 cmb_cfg.h 中可配置这个预定义的宏

@Baseline-K
Baseline-K force-pushed the feature/ram-code-backtrace branch from c9a6af4 to f96210a Compare August 10, 2026 07:53
@Baseline-K

Copy link
Copy Markdown
Author

感谢建议!已按您的意见改为「自定义代码区表」方案:

  • 移除了原先按链接符号自动检测 RAM 区的做法(CMB_RAM_CODE_SECTION_NAME / CMB_RAM_CODE_SECTION_START/END
  • 新增 CMB_USER_CODE_SECTIONS:在 cmb_cfg.h 中配置一个 const 的 { start, end } 结构体数组初始化器,可声明任意多个额外代码区;Flash 区仍由 CMB_CODE_SECTION_NAME 自动检测,无需手工填写
  • 未定义 CMB_USING_RAM_CODE_SECTION 时,所有新增代码均被预处理裁剪,与 v1.5.0 逐字节一致

请再帮忙 review 一下,谢谢!

Cortex-M7 etc. can execute time-critical functions from RAM (ITCM) or
split the firmware across multiple code regions. The default scan only
recognizes one Flash code region (CMB_CODE_SECTION_NAME), so frames that
cross the Flash boundary are dropped and the call stack breaks at the
most critical code.

Add an optional user code section backtrace:
- cmb_cfg.h: CMB_USING_USER_CODE_SECTION switch; when ON, CMB_USER_CODE_SECTIONS
  declares extra code regions as a const {start,end} array initializer.
  Flash is always auto-detected via CMB_CODE_SECTION_NAME.
- cmb_def.h: CMB_CODE_REGION_MAX (default 8), the code region table capacity.
- cm_backtrace.c: cm_backtrace_init() fills code_regions[] (Flash first, then
  user-defined); cmb_pc_in_code()/cmb_pc_in_code_skip_first() walk the table.
- When CMB_USING_USER_CODE_SECTION is not defined all new code is stripped by
  the preprocessor, byte-identical to v1.5.0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Baseline-K
Baseline-K force-pushed the feature/ram-code-backtrace branch from f96210a to 890636d Compare August 10, 2026 08:45
@Baseline-K

Baseline-K commented Aug 10, 2026

Copy link
Copy Markdown
Author

补充:把命名统一改成了「用户代码区」——开关为 CMB_USING_USER_CODE_SECTION
CMB_CODE_REGION_MAX(代码区表容量上限,默认 8)移到了 cmb_def.h
请再帮忙看一下,谢谢!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants