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.

[参考译文] 编译器:clpru 2.2.1无法识别"#pragma pack"?

Guru**** 2538930 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/694272/compiler-clpru-2-2-1-does-not-recognize-pragma-pack

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

Palmform 是 Debian 下的 BeagleBone Black、我有一个 ARM/PRU 项目。

我在共享存储器中有一个结构、用于与 Debian 下的 ARM 进行通信。 我必须 在 ARM 和 PRU 下强制结构采用相同的字节布局、因此我使用了"#pragma Pack"


/***** 共享结构的开始***** /
#pragma pack (4)


typedef 结构{
   uint32_t   addr;//寄存器0..7
   uint32_t   bitmask;//仅更改寄存器中的这些位
   uint32_t   val;//值设置/获取。
} mailbox_buslatel_t;

但 clpru 说

"./common/mailbox.h "、第28行:警告#163-D:无法识别#pragma

根据手册、支持#pragma pack (4)。

完整呼叫线路:

/home/joerg/retrocmp/dec/pdp11/UniBone/91_3rd_party/pru-c-compile/ti-cgt-pru_2.2.1 /bin/clpru --include_path=/home/joerg/retrocmp/dec/pdp11/UniBone/91_3rd_party/pru-c-compile/ti-cgt-pru_2.2.1 //include --include_path=/home/joerg/retrocmp/dec/pdp11/UniBone/91_3rd_party/pru-c-compile/pru-software-support-package/include --include_path=/home/joerg/retrocmp/dec/pdp11/UniBone/91_3rd_party/pru-c-compile/pru-software-support-package/include/am335x --include_path=./common -v3 -O3 --auto_inline --display_error_number --endian=little --hardware_mac=on --obj_directory=./bin-optimizer-b-about--interlist-/bin-bbb/pru1_main.object -absolute_directory=-inc.inc.inc.inc.pb.c.inc.a -list_inc.inc.inc.inc.inc.inc.inc.inc.inc.inc.inc.a
"./common/mailbox.h "、第28行:警告#163-D:无法识别#pragma

Thnaks 关心

Joerg Hoppe

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

    在 PRU 上、所有类型都是字节对齐的。  请参阅 PRU 编译器手册中的"数据类型"一节。  因此、所有结构都是打包的、不需要#pragma pack。   

    这是手册中的错误。  为了解决这一问题、我在 SDOWP 系统中提交了 CodeGen-4832。  欢迎您在我的签名中使用下面的 SDOWP 链接进行访问。

    谢谢、此致、

    乔治

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

    乔治

    感谢您的快速回答。 第6.2.1章明确说明了这一点。

    我通过这种方式了解“始终字节对齐”:
    结构{
        uint8_t  a;
        uint32_t b;
    } testvar;

    对 testvar.b 的访问跨越32位字边界。 这是一种法律情况、但可能是性能问题。

    为了避免这种情况、CPU 可以轻松地处理"字交叉"访问、还是应该将所有结构成员都设置为 uint32_t?


    此致、

    Joerg

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

    此帖子中的信息稍后发现不正确。  它仅用于保持原始线程的连续性。  乔治

    [引用 user="Joierg Hoppe"]这是一种合法的情况,但可能是性能问题。

    我们没有发现任何与非对齐内存访问相关的性能问题。

    谢谢、此致、

    乔治

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

    遗憾的是、我的最后一篇帖子不正确。  在某些情况下会产生性能损失。

    关于这些标量类型的访问...

    • CHAR -无罚分
    • short、int、long、float、pointers -如果它跨越4字节边界、则会损失1个周期
    • 如果在4字节边界上未对齐、则会影响 long long、double - 1周期

    目前、这些数据类型均未对齐。

    谢谢、此致、

    乔治

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

    谢谢!