[問題] porting issue(32bits-->8bits)

看板LinuxDev作者 (販賣夢想的人)時間4年前 (2020/04/09 12:40), 4年前編輯推噓0(001)
留言1則, 1人參與, 4年前最新討論串1/2 (看更多)
各位版友日安, 最近小弟要將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 ※ 編輯: ando5566 (203.74.156.241 臺灣), 04/09/2020 12:45:16

04/09 12:56, 4年前 , 1F
無論怎麼改,"CANIDObj.SID" 這個寫法肯定是要改變的
04/09 12:56, 1F
文章代碼(AID): #1UZgSsyj (LinuxDev)
文章代碼(AID): #1UZgSsyj (LinuxDev)