Fw: [問題] porting issue(32bits-->8bits)
作者: ando5566 (販賣夢想的人) 看板: C_and_CPP
標題: Fw: [問題] porting issue(32bits-->8bits)
時間: Thu Apr 9 12:43:48 2020
※ [本文轉錄自 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), 來自: 203.74.156.241 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/LinuxDev/M.1586407222.A.F2D.html
※ 編輯: ando5566 (203.74.156.241 臺灣), 04/09/2020 12:41:41
※ 發信站: 批踢踢實業坊(ptt.cc)
※ 轉錄者: ando5566 (203.74.156.241 臺灣), 04/09/2020 12:43:48
※ 編輯: ando5566 (203.74.156.241 臺灣), 04/09/2020 12:44:46
討論串 (同標題文章)
以下文章回應了本文 (最舊先):
完整討論串 (本文為第 1 之 4 篇):