Qemu: fatal: Lockup: не может перерасти 3 в ошибку Hardfault (текущий приоритет -1) -Core Dumped - PullRequest
2 голосов
/ 18 марта 2019

Я пытаюсь эмулировать контроллер STM32F407XX с процессором Cortex M4 на QEMU. Я написал .ld файл, как показано ниже:

ENTRY(_Reset)

MEMORY
{
  FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 512K
  RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 128K
  CCMRAM (rw)     : ORIGIN = 0x10000000, LENGTH = 64K
  PERIPHERALS(rw) : ORIGIN = 0x40000000, LENGTH = 128K
}

SECTIONS
{

 .startup . : { stm32.o(.text) } >FLASH
 .text : { *(.text) } 
 .data : { *(.data) } >RAM AT> FLASH
 .bss : { *(.bss COMMON) } >RAM
 . = ALIGN(4);
 . = . + 0x400; /* required amount of stack */
 stack_top = 0x20020000;
}

Когда я генерирую файл .elf и запускаю код, я получаю ошибку

Qemu: fatal: Lockup: cant escalate 3 to Hardfault (Current Priority -1) error.
Aborted (Core Dumped)

Я чувствую проблему с памятью. Что я делаю неправильно? Я выделил флэш-память и ОЗУ в соответствии с требованиями руководства по эксплуатации для STM32F407.

почему эта ошибка возникает в первую очередь и как я могу устранить эту ошибку? Благодарю.

Ответы [ 3 ]

0 голосов
/ 19 апреля 2019

Размещение таблицы векторов в правильном месте решило проблему. Я следовал всем инструкциям @peter Maydell в комментариях выше. Я добавляю их сюда.

Вы можете включить некоторые параметры ведения журнала отладки в QEMU с помощью -d ('in_asm, int, exec, cpu, guest_errors, unimp', вероятно, хороший набор для начала), который скажет вам, каков ваш гостевой код делается. Я бы начал с проверки того, что в вашем ELF-файле есть таблица векторов в том месте, где QEMU ожидает его найти. В противном случае QEMU сразу же выйдет из сбоя (что и делает аппаратное обеспечение).

Ожидается дамп ядра: QEMU входит в блокировку, но мы не эмулируем блокировку правильно (строго говоря, QEMU должен просто сидеть там, ничего не делая, как это делает реальное оборудование), поэтому мы печатаем дамп регистра и abort (). Как я уже говорил в своем предыдущем комментарии, ваша проблема почти наверняка в том, что в вашем двоичном файле нет таблицы векторов.

Главное, что вы должны иметь в своей векторной таблице - это записи для начального ПК и указатель стека. Записи прерываний и исключений стоят того, чтобы их вставить, но они понадобятся только при наличии прерывания или исключения. Если вы добавите обработчики отладки для других ошибок, вы, по крайней мере, будете знать, когда возникнет ошибка из-за ошибки в остальной части вашей программы, хотя

0 голосов
/ 03 мая 2019

Дополнительная информация для любого, как я, которая сталкивается с этой попыткой исправить ошибку qemu: Я получил ту же самую ошибку из-за невыполненной инструкции.

Это произошло потому, что я скомпилировал код с -mcpu=cortex-m4, но запустил qemu с -cpu cortex-m4

Хитрость в том, что это работает для большей части кода, потому что gcc чаще всего не использует одну из «команд m4-only» (даже в зависимости от уровня оптимизации - он работал с -O1, но не удалось с -O2) ...

0 голосов
/ 04 апреля 2019

Вам нужно сбросить ПЗУ после загрузки ядра на ваш компьютер (после вызова armv7m_load_kernel). Вы можете использовать, например:

rom_check_and_register_reset();
qemu_devices_reset();

CPU должен запуститься при сбросе обработчика.

...