※ 引述《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掉
一劳永逸