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

看板LinuxDev作者 (真.粽子無雙)時間4年前 (2020/04/09 13:08), 編輯推噓1(100)
留言1則, 1人參與, 4年前最新討論串2/2 (看更多)
※ 引述《ando5566 (販賣夢想的人)》之銘言: : 各位版友日安, : 最近小弟要將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的問題。 : 想請教版上高手, 有其他方法嗎? : 謝謝! 我的想法是這樣,把uint32_t 改成uint8_t typedef struct _CAN_MSGOBJ_ID { uint8_t SID1 : 8; uint8_t SID2 : 3; uint8_t EID1 : 5; uint8_t EID2 : 8; uint8_t EID3 : 5; uint8_t SID11 : 1; uint8_t unimplemented1 : 2; } CAN_MSGOBJ_ID; 因為無論怎麼改, CANIDObj.SID 一定得改成 CANIDObj.SID1 跟CANIDObj.SID2, CANIDObj.EID 也是同理,所以我就直接把uint32_t 改成uint8_t. 參考看看吧,另外我個人是覺得操作CAN_MSGOBJ_ID物件的所有程式馬都直接refacter掉 一勞永逸 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 211.21.123.30 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/LinuxDev/M.1586408921.A.743.html

04/09 19:31, 4年前 , 1F
我喜歡改成uint16_t
04/09 19:31, 1F
文章代碼(AID): #1UZgtPT3 (LinuxDev)
討論串 (同標題文章)
文章代碼(AID): #1UZgtPT3 (LinuxDev)