В настоящее время я работаю над загрузчиком для ARM Cortex M3.C-код, вызывающий процедуру сборки - ARM
У меня есть две функции, одна в C и один в сборке но когда я пытаюсь вызвать функцию Ассамблеи моя программа зависает и генерирует какие-то ошибки.
функции следующим образом,
C:
extern void asmJump(void* Address) __attribute__((noreturn));
void load(void* Address)
{
asmJump(Address);
}
Монтаж:
.section .text
.global asmJump
asmJump: @ Accepts the address of the Vector Table
@ as its first parameter (passed in r0)
ldr r2, [r0] @ Move the stack pointer addr. to a temp register.
ldr r3, [r0, #4] @ Move the reset vector addr. to a temp register.
mov sp, r2 @ Set the stack pointer
bx r3 @ Jump to the reset vector
И моя проблема заключается в следующем:
Кодовые печатает " Привет "ove r, а затем вызывает load
. Загруженный код печатает «Good Bye», а затем сбрасывает чип.
Если я медленно прохожу через ту часть, где load
звонки asmJump
все работает отлично. Однако, когда я позволяю коду запускать свой код, возникает ошибка «Ошибка памяти». Я знаю, что это ошибка памяти, поскольку она вызывает Hard Fault
в некотором роде (бесконечный цикл цикла Hard Fault выполняет цикл, когда я делаю паузу через 4 или 5 секунд).
Неужели кто-нибудь испытал этот вопрос раньше? Если да, можете ли вы сообщить мне, как его решить?
Как вы можете видеть, я попытался использовать атрибуты функции для исправления проблемы, но пока не смог найти решение. Я надеюсь, что кто-то может помочь мне понять, в чем проблема, в первую очередь.
Edit:
Спасибо @JoeHass за ваш ответ, и @MartinRosenau за ваш комментарий, я с тех пор пошел дальше, чтобы найти this SO answer, что было очень подробное объяснение того, почему мне нужен этот ярлык. Это очень долго читается, но стоит того.
Если у вас есть разные процедуры прерывания для загрузчика и приложения: были ли вы отключены прерывания и заменили VTOR (регистр смещения таблицы векторов) на векторную таблицу второй программы? Это нужно сделать, прежде чем устанавливать указатель стека. – user694733
1) Вы уверены, что указатель стека правильный? 2) Если ваш код - код THUMB, тогда r3 не должен быть адресом кода, а адресом кода плюс 1! –
Попробуйте очистить * буфер записи *, * dcache * и * icache * до вашего вызова. Вы где-то скопировали код? Это звучит как проблема * code * '! =' * Data * или конвейер; который объясняет, что он работает при приостановке в отладчике. –