Gcc cortex M4中的外部SRAM上的LDMIA指令无法正常工作

Gcc cortex M4中的外部SRAM上的LDMIA指令无法正常工作,gcc,memory,arm,ram,cortex-m,Gcc,Memory,Arm,Ram,Cortex M,我在拇指模式下使用STM32L486ZG板。我正在运行一个没有任何RTO的简单裸机应用程序。我使用FSM将外部SRAM连接到电路板。外部SRAM位于地址0x60000000处。系统已初始化并在72MHz下运行(我已尝试在18-80 MHz的频率下解决此问题),现在在我的主要功能中,我有以下代码: int main(){ asm volatile ( "push {r0}\n" "mov r0, #0x60000000\n"

我在拇指模式下使用STM32L486ZG板。我正在运行一个没有任何RTO的简单裸机应用程序。我使用FSM将外部SRAM连接到电路板。外部SRAM位于地址0x60000000处。系统已初始化并在72MHz下运行(我已尝试在18-80 MHz的频率下解决此问题),现在在我的主要功能中,我有以下代码:

int main(){
    asm volatile (
            "push {r0}\n"
            "mov r0, #0x60000000\n"
            "add r0, #0x400\n"
            "stmdb r0!, {r1-r12}\n"
            "ldmia r0!, {r1-r12}\n"
            "pop {r0}\n"
            );
}
根据此代码,在执行此主函数后,不应更改任何寄存器,但在执行以下指令后,情况并非如此

ldmia r0!, {r1-r12}
ldmia r0!, {r1-r12}
ldmia r0!, {r1-r12}
i、 e.
r9
执行后不正确
stmdb
指令工作正常,但
ldmia
未正确加载数据。我已经通过查看内存中的内容验证了这一点

对于
ldmia
指令中的任何参数,此问题始终存在:第9个寄存器始终受到影响

说明: 假设我正在调试此代码,下一条要执行的指令如下:

stmdb r0!, {r1-r12}
升级后,所有这些寄存器都保存在内存中,
r0
的值为
0x600003d0

内存的内容:

0x600003D0  00000000 40021008 0000000C  .......@....
0x600003DC  40000000 00000000 00000000  ...@........
0x600003E8  20017FEC 00000000 00000000  ì.. ........
0x600003F4  00000000 00000000 00000000  ............
登记册的内容:

r0  0x600003d0
r1  0x00000000
r2  0x40021008
r3  0x0000000c
r4  0x40000000
r5  0x00000000
r6  0x00000000
r7  0x20017fec
r8  0x00000000
r9  0x00000000
r10 0x00000000
r11 0x00000000  
r12 0x00000000
r0  0x60000400
r1  0x00000000
r2  0x40021008
r3  0x0000000c
r4  0x40000000
r5  0x00000000
r6  0x00000000
r7  0x20017fec
r8  0x00000000
r9  0x555555d5
r10 0x00000000
r11 0x00000000
r12 0x00000000
这表明所有寄存器都成功保存在内存中。现在我开始下一个指令

ldmia r0!, {r1-r12}
ldmia r0!, {r1-r12}
ldmia r0!, {r1-r12}
此后 以下是寄存器的内容:

r0  0x600003d0
r1  0x00000000
r2  0x40021008
r3  0x0000000c
r4  0x40000000
r5  0x00000000
r6  0x00000000
r7  0x20017fec
r8  0x00000000
r9  0x00000000
r10 0x00000000
r11 0x00000000  
r12 0x00000000
r0  0x60000400
r1  0x00000000
r2  0x40021008
r3  0x0000000c
r4  0x40000000
r5  0x00000000
r6  0x00000000
r7  0x20017fec
r8  0x00000000
r9  0x555555d5
r10 0x00000000
r11 0x00000000
r12 0x00000000
正如您所看到的,除了
r9
之外,所有寄存器都被恢复,该寄存器的值奇怪地从
0x60000000
而不是
0x600003F0
中“弹出”

知道是什么导致了这个问题吗。我正在使用Jlink写入flash

注意:当寄存器保存到onchip SRAM而不是外部SRAM时,不会发生此问题

编辑 如果指令

ldmia r0!, {r1-r12}
ldmia r0!, {r1-r12}
ldmia r0!, {r1-r12}
分为两部分,如:

ldmia r0!, {r1-r6}
ldmia r0!, {r7-r12}

然后成功恢复所有寄存器

您需要读取STM32L4xx6xx硅限制。第2.2.4节FMC不支持九个字或更多字的读突发访问。(DocID026121第4版)可从ST

“CPU读突发访问等于或大于9个寄存器到FMC返回损坏的数据 从第9个读取字开始。这些突发只能由Cortex®-M4 CPU生成 而不是由其他主机(即,不是由DMA)。 当堆栈重新映射到FMC上的外部内存时,会发生此问题,并且 POP操作使用9个或更多寄存器执行。
当LDM/VLDM操作与9个或更多寄存器一起使用时,也会发生这种情况。”

“我运行一个简单的裸机应用程序,没有任何RTO。我使用FSM将外部SRAM连接到板上”。。。什么是FSMAre?超过9的寄存器总是正确的?它在32字节边界上明显出现错误的事实闻起来有点像地址线没有正确连接或者内存控制器没有正确配置(特别是在AHB突发分裂和/或定时方面)@Notlikethat是的,它们总是正确的,只有第9个是错误的。如果它们不正确,那么它可能意味着一些地址包装问题的发现——事实上,这听起来像是一个“在管脚上打一个逻辑分析仪并检查计时”类型的问题,再加上根据SRAM数据表仔细交叉检查FSMC配置(当然,假设您的电路板布局良好)。可能比编程更重要。你能试着将已知值放入R8到R12中并存储它们,然后加载它们吗?从你的代码中不能断定问题只存在于R9,因为寄存器可能已经是0。它还提供了解决方法。我只在这里放了一个片段。谢谢,这真的很有帮助