作者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), 来自: 203.74.156.241 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/LinuxDev/M.1586407222.A.F2D.html
※ 编辑: ando5566 (203.74.156.241 台湾), 04/09/2020 12:41:41
※ 编辑: ando5566 (203.74.156.241 台湾), 04/09/2020 12:45:16
1F:→ leolarrel: 无论怎麽改,"CANIDObj.SID" 这个写法肯定是要改变的 04/09 12:56