НЕПРАВИЛЬНАЯ ошибка использования инструкции LDR - CortexM7 - PullRequest
2 голосов
/ 18 июня 2019

Я отлаживаю код сборки, написанный для цели CortexM7. Внутри обработчика busFault есть инструкция LDR, которая при выполнении вызывает НЕПРАВИЛЬНУЮ сбой использования и, как следствие, происходит принудительный сбой. Что я знаю, так это то, что по умолчанию для инструкции ldr не требуется выравнивание адресов. Я также проверил бит в регистре CCR, который может обеспечить выполнение требования, но он отключен. Вот мой код:

global          c_AbcFunction

c_Abc        .long c_AbcFunction    

BusFaultHandler:
LDR R1, c_Abc

Компилятор: ARM-GHS 2017 Отладчик: Лаутербах

Значение CCR:

 CCR  00040200  BP           Enabled            IC            Disabled   DC             Disabled
                STKALIGN     8-byte/adjustment  BFHFNMIGN     Lockup     DIV_0_TRP      Disabled
                UNALIGN_TRP  Disabled           USERSETMPEND  Disabled   NONBASETHRDENA Disabled

Разборка вышеуказанного кода:

0128      c_Abc:        align   0x128
2802                                       ////////                 ; instruction would span across HLL line symbol

BusFaultHandler:
    LDR R1, c_Abc
F85F102E   ldr     r1,0x10013318

Изменение, внесенное мной для строгого выравнивания:

c_Abc  .long   c_AbcFunction
.align    4

Разборка после добавления ".align 4":

28020128  c_Abc:        stmdacs r2,{r3,r5,r8}

BusFaultHandler:
    LDR R1, c_Abc
F85F1030                                   ldr     r1,0x10013318    ; r1,c_Abc

Основная проблема каким-то образом решается добавлением .align 4. Но я не могу понять причину, поскольку LDR не должен иметь никаких требований по выравниванию в текущем сценарии.

1 Ответ

1 голос
/ 21 июня 2019

Ошибка выравнивания может не иметь ничего общего с инструкцией LDR. Смещенная векторная таблица кажется более вероятной причиной. Проверьте, находится ли таблица как минимум на 128-байтовой границе. В противном случае векторная выборка может быть фактическим источником ошибки.

Кроме того, в вашем списке указано align 0x128, но для этой директивы обычно требуется степень двойки. Должно ли это быть align 128 вместо?

...