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.

[参考译文] 编译器/F28M35H52C:枚举大小和共享内存

Guru**** 2533300 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/573379/compiler-f28m35h52c-enum-size-and-shared-memory

部件号:F28M35H52C

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

您好,

我的蛇腹上有一个问题,我正在寻求帮助。
让我们来总结一下这个问题:)

我想在ARM和C28之间共享枚举。
此枚举为“小”,可以用字符编码。 我"包装"结构,以确保对齐不会掩盖我的问题。
我用下面的简单示例总结了我的代码:

#if defined(__TMS320C2000__)
//缺省情况下,结构在DSP上打包
#define struct_packed
#Elif defined(__TI_arm__)
#define struct_packed __attribute_(__packed__)#endif


typedef {
	A,
	B,
	C
foo;

struct struct struct struct __packed __attribute___(((((((__packed___packed___)))))}{a,B,C

				
		numValue } foopet_num_num_num_num_uelet


默认情况下,编译器将看到大小为以下两个枚举:

  • ARM -> Int -> 32位
  • C28 ->内部-> 16位
  • 好,我们在这里看到了两个处理器之间明显的错位。


编译器上有关enum的选项似乎不同:

  • ARM ->--small_enum
  • ARM ->--enum类型(封装/int)
  • C28 ->未找到有关枚举大小的任何选项,但找到了Strict C89/C99选项。


承认我启用了其中一个选项,发生了什么?

使用--small_enum编译的ARM启用:
ARM -> CHAR -> 8位
C28 ->内部-> 16位
不正常

使用--enum类型=int编译的ARM
ARM -> Int -> 32位
C28 ->内部-> 16位
不正常

使用--enum类型=packed编译的ARM
ARM -> Int -> 32位
C28 ->内部-> 16位
不正常

是否有一种“干净”的方法来正确编译双方?
你有甚么建议可以妥善处理这类情况呢?

非常感谢!
谢谢,
T.

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

    类似这样的东西会起作用...

    typedef enum {
    A,
    B,
    C,
    unused_limit = 1L <<24
    } foo;
    

    添加枚举值unused_limit只是为了确定类型的大小。  它需要是一个正整数,对于16位来说太大,但适合32位。  我还建议您清楚地评论unused_limit的用途,以避免它在将来被删除。

    谢谢,此致,

    -George

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

    非常感谢George的回复。

    我理解诀窍,但我不认为它"干净",因为它要求我为每个现有的枚举以及未来的枚举添加它。

    那么,您可以向我确认,在这种情况下,没有其他方法可以强制两个编译器对齐?

    谢谢,此致,

    T.

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

    不幸的是,我不知道有任何其他方法。

    谢谢,此致,

    -George