Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Prefetch abort
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Grizzzly
Пытаюсь найти ошибку, приводящую к prefetch abort. После остановки программы в отладчике прочитал регистры. R13 для SVC, FIQ, IRQ не превосходит границы областей, выделенных под соответствующие стеки. То есть их переполнения нет. При этом PC = FC13FFFC. Огромное число, которого не может быть. R14 = 00000000 в режиме SVC, в других режимах - огромные числа. Так, R14_abt = 20000097 (как он получился нечетным?). Поэтому SUBS PC,R14_abt,#4 не помогает. Таких огромных адресов нет.
Как в данном случае понять, где возникает ошибка?
jcxz
Останавливаете после уже "улёта" в неизвестность?
В этом случае - толку от содержимого регистров ==0.
До того как вы нажали HALT в отладчике, CPU уже успел выполнить неск. миллионов инструкций, и многократно переписал эти регистры.

Такую ошибку отловить сложно и очень долго и муторно.
Хотя вроде есть Tracer-ы, которые умеют запоминать сколько-то последних инструкций и отматывать назад. Но стоят жорого и требуют особенного подключения для себя (Trace).

Когда у меня были подобные проблемы, приходилось использовать таймер с высокочастотным прерыванием:
Так скажем с частотой 1МГц (или чаще) вызывалась ISR и писала в буфер содержимое регистров и стека.
И проверяла некоторые условия - например - нахождение SP и PC в пределах некоторых значений с остановом если
вышли за диапазон.
Grizzzly
Спасибо за ответ.
Цитата(jcxz @ Jun 5 2014, 15:26) *
Останавливаете после уже "улёта" в неизвестность?

Здесь отладчик собственный, нестандартный. Он только для данного процессора, который аналогичен ARM7. Так вот отладчик останавливает программу автоматически и выдает сообщение об ошибке. Но, думаю, вы правы. Всё равно какието инструкции выполняются за это время.
demiurg_spb
Цитата(Grizzzly @ Jun 5 2014, 15:32) *
За все ARMV7 не скажу, а для ARMV7-M можно написать обработчик прерывания HardFault и там вывести в консоль значения регистров и их проанализировать.
Вот тут внятно описано как.
Grizzzly
Цитата(demiurg_spb @ Jun 5 2014, 16:35) *

Спасибо, сейчас посмотрю.
jcxz
Цитата(demiurg_spb @ Jun 5 2014, 18:35) *
За все ARMV7 не скажу, а для ARMV7-M можно написать обработчик прерывания HardFault и там вывести в консоль значения регистров и их проанализировать.

Не путайте человека. У него ARM7, а вы ему про Cortex-M.
В ARM7 никакого HardFault в принципе нет.
demiurg_spb
Цитата(jcxz @ Jun 5 2014, 19:02) *
Принято.
ig_z
QUOTE (Grizzzly @ Jun 5 2014, 13:50) *
Пытаюсь найти ошибку, приводящую к prefetch abort.


У микриума в примерах есть(был) обработчик с раскруткой стека и выводом в консольку значений регистров.
Grizzzly
Цитата(ig_z @ Jun 6 2014, 12:59) *

Благодарю. Нашел.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.