大家好、
你好。 我代表客户发布此查询。
"我正在使用一个程序、尝试通过 AHB 访问 GPIO 端口。 使用-O0进行编译时、所有内容均按预期工作、且反汇编的伪代码如下所示:
...STR 指令用于启用 GPIO 端口 MOV 指令的 AHB、以准备通过 AHB 读取 GPIO 端口所需的 GPIO 端口存储器地址 nextLDR 指令...
但是、当使用-O1编译时、执行时会引发一个故障。 我通过调试将故障原因缩小到上述代码部分、发现这次反汇编代码与上述代码相同、除了省略 MOV 指令(而是在代码中提前准备存储器地址)。 因此、启用 AHB 并尝试在下一条指令中立即访问它似乎会导致问题。
我的理解是、这是由于以下两个原因之一:
1) 1)出现指令同步问题、需要适当的存储器屏障来修复、或
2) 2)发生了硬件延迟问题、需要适当的延迟才能转置以解决。
如果1)正确、则应在 STR/LDR 之间插入哪条隔离指令来解决此问题? 《 ARM Cortex -M 存储器边界指令编程指南 》应用手册中的答案无法确定。 如果2)是正确的、那么建议采用什么方法来确保总线在启用时准备好使用? 没有与 GPIO (PRGPIO)类似的用于检查总线的相关就绪位寄存器。
我认为2)这是正确的、因为问题仅在以全速执行程序时发生、而不是在使用调试器单步执行这些指令时发生(如果此评估错误、请纠正我的错误)。 我还在 Tiva TM4C123GH6PM 微控制 器数据表中找不到任何关于总线同步/延迟特性的说明。
感谢您的任何帮助。"
请提供建议。 感谢您的支持。
此致、
Marvin