C: ошибка перехвата адреса при доступе к структуре с нечетным номером. членов - PullRequest
1 голос
/ 23 марта 2020

Я работаю с MPLABX с компилятором xc16-g cc, разрабатывающим для 16-битного микроконтроллера dsPIC33CH128MP508. Я делаю код для чтения из RT C через I2 C. Я определил следующие структуры:

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 ;

Проблема со структурой sRTC_TIME_t имеет нечетное число членов, выравнивание памяти автоматически упаковывается компилятором. Чтение из RT C требует также упакованной структуры.

При попытке прочитать первый элемент sec кодовая ловушка с TRAPS_ADDRESS_ERR = 2, /** Address error Trap vector */.

sRTC_TIME_t time;

second_reading = time.sec.SECONDS;

Когда мы добавьте восьмой фиктивный член в структуру sRTC_TIME_t ошибки нет!

Что может быть источником этой проблемы?

...