在 C 程序中、将使用8k RAM 的上部。
在测试之前、我已从 Allen Gao 的螺纹中进行了推荐设置。 结果是链接器在 RAM 中使用了高位地址范围。 这可以在堆栈指针和寄存器12、13和14的显示值中看到。 然而、寄存器12、13和14的值有时只被写入 RAM。
为什么只将寄存器的 HI 部分写入 RAM 中?
为什么这种情况只会发生、而不是在同一个 C 代码行中执行每个写入操作?
注意:每次执行 c 代码行时都会发生错误。 区别在于、寄存器12、13和14的不同寄存器没有完全写入到堆栈中。
这是发生问题的 c 代码行的汇编代码以及分步处理的结果:
1: 966 void savePosAndVelInSensors(float *lon, float *lat, unsigned int *alt, unsigned char *vel){ savePosAndVelInSensors(): // this is the head of the function 2: 042864: 00B1 0010 SUBA #0x00010,SP // SP: 0x003BD0 3: 042868: 0F71 000C MOVA R15,0x000c(SP) // SP: 0x003BC0, R15: 0x002A60 4: 04286c: 0E71 0008 MOVA R14,0x0008(SP) // R14: 0x003BDE 5: 042870: 0D71 0004 MOVA R13,0x0004(SP) // R13: 0x003BDA 6: 042874: 0C71 0000 MOVA R12,0x0000(SP) // R12: 0x003BD6 7: 968 itoha((uint8_t*)lon,(uint8_t*)&sensors.lon[1],4); // this is the first line inner the function... 8: 042878: 008D 5383 MOVA #0x05383,R13
执行第2行后、我手动写入存储器以查看 CPU 的写入操作:
0x003BC0:11 11 11 11 11 11 11 11 11 11 11 11 11.
存储器(堆栈)的变化如下:
第3行之后:
0x003BC0:11 11 11 11 11 11 11 11 11 11 11 11 00 00
第4行之后:
0x003BC0:11 11 11 11 11 11 11 11 11 00 11 11 00 00 00
第5行之后:
0x003BC0:11 11 11 DA 3B 00 11 00 11 00 11 00 00
第6行之后:
0x003BC0:11 00 00 DA 3B 00 11 00 11 00 11 00 11 00 00 00
可以看出、在这种尝试中、寄存器15、14和12的内容没有完全到达堆栈。 只有寄存器13的内容被完全写入堆栈。 在其他尝试中、会写入其他寄存器、而其他寄存器不会写入。
LEACNF0的内容为0x00000001。 程序段不会被中断(GIE = 0)中断。
注:DMA 通道会影响堆栈内容。
此 DMA 通道由 UART (9600波特)的接收触发。 接收到的字节被写入 RAM 中的一个数组(不同的地址范围)。 此写入操作正常。 如果在第3行被处理前、向通道的 DMACTL 寄存器写入0、那么对堆栈的所有写入操作都将被正确执行。
您是否有任何关于此连接的来源的想法? 您是否知道如何解决此问题?
此致
哈迪