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.

[参考译文] MSP430F6779:使用 MSP430F6779的指令集实现内存对齐和指针变量

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1236785/msp430f6779-memory-alignment-and-pointer-variable-using

器件型号:MSP430F6779

I 使用以下代码(IAR 5.60.1)进行测试。

static unsigned long *test_value_p;

静态无符号长整型 test_value_1;
静态无符号长整型 test_value_2;
Static unsigned char array [8]={0x00、0x01、0x02、0x03、0x04、 0x05、0x06、0x07};

test_value_p =(uint32_t *)(&array[1]);
test_value_2 =* test_value_p;

预期输出:TEST_VALUE_2、0x04030201
实际输出: TEST_VALUE_2、 0x03020100

它是否使编译器将存储器地址强制为偶数(TEST_VALUE_2 =* TEST_VALUE_p;)?

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

    您的期望是错误的。

     从奇数地址("mov.w &0x2001、R15")进行字访问、硬件将忽略 lsb。 因此实际上为零。 编译器在这方面没有发言权。

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

    尊敬的

    非常感谢。

    是否有任何方法(例如 IDE 配置)可以从奇数地址警告字访问(在 C 语言中、使用指针变量来对奇数地址进行推理)?

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

    您好,Tink

    您可以检查可变类型 char 或 unsigned char 是否可以正常工作。

    请参阅 https://www.ti.com/lit/pdf/slau132 MSP430优化 C/C++编译器 UG。

    谢谢!

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

    你好,李晓东。

    感谢提供信息。

    这意味着我们必须手动检查正确的数据类型?、这是否意味着编译器(IAR 或 CCS)无法针对该问题发出警告?

    我是否可以使用自动方法来检查来自奇数地址的访问?

    https://www.iar.com/knowledge/support/technical-notes/compiler/accessing-unaligned-data/

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

    通常、编译器不能就在运行时确定的地址向您发出警告。

    但这让我想起了 GNU C 编译器的问题,它以意想不到的方式传播信息。 这样、将开始指向 char 的地址分配给整数指针(当然要转换并对齐)会导致编译器在访问时执行字节操作。 非常恼人。