作者MasterChang (Han-Yuan)
看板C_and_CPP
标题Re: [问题] porting issue(32bits-->8bits)
时间Thu Apr 9 15:07:07 2020
#pragma pack(push)
#pragma pack(1)
typedef struct _CAN_MSGOBJ_ID {
uint32_t SID : 11;
uint32_t EID : 18;
uint32_t SID11 : 1;
uint32_t unimplemented1 : 2;
} CAN_MSGOBJ_ID;
#pragma pack(pop)
※ 引述《ando5566》之铭言:
: ※ [本文转录自 LinuxDev 看板 #1UZgSsyj ]
: 作者: ando5566 (贩卖梦想的人) 看板: LinuxDev
: 标题: [问题] porting issue(32bits-->8bits)
: 时间: Thu Apr 9 12:40:20 2020
: 各位版友日安,
: 最近小弟要将32bits平台的CAN protocol API, porting 至8bits平台上,
: 遇到了一个问题, 如下:
: typedef struct _CAN_MSGOBJ_ID {
: uint32_t SID : 11;
: uint32_t EID : 18;
: uint32_t SID11 : 1;
: uint32_t unimplemented1 : 2;
: } CAN_MSGOBJ_ID;
: 因为PIC18 8bits 编译器(XC8)不支援 uint32_t SID : 11;
: 因为11bits超过8bits,
: 因此我把它改成
: typedef struct _CAN_MSGOBJ_ID {
: uint32_t SID1 : 8;
: uint32_t SID2 : 3;
: uint32_t EID1 : 5;
: uint32_t EID2 : 8;
: uint32_t EID3 : 5;
: uint32_t SID11 : 1;
: uint32_t unimplemented1 : 2;
: } CAN_MSGOBJ_ID;
: 便可以编译成功。
: 但是因为我的原意是porting, 所以我不希望影响任何其他写法,
: 现在这麽做, 我的 CANIDObj.SID找不到data了。
: 於是我用另一招:
: typedef struct _CAN_MSGOBJ_ID {
: struct {
: uint32_t SID1 : 8;
: uint32_t SID2 : 3;
: }SID;
: struct {
: uint32_t EID1 : 5;
: uint32_t EID2 : 8;
: uint32_t EID3 : 5;
: }EID;
: uint32_t SID11 : 1;
: uint32_t unimplemented1 : 2;
: } CAN_MSGOBJ_ID;
: 但是这样做并非完全正确, 因为8 bits alignment的关系,
: EID已经从第12bit 跑到第17bit去了。
: 尝试过使用union的作法, 但是仍会面临无法使EID定址在第12bit的问题。
: 想请教版上高手, 有其他方法吗?
: 谢谢!
--
不要问我从哪来,我只是一个浪迹天涯的工程师....
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.242.235.72 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1586416029.A.FE9.html
1F:推 ando5566: 感谢~知道这麽做的原理 但编译器不给过 再研究 04/10 22:03