主题中讨论的其他器件: MSP430FR5949、 MSP-FET
您好、CPU 专家、
在 C 程序中、将使用8k RAM 的上部。
我在 lnk_msp430fr5994.cmd 文件中使用 Allen Gao 的线程进行了建议的设置。 结果是链接器在 RAM 中使用了高位地址范围。 这可以在堆栈指针和寄存器12、13和14的显示值中看到。 然而、寄存器12、13、14和15的值有时只被写入 RAM。
为什么只将寄存器的 HI 部分写入 RAM 中?
为什么这种情况只会发生、而不是在同一个 C 代码行中执行每个写入操作?
注意:每次执行 c 代码行时都会发生错误。 区别在于、寄存器12、13、14和15的不同寄存器未完全写入栈。
这是发生问题的 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
在调试器的单步操作过程中、连接的 GPS 接收器会不断向 UART 提供数据。
执行第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的内容被完全写入到堆栈中、在执行这个 C 语言行的其他尝试中、其它寄存器被写入、其它寄存器不被写入。
LEACNF0的内容为0x00000001。 程序段不会被中断(GIE = 0)中断。
注意:DMA1通道会影响堆栈内容。
此 DMA 通道由 UART (9600波特)的接收触发。 CPU 以8MHz 的频率运行。 接收到的字节被写入 RAM 中的一个数组(不同的地址范围)。 此写入操作正常。 DMAC 将每个接收到的字节写入接收缓冲区。 接收到的 NEMA 数据的校验和计算结果为"正确"。 DMAC 写入的数据不会超过此范围。 如果在第3行被处理前将0x0000写入通道的 DMA1CTL 寄存器、CPU (第3行-第6行)对堆栈的所有写入操作将被完全执行。
最重要的问题是:这是芯片问题还是外部电路问题? 如何避免这个问题? 是在未使用 RAM 的上部4K 或未使用与堆栈相关的 MOVA 指令或未使用与 DMA 相关的 MOVA 指令或未使用 RAM 的 DMA 功能时完全执行的写入操作 还是不同的背景?
此致
哈迪