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

作者: leolarrel (真.粽子無雙)   2020-04-09 13:08:39
※ 引述《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掉
一勞永逸
作者: ando5566 (風雲變色)   2020-04-09 19:31:00
我喜歡改成uint16_t

Links booklink

Contact Us: admin [ a t ] ucptt.com