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.

[参考译文] 编译器/TMS320F28335:C2000编译器6.4.9版:位字段错误?

Guru**** 2534260 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/609019/compiler-tms320f28335-c2000-compiler-version-6-4-9-bit-field-bug

器件型号:TMS320F28335

工具/软件:TI C/C++编译器

您好!

请参阅下面的 C 和相关的反汇编和表达式窗口。  

为什么 abc.A3不存储在第一个字的最高半字节中?  我预期结果为 0x00004305、而不是 0x00040305。

斯蒂芬

C 代码:

typedef unsigned int UWORD;

typedef union
{
long Message;
struct{
unsigned int A1:8;
unsigned int A2:4;
unsigned int A3:6;
unsigned int A4:1;
unsigned int A5:1;
unsigned int A6:1;
unsigned int A7:1;
unsigned int A8:5;
unsigned int A9:1;
unsigned int A10:1;
unsigned int A11;
}bits;
}ID;

ID abc;


int main (void)
{
abc.bits.a1=5;
abc.bits.a2=3;
abc.bits.a3=4;

return 0;
}

拆卸:

29.abc.bits.a1=5;
主:
009078:761F0300 MOVW DP、#0x300
00907a:CC00FF00和 AL、@0x0、#0x0000
00907c:5005 ORB AL、#0x5
00907d:9600 MOV @0x0、AL
30abc.bits.a2=3;
00907e:CC00F0FF 和 AL、@0x0、#0xf0ff
009080:1AA90300或 @AL、#0x0300
009082:9600 MOV @0x0、AL
31abc.bits.a3=4;
009083:CC01FFC0和 AL、@0x1、#0xc0
009085:5004 ORB AL、#0x4
009086:9601 MOV @0x1、AL
33返回0;
009087:9A00 MOVB AL、#0x0
34}
009088:0006 LRETR
_register_unlock:
009089:761F0300 MOVW DP、#0x300
00908b:A80A MOVL @0xA、XAR4
00908c:0006 LRETR
_register_lock:
00908d:761F0300 MOVW DP、#0x300
00908f:A808 MOVL @0x8、XAR4
009090:0006 LRETR
_nop:
009091:0006 LRETR 

表达式窗口:

ABC联合 {...} (十六进制)0x0000C000@数据
消息长0x00040305(十六进制)0x0000C000@数据
位结构 {...} (十六进制)0x0000C000@Data
A1unsigned int:80x05 (十六进制)0x0000C000@Data bit 0-7
A2unsigned int:40x3 (十六进制)0x0000C000@Data bit 8-11
A3unsigned int:60x4 (十六进制)0x0000C001@Data bit 0-5
A4unsigned int:10x0 (十六进制)0x0000C001@Data bit 6
A5 unsigned int: 10x0 (十六进制)0x0000C001@数据位7
A6无符号整型:10x0 (十六进制)0x0000C001@数据位8
A7无符号整型:10x0 (十六进制)0x0000C001@数据位9
A8无符号整型:50x0 (十六进制)0x0000C001@数据位
A9无
符号整型:1 0x0 (10-14) 0x0000C001@数据位15无符号整型: 10x0 (十六进制)0x0000C002@数据位0
A11无符号整型0x0000 (十六进制)0x0000C003@数据

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

    这可能是显示错误。  什么工具可产生该输出?

    [引用 user="stevenh"]

    表达式窗口:

    ABC联合 {...} (十六进制)0x0000C000@数据
    消息长0x00040305(十六进制)0x0000C000@数据

    [/报价]

    谢谢、此致、

    乔治

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

    使用 C2000仿真器的 CCS5.5。 另一名同事在使用实际目标时遇到了相同的问题。 我相信他正在使用 CCS v6.2。

    请参阅我上一篇文章底部的反汇编内容。 根据拆卸步骤、显示屏显示正确的输出。

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

    这是正确的...

    A1unsigned int:80x05 (十六进制)0x0000C000@数据位0-7
    A2unsigned int:40x3 (十六进制)0x0000C000@数据位8-11
    A3unsigned int:60x4 (十六进制)0x0000C001@数据位0-5

    它不会向您显示地址0x0000C000处的位12-15未使用。  这是因为不允许位字段跨越16位(或字)边界。 一旦字段 A1和 A2被放置、字中只剩下4位。  接下来必须填写字段 A3。  它是6位宽、大于4位。  那么、它进入下一个字。

    很抱歉、我先前未能做到这一点。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我以为是这样、但我不明白为什么这会是个问题。

    所有 TI 编译器、包括 ARM、都是这样吗? 我想有些硬件位字段会跨越字边界扩展、还是芯片系统设计人员会确保不会发生这种情况?

    限制是否有原因?

    谢谢、
    斯蒂芬
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    根据 C2000和 MSP430编译器手册、位字段不能与字重叠、我认为这通常是正确的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    位字段布局有点复杂、COFF 和 EABI 之间也不同。 在 EABI 中、如果声明类型是跨越字边界的类型、例如"long"、则实际上可以有一个跨越字边界的位字段。 请参阅 MSP430 EABI 文档。