Нераспределенный доступ вызывает ошибку на 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 байта? У кого-нибудь есть какое-то другое решение?