Lauterbach脚本读取外设定时器报内存访问错误,如何检测函数2ms周期调用?
定时器内存访问报错的解决方法
出现memory access not allowed错误,可按以下顺序排查修复:
- 核对地址空间前缀:当前使用的
D:前缀对应普通内核数据空间,若该定时器是外设总线挂载的MMIO寄存器,需根据架构切换为外设专用访问前缀(例如ARMv8架构需替换为DP:前缀),读取命令调整为Data.Long(DP:0xF00001010)。 - 配置调试端内存映射权限:若该外设地址段未加入Lauterbach可访问范围,需执行
MAP.AddRange 0xF0000000 0xF000FFFF NOEXE NOCACHED,将对应地址段加入调试端可访问表,避免被硬件访问保护拦截。 - 匹配安全调试模式:若该定时器地址处于TrustZone安全域,需提前开启对应安全调试权限,否则非安全调试连接会直接被外设访问拦截。
原脚本存在核心逻辑缺陷:普通halt型断点触发后CPU会立刻停止运行,此时所有定时器计数都会冻结,即便内存访问正常,两次读取的计数值差值也无法代表真实的函数调用间隔。
高精度周期检测替代方案(无需手动读取定时器寄存器)
依托Lauterbach内置硬件跟踪能力,可实现微秒级精度的周期检测,完全规避手动读外设寄存器的权限问题:
- 设置非halt型跟踪断点:替换原有的普通断点命令为
Break.Set func1 /Program /Trace /Resume,该命令会在func1被命中时自动记录当前的核心级高精度时间戳,同时不打断CPU全速运行。 - 配置跟踪缓冲容量:提前在TRACE窗口设置足够的缓冲空间(例如存储20次func1的触发记录),保证能连续采集多轮函数调用的时间点。
- 运行目标采集数据:全速运行目标程序直到跟踪缓冲采集到足够样本,直接读取相邻两次func1触发的时间戳差值,判断是否稳定落在2ms的允许误差范围内即可。
- 该方案的时间戳直接与核心时钟同步,精度远高于通用运行时计时函数,不存在外设内存访问权限的问题。
内容的提问来源于stack exchange,提问作者sandra
相关产品推荐
相关产品推荐

