This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR5994:向堆栈写入的值不正确(使用8K RAM)

Guru**** 2390755 points
Other Parts Discussed in Thread: MSP430FR5994

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1037701/msp430fr5994-incorrect-values-are-written-to-the-stack-use-of-8k-ram

器件型号:MSP430FR5994

在 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、那么对堆栈的所有写入操作都将被正确执行。

您是否有任何关于此连接的来源的想法? 您是否知道如何解决此问题?

此致
哈迪

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果在禁用 DMAC 时堆栈操作正常工作、这就强烈表明使用 DMAC 会产生问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 David:

    感谢您的回答。

    DMA 目标存储器的内容是正确的、DMAxDA 寄存器指向 RAM 中较低的存储器区域、而 DMASZ 寄存器的值不能到达堆栈。 当调试器到达断点时、是否有办法检查内部 DMA 写入寄存器的实际内容? 然后、我可以看到控制器此时写入的位置。

    太棒了
    哈迪

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    内部指针不可用、但可以从 DMA 配置推断其可能的值。 虽然 DMA 和 CPU 访问之间可能存在一些以前未知的冲突、但智能资金并不能用于此目的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这行思路是否相当于 DMAC 写入错误地址? 然后、必须在 RAM 中看到存储器单元的新内容。 这里的问题是、堆栈上寄存器低电平应被写入的位置不会改变。 此外、不能看到其他单元格是随机变化的。 您是否知道我如何找到问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="198290" URL"~/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1037701/msp430fr5994-incorrect-values-are-written-to-the-stack-use-of-8k-ram/3836901 #3836901"]这行思路是否相当于 DMAC 写入错误地址的行为?

     MSP430FR5994包含嵌入式仿真模块(EEM)(S 版本)、支持 DMA 事件触发(根据 使用 Code Composer Studio 版本6的增强型仿真模块(EEM)进行高级调试)

    您应该能够为 DMA 写入一个地址范围时设置一个断点。 请参阅 《适用于  MSP430 MCU 的 Code Composer Studio IDE v10.x 用户指南》中的" DMA 传输范围中断"

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢你。 我将会看一下。
    我可以看到 DMAC 在哪里写入从 UART 接收到的每个字符。 每个字符进入指定的接收缓冲区。
    但我看到 MOVA 命令(第3、4、5和6行)没有完全执行。 至少其中一条命令的 Lo 部分不会写入栈区域。 堆栈未被错误写入。 在这些情况下、根本不会写入低电平部分。 它也不是由 DMAC 写入的。 我与调试器一起编写的内容仍保留在其中。
    谁会阻止编写内容? 如何解决问题?
    许多问候语
    哈迪

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    再次提出同样的问题、但主题略有不同、这充其量是很烦人的。

    由于在禁用 DMA 时问题似乎消失了、因此问题很可能存在于此处、但您尚未显示 DMA 配置代码。

    如果 MOVA 指令出现问题、那么您需要知道它是否也影响了等效的 MOVX.A 指令。 或者对于您的特定序列、PUSHM.A 指令。

    此外、问题通常仅在于 LEARAM 还是 RAM?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我再问这个问题,是因为我觉得答案是完全不同的。
    同时、我发现活动 LEA 和非活动 LEA 存在问题、即在较低和较高4K 中存在问题。

    它仅在 DMAC 由 UART 触发时存在。 例如、如果 DMAC 由计时器触发、则问题不存在。 然后、MOVA 命令传输完整值。