我正在使用 MPLABX 和编译器 xc16-gcc 为 16 位 dsPIC33CH128MP508 微控制器开发。我正在编写通过 I2C 从 RTC 读取的代码。我定义了以下结构:
typedef struct tagRTC_VL_SECONDSBITS{
uint8_t SECONDS: 7 ;
uint8_t VL:1 ; /* 0: clock integrity is guarantee */
}sRTC_VL_SECONDSBITS_t;
typedef struct tagRTC_MINUTESBITS{
uint8_t MINUTES: 7 ;
uint8_t :1 ;
}sRTC_MINUTESBITS_t;
typedef struct tagRTC_HOURSBITS{
uint8_t HOURS: 6 ;
uint8_t :2 ;
}sRTC_HOURSBITS_t;
typedef struct tagRTC_DAYSBITS{
uint8_t DAYS: 6 ;
uint8_t :2 ;
}sRTC_DAYSBITS_t;
typedef struct tagRTC_WEEKDAYSBITS{
uint8_t WEEKDAYS: 3 ;
uint8_t :5 ;
}sRTC_WEEKDAYSBITS_t;
typedef struct tagRTC_CENTURY_MONTHSBITS{
uint8_t MONTHS: 5 ;
uint8_t :2 ;
uint8_t C:1 ;
}sRTC_CENTURY_MONTHSBITS_t;
typedef struct tagRTC_YEARSBITS{
uint8_t YEARS ;
}sRTC_YEARSBITS_t;
typedef struct tagRTC_TIME{
sRTC_VL_SECONDSBITS_t sec;
sRTC_MINUTESBITS_t min ;
sRTC_HOURSBITS_t hr ;
sRTC_DAYSBITS_t day ;
sRTC_WEEKDAYSBITS_t wDay ;
sRTC_CENTURY_MONTHSBITS_t month ;
sRTC_YEARSBITS_t year ;
}sRTC_TIME_t ;
struct 的问题sRTC_TIME_t
有奇数个成员,内存对齐由编译器自动打包。从 RTC 读取也需要打包结构。
当试图读取第一个成员sec
时,代码会使用TRAPS_ADDRESS_ERR = 2, /** Address error Trap vector */
.
sRTC_TIME_t time;
second_reading = time.sec.SECONDS;
当我们在结构中添加第八个虚拟成员时,sRTC_TIME_t
没有错误!
这个问题的根源可能是什么?