Имам обект, който има адрес, който не е подравнен в 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 байта? Някой има ли друго решение за това?
class
илиstruct
, който използвате тук (стойността вr0
вероятно еthis
на обекта, с който имаме работа. С други думи, какъв изходен код е използван за генериране на това? - person Mats Petersson   schedule 16.08.2013BaseArea
, както и къде се извиква конструкторът? - person Mats Petersson   schedule 16.08.2013