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.

[参考译文] TMS320F28379D:奇怪的处理器行为:错误的指令执行?

Guru**** 2606375 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1060593/tms320f28379d-strange-processor-behavior-wrong-instruction-execution

器件型号:TMS320F28379D

我有一个局部变量 uint16_t* buf 指向 CPU1至 CPU2消息 RAM。 代码从 RAM 在 CPU2上执行。 我想将 buf[]的前两个元素解释为 uint32_t,因此我用 C 编写了:

address = *((uint32_t*)buf);

但不幸的是、我在局部变量"uint32_t address"中得到了意外结果。 我开始调试、无意中发现了一些我无法理解的意外行为。  上述代码已编译为以下汇编器指令序列:

       MOVL     ACC、*+XAR4[0]        ;[CPU_ALU]|204|
       MOVL     *-SP[4]、ACC          ;[CPU_ALU]|204|

但是、我会逐步运行该代码、结果很奇怪。 在我看来、第一条指令执行错误。 以下是在执行第一条指令之前的屏幕截图:

下面是"汇编步骤进入"之后的屏幕截图:

在执行第一条汇编指令后、我预计 ACC 寄存器将包含0x082000、但它包含0x20000081。 怎么可能呢?

此致、

Alex

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

    我已更换代码

      address = *((uint32_t*)buf);

    使用

       address = buf[1];
      address <<= 16;
      address |= (buf[0] & 0x0000FFFFUL);

    现在、该程序可以正常工作。 但我不明白第一个变体有什么问题。

    此致、

    Alex

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

    尊敬的 Alex:

    由于此变量位于 MSG RAM 中、可从 CPU1进行更新、因此您可能需要使用易失性变量并查看它是否能解决问题。

    此致、

    Vivek Singh

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

    您好、Vivek、

    这话什么意思? 您是说对"buf"指针使用 volatile、还是对它指向的变量使用 volatile? 实际上、"buf"是函数参数。

    我认为易失性在编译时很重要、但在运行时不重要。 在我看来、编译器的易失性 syas 无法缓存变量、无法优化对其的读取访问。 我弄错了吗?

    如屏幕截图所示、XAR4寄存器指向正确的地址(将其与表达式"&buf[0]进行比较)。 在执行指令""之前MOVL  ACC,*+XAR4[0]、ACC 寄存器被手动填充为假值0xA5A5A5A5、在执行指定的指令之后、它包含0x20000081。 这意味着 ACC 在执行这个指令期间被更新。 同时、表达式""*((uint32_t*)buf)(在"表达式"选项卡中)显示相应的值0x82000。 执行""之前和之后显示此值MOVL  ACC,*+XAR4[0]

    此致、

    Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="19481" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1060593/tms320f28379d-ex奇怪 的处理器行为错误的指令执行/3924456#3924456"]可从 CPU1进行更新

    在执行""之前、我已暂停 CPU1MOVL  ACC,*+XAR4[0] -结果相同-在 ACC 寄存器中获得了错误的值(0x20000081而不是0x82000)。 因此它不能从 CPU1更改 MSG RAM。

    调试选项卡表达式显示两个 CPU 上表达式*((uint32_t*) 0x3FC01的值0x00082000。

    此致、

    Alex

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

    Сan 这与奇数地址的32位访问有关

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

    我还在查看地址对齐。 buf[2]中的值是什么?

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

    您正是因为易失性才会在编译时和运行时产生影响。 我只是想、由于某种原因、CPU1会在您阅读时更新相同的位置、但您的新帖子确认这不是问题。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="19481" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1060593/tms320f28379d-ex奇怪 的处理器行为错误的指令执行/3925034#3925034]I 也在查看地址对齐。 buf[2]中的值是什么?

    buf[2]= 0x0010

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

    您是否还可以检查编译日志并查看是否有任何警告?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="19481" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1060593/tms320f28379d-ex奇怪 的处理器行为错误的指令执行/3925042#3925042"]您还可以检查编译日志并查看是否有任何警告[引用]

    没有任何警告。

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

    0x3FC00的值是什么?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="95472" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1060593/tms320f28379d-ex奇怪 的处理器行为错误的指令执行/3925031#3925031"]Сan 这与位于奇数地址的32位访问有关[?]

    我想我明白了。 对于 CLA、我发现了以下内容:

    与 C28x CPU 一样、CLA 期望存储器逻辑对齐任何32 -
    对偶数地址进行位读取或写入。 如果地址生成逻辑生成一个奇数地址、CLA
    将在之前的偶数地址开始读取或写入。

    TRM、第6.3.2部分 CLA 存储器总线

    值_Before_buf[0]为0x0081。 因此、从0x3FC00 (而不是 0x3FC01)读取会得到值0x20000081。

    因此、C28x 似乎从"之前的偶数地址"读取。 但我在 TRM 中搜索了子字符串"奇数地址"和"偶数地址"、并且没有找到有关 C28x 上32位存储器访问的信息、仅关于 CLA、CAN 和 USB。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="19481" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1060593/tms320f28379d-ex奇怪 的处理器行为错误的指令执行/3925060#3925060"],0x3FC00的值是什么?[/引用]

    你是对的。 这是0x0081

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

    好的、那么、基本上发生的情况是、当用户尝试访问奇数地址处的32位值时、它将奇数地址转换为偶数地址、然后从该地址处提供值、在本例中为0x3FC00。 在这种情况下、编译器应该已经给出了一些警告、但由于它不是、可能有一些开关来启用此类警告。 我必须就此向我们的编译器团队咨询。

    此致、

    Vivek Singh

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

    您能否尝试在 buf 声明后添加以下行、并查看这是否可以解决问题-

    #pragma DATA_ALIGN (buf、2);

    此致、

    Vivek Singh

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

    很抱歉、但我不明白我应该将此 pragma 放在哪里。

    我定义了一个结构类型

    typedef struct {
        uint16_t BL_cmd;
        uint16_t BL_data[20];  
    } C1C2_MSG_t;

    с1с2_msg类型的全局变量使用.cmd 文件放置在地址0x3FC00。 "buf"是函数的 uint16_t*参数:

    void my_func(uint16_t* buf)

    {

    ...

    }

    此函数的调用方式如所示

    ...

    my_func( c1c2_msg.BL_data );

    ...

    此致、

    Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="19481" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1060593/tms320f28379d-ex奇怪 的处理器行为错误指令执行/3925114#3925114"]如果尝试在奇数地址访问32位值,即使是在奇数地址[引用错误的地址]

    这在哪里描述? 在什么文档中?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="95472" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1060593/tms320f28379d-ex奇怪 的处理器行为错误的指令执行/3925194#3925194]'这是在哪里描述的? 在什么文档中?

    请参阅 CPU 用户指南中的"1.4.3对齐32位对偶数地址的访问"部分。  

    [引用 userid="95472" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1060593/tms320f28379d-ex奇怪 的处理器行为错误的指令执行/3925192#3925192"]抱歉,我不知道应该在哪里放置此 pragma [引语]。

    我认为在这种情况   下、您需要为 BL_DATA 执行该操作或在 BL_cmd 之前移动它的定义。 由于您有一个16位变量、因此数组被放置在奇数地址。  

    此致、

    Vivek Singh

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

    尊敬的 Alex:

    如果您对此有任何进一步的疑问、请告诉我。

    此致、

    Vivek Singh

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

    当您编写此代码时...

    [引用 userid="95472" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1060593/tms320f28379d-ex奇怪 的处理器行为错误指令执行"]地址=*(((uint32_t*) buf);[/quot]

    (笑声) 您告诉编译器、您同意负责确保 buf 在执行此语句之前满足 uint32_t 的对齐约束。  但您尚未这么做。  您创建此结构...

    [引用 userid="95472" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forume/1060593/tms320f28379d-ex奇怪 的处理器行为错误指令执行/3925192#3925192"] typedef struct {
        uint16_t BL_cmd;
        uint16_t BL_data[20];  
    } C1C2_MSG_t;[/报价]

    此结构的一个实例...

    [引用 userid="95472" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1060593/tms320f28379d-ex奇怪 的处理器行为错误的指令执行/3925192#3925192"]с1с2_msg使用.cmd 文件输入地址0x3FC00[引用.cmd]

    然后写入...

    [引用 userid="95472" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1060593/tms320f28379d-ex奇怪 的处理器行为错误的指令执行/3925192#3925192]my_func (c1c2_msg.bl_data);[quote_data]

    同时、这些步骤保证 buf 具有奇数地址0x3fc01、该地址不会按照 uint32_t 的要求对齐。

    要考虑的一种解决方案是在结构中添加一个字段,以强制进行所需的对齐...

    typedef struct {
        uint16_t BL_cmd;
        uint16_t never_used;  /* to force alignment */
        uint16_t BL_data[20];  
    } C1C2_MSG_t;

    您已经发现了另一种解决方案,即不假定 buf 已对齐,并编写类似...的代码。

    [引用 userid="95472" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1060593/tms320f28379d-ex奇怪 的处理器行为错误的指令执行/3924181#3924181"]    address = buf[1];
      address <<= 16;
      address |= (buf[0] & 0x0000FFFFUL);[/报价]

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="19481" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1060593/tms320f28379d-ex奇怪 的处理器行为错误指令执行/3925307#3925307]\n 请参阅 《用户指南》中的"1.4.3节"对32位访问偶数"。  [/报价]

    谢谢你

    此致、
    Alex

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

    尊敬的乔治:

    感谢您的全面介绍和第二种解决方案。

    此致、

    Alex