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.

[参考译文] TMS320F28069:CLA 内存到 CPU 的问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/670947/tms320f28069-cla-memory-to-cpu-issue

器件型号:TMS320F28069

我遇到了以下问题。 当我将一个代码复制到我的主代码中时、它工作正常。 只有当数据是结构时、结果才为零

 struct cla_Estdata_

   MOSPROF_STATE 状态;
   int speed_Hz;
   motorpos_t position_cnt;
   浮动扭矩;
   int 计数器;
};

typedef 结构 cla_RESdata_ volatile cla_RESdata_t;

CLA:

#pragma DATA_SECTION (CLA_estdata、"Cla1ToCpuMsgRAM")
易失性 CLA_Estdata_t CLA_estdata;
#pragma DATA_SECTION (CLA_TEST、"Cla1ToCpuMsgRAM")
volatile int CLA_test;

_interrupt void Cla1Task4 (void)
{     cla_estdata.counter++;
      CLA_TEST++;


主代码:

静态内联 CLA_Update_clafreq (void)

   extern volatile CLA_Estdata_t CLA_estdata;
   extern volatile int cla_test;
   extern long volatile CLA_Freq;
   cla_Freq=cla_test;


结果 CLA_freq 每次更新为新值

静态内联 CLA_Update_clafreq (void)

   extern volatile CLA_Estdata_t CLA_estdata;
   extern volatile int cla_test;
   extern long volatile CLA_Freq;
   cla_Freq=cla_estdata.counter;

结果:CLA_Freq 始终为零。 在调试窗口中、我看到 CLA_estdata.counter 正在计数。 因此、CLA_estdata.counter 被填充正确的数据、因此 CPU 为何无法访问它。

有人建议如何解决这个问题? 单个变量和结构之间有何区别?

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

    CLA_Freq 存储在何处? 它是一个局部变量、但它的存储器位置在两种实现中是否发生了变化?

    CLA 看起来具有 CLA_Test 和 CLA_estdata 结构的访问权限、因此我目前不确定它为什么不读取计数器并将其写入 CLA_Freq。

    您能否使用调试器单步执行该代码、并查看正在读取哪些内容并将其存储到 CLA_Freq 存储器位置?

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

    这两个测试之间没有变化、除了 CLA_FREQ 中存储了哪个变量。 在调试窗口中、我可以看到 CLA 正确填充变量。

    那么、CLA 和 CPU 之间的区别是什么?  我唯一能找到的东西是内存总线宽度。 因此、我开始重新排列 结构、并使所有变量的宽度都为32位。 之后 它开始工作。

    因此、您在编译器中遇到了一个问题。 仅在我上次报告问题时。 TI 可以做的最好的事情是建议手动修改 asm 代码以使其正常工作。 因此这是无用的。

    那么、是否有编译器指令告知 CPU 结构是32位对齐的?

    谢谢!

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

    您好!

    由于该结构由 C28x 定义、因此该结构的元素是 C28x 编译器定义的大小。  枚举类型和整数在 C28x 上的大小将不同于 CLA。 在 C28x 上、它们是16位。 在 CLA 上、它们是32位。

    请参阅的第10.2节   、这是优化 C/C++编译器用户指南

    由于上述原因、CLA 编译器似乎占用了初始化为零的内存。 也许它正在从内存中读出一个反数、该内存超过了结构元素的声明。 可以确认一下吗?

    此致、

    SAL

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您使用定义存储器大小的数据类型、我认为即使您使用16位类型、它也会起作用。 您可以尝试使用标准数据类型来声明结构、例如:int16_t、uint16_t、int32_t、float32_t 等

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

    [引用 user="Sal Pezzino">如果使用定义存储器大小的数据类型、我认为即使使用16位类型、也能正常工作。 您可以尝试使用标准数据类型来声明结构、例如:int16_t、uint16_t、int32_t、float32_t 等

    希望这对您有所帮助、
    SAL

    [/报价]

    stdint.h

       typedef         int   int16_t;
       typedef unsigned int  uint16_t;
       typedef         long  int32_t;
       typedef unsigned long uint32_t;

    如果您不知道、请将我的问题转发 给更高级的人。

    如果我更改 CLA 中结构变量的顺序。 我可以更改输出的结果。 我认为这是一个问题。 我在从 CLA 读回数据时遇到很多问题、因此我花了几天时间对其进行调试。 编译器中数据结构中的32位与16位数据宽度存在问题。  很容易重现。

    额外注意事项:还要检查 CPU 和 CLA 枚举的大小。 如果在 CPU 的枚举中设置了一个值。 CLA 可以读取其他内容。 因为 CPU 无法设置 CLA 数据字段的更高16位字枚举。 在 Init 时可能有一个随机值。 CPU 无法更改它。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在 CLA 和 C28x 上、int 的大小不同。 如果您使用指定大小的标准 int 类型、我认为这也可以解决您的问题。

    SAL