Нераспределенный доступ вызывает ошибку на ARM Cortex-M4

У меня есть объект, адрес которого не выровнен по 4 байта. Это вызывает ошибку HardFault в процессоре при наличии инструкции STR, сохраняющей 2 регистра.

Это сгенерированный код:

   00000000 <_ZN8BaseAreaC1EPcmm>:
   0:   b510            push    {r4, lr}
   2:   4604            mov     r4, r0
   4:   6042            str     r2, [r0, #4]
   6:   e9c4 3102       strd    r3, r1, [r4, #8]
   a:   2001            movs    r0, #1
   c:   7420            strb    r0, [r4, #16]
   e:   b921            cbnz    r1, 1a <_ZN8BaseAreaC1EPcmm+0x1a>

Это регистры в строке "4: 6042 ..."

R0   08738B82  R8          0  
R1   08738BAE  R9          0  
R2          0  R10  082723E0  
R3       2FCC  R11         0  
R4   08738B82  R12         0  
R5   20007630  R13  2000CB38  

Как видно, регистр назначения для STR-инструкций не выровнен на 4 байта. ИнструкцияSTR r2, [r0, #4] выполнен отлично. Но это HardFaults на следующийSTRD r3, r1, [r4, #8], Если я вручную изменю регистр R4 на08738B80 это не трудно.

Это код C ++, который генерирует вышеупомянутый asm:

BaseArea::BaseArea(char * const pAddress, unsigned long startOffset, unsigned long endOffset) : 
m_pAddress(pAddress), m_start(startOffset), m_end(endOffset), m_eAreaType(BASE_AREA) {

А такжеm_start является первой переменной в классе и имеет тот же адрес, что иthis (08738B82)m_end следует после0x08738B86.

Как мне выровнять объект на 4 байта? У кого-нибудь есть какое-то другое решение?

Ответы на вопрос(2)

Ваш ответ на вопрос