我在ARM M7上创建了一个相当基本的测试设备(NXP S32 KXXX)MCU并使用劳特巴赫Trace 32进行调试。基本上它所做的就是读取一些以太网帧并发送一些响应帧来模拟一些实际硬件。我正在使用FreeRTOS设置一些任务来处理输入,输出和之间的简单处理。无论如何,我让它启动并运行,它将发送消息,但头部和有效载荷是混乱的,所以我去调试它,看看我做错了什么。
我把调试器挂接进去并启动,它会很好地命中函数的断点,但是变量显示为0,局部变量,堆栈,甚至全局常量。当关联回Map文件时,内存转储显示了同样的事情。奇怪的是,即使变量在后台工作时,它们也没有更新。
例如,我有一个简单的for循环,它运行了一些可变数量的计数,调试器将单步执行该for循环正确的次数,但本地索引将显示为0的整个时间。文件全局变量,如总循环计数,也不会显示为更新。
ASM甚至显示它使用正确的指令来更新内存值,但它们没有显示任何更改。在写入时设置断点也没有触发。之后它不会重置,并且在.data段初始化后从未显示任何更改。我可以使用调试器将值设置为新值,但似乎运行的代码没有,至少在可见的情况下。
它几乎看起来像是被限制在缓存中,永远不会命中内存,但我试过强制缓存刷新,我想我没有启用它,MPU保护也应该关闭。我唯一能想到的是FreeRTOS(不受保护的配置)与Trace 32的工作方式冲突(我也启用了Trace 32 FreeRTOS插件)。Trace 32也没有正确识别任务和队列,虽然我不知道这是一个原因或结果,没有看到更新值在它寻找.另一件事可能是使用恩智浦S32 DS和Windriver Diab编译,如果不玩好FreeRTOS或东西.
在这一点上,我不知道是什么原因导致的问题。我是新的这个特定的芯片和Trace 32,但我从来没有见过这样的行为。另外,我周围的其他人也同样困惑于这种故障模式,他们比我更有经验。
其他解决方案尝试:
我为EVB和调试器尝试了不同的硬件,添加了各种级别的优化(was -O 0),将变量从局部变量更改为全局变量,将一些变量定义为volatile,初始化为不同的值(它将永远显示它的.data值),调整链接中的内存范围,添加一个应该占用缓存的虚拟任务,检查MPU区域和FreeRTOS的受保护任务。我尝试在运行as in this question时强制变量更新,但这并不影响结果。
1条答案
按热度按时间sbtkgmzw1#
在与支持人员合作并深入研究文档后,我最终找到了答案。劳特巴赫文档有点密集,很难解析,但在帮助下我找到了答案。我不能直接分享任何脚本,但我会描述像我这样不熟悉所有这些选项的人最终很难找到的小变化。
核心问题是访问端口没有配置在更高的访问模式下,因此无法回避缓存和内存保护。尝试设置MPU旁路
SYStem.Optio.MPUBYPASS ON
引发了一个错误,该错误指向访问类与该功能不兼容。简而言之,最终需要的只是将
SYStem.MemAccess
从DAP
更改为AHB
。这种模式能够更直接地访问内存和缓存。有了这个,一切都工作得很好,一切都对我来说都是可见的。注意事项:这似乎有点依赖于特定的MCU及其设施。这并不一定在所有芯片上都支持,因此这可能不是一个通用的解决方案,但至少如果你看到类似的问题,访问类可能是一个可以查看的地方。只是一定要交叉引用您的MCU文档。
有关访问类别设置选项,请参阅info上的Lauterbach documentation(特别是p34 c.2023)。