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:奇数地址上的32位指针写入不起作用

Guru**** 2609955 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1032696/tms320f28379d-32bit-pointer-write-not-working-on-odd-address

器件型号:TMS320F28379D

您好!

我有一组 SFuncionBuilder1[6]。

我对其执行以下操作:

 函数_测试_输出_包装器(&SCI_CPU1_B.SFunctionBuilder1[0]);

函数定义如下所示:

void function_test_outputs_wrapper (uint16_T * serial_data_out)


uint32_T DATA_1 = 0x12345678;
uint32_T DATA_2 = 0x9abcdef0;


serial_data_out[0]= 0x1515;//行1

*(((uint32_T*)&(serial_data_out[1]))= data_1;//line 2

*(((uint32_T*)&(serial_data_out[3]))= data_2;


serial_data_out[5]= 0x7676;

当我执行//line 1时、我可以看到 在 SCI_CPU1_B.SFunctionBuilder1[0]位置更新0x1515 、如上图所示。

但是、当我执行下一行、即//line2时、 我会看到 SCI_CPU1_B.SFunctionBuilder1[0]被改写、如下所示。

有人可以帮助我处理这种行为吗?

此致、

Venkatesh C

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

    Venkatesh、

    我想作初步的答覆,即使我的理据在技术上需要一些修正,使其背后的 C 标准是正确的,所以你不会被搁置。

    C2000可读取/写入的最大字大小为32位、因此对于32位写入、C28x 内核会忽略传递给它的地址的 LSB。  

    因此 LSB 始终位于偶数地址字中、MSB 始终位于奇数地址字中。  

    这会导致您看到的行为、以及导致对先前的16位数据进行过度写入的原因。

    在您的情况下、校正将强制32位写入 serial_data_out[0]、这将导致下一个字位于 serial_data_out[2]。  或者、您只能写入16位数据、然后根据需要将其重新组合到32位字中。

    上述内容与 ANSI C 标准中的严格别名规则有关、有一定的细微差别、如果需要、我可以尝试提供技术上更完整的答案、请告诉我。

    最棒的
    Matthew

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

    Venkatesh、

    您可能希望在32位边界上对齐数组、看看这是否有用。  您可以使用 align (2)对齐链接器 cmd 文件中的段映射。

    这可确保始终在偶数地址上访问32位。

    谢谢、此致、

    Vamsi