Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Hard Fault Exception на кортексе м3
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2
jcxz
Цитата(ViKo @ Mar 31 2017, 12:07) *
Этот выход указывает, в какой функции глюк. А дальше я уже по исходнику смотрю, что там может быть не так.

да ну? sm.gif
Вот Вы видите что выход произошёл на:
MOVS R0, #1
ADDS R1, #2
LSLS R1, R1, #1
ITT MI
MOVSMI R2,#1
MOVSMI R3,#2
...
и ещё пару десятков подобных команд до этого. И где же глюк? Даже ни одного обращения к памяти нету. cool.gif
А глюк оказывается был вообще в другой задаче, из которой управление только, что было передано сюда (например - переполнение её стека, запись в несуществующую/запрещённую память как раз в момент сохранения контекста, которая из-за наличия отложенной записи выдала Imprecise Bus Fault).
Или он вообще был в ISR, который только что завершился BX LR.
Или наоборот - это код в ISR, который только что прервал задачу, в которой и произошёл данный сбой.
И где точно - Вы не знаете так как неточная ошибка памяти она на то и неточная - что где-то за несколько команд или десяток команд ранее случилась до входа в fault.
Шаманъ
Цитата(jcxz @ Mar 31 2017, 12:46) *
Не обязательно. Прочитайте про неточные ошибки с памятью. Fault может произойти через несколько команд после места ошибки. Когда уже может выполняться другая функция или даже другая задача ОС или ISR. Возвращаетесь так по LR, а в том месте даже команд обращения к памяти вообще нет. wink.gif
И Вам тоже - читать мануал на ядро Cortex-M. Плюс - набраться опыта в отладке и ловле fault-ов.
Или тут все только с Cortex-M0 работают где нет кешей и буферов отложенной записи и т.п.? Ну так и это ненадолго. cool.gif

Вы претендуете на наличие у Вас универсального решения? Так сказали "а", говорите "б" - рассказывайте, чтобы и кэши учитывались и несколько комманд и т.д., или Вы чисто поговорить?

Я на наличие универсального решения не претендовал. 99% разных fault отлавливаются приведенным выше алгоритмом. Если fault произошел не в той команде куда возвратились смотрим, что было до нее. Если совсем туго, то смотрим в регистр BFSR, оттуда можно почерпнуть полезной инфы в том числе произошла ли ошибка по адресу возврата или нет. Ну и если так ничего и не понятно через регистр ACTLR можно поотключать разные улучшатели и сделать из М7 почти что М0 wink.gif

Но, по моему опыту (М3/М7) обычно все отлавливается после возврата простым анализом 5..10 комманд до точки возврата.
ViKo
Будем считать, что мне везло, и я всегда попадал именно в ту функцию, которая вызвала HF. rolleyes.gif (кэшей не было, точно)
А что вы найдете в этом случае через регистры, как писали выше?
jcxz
Цитата(Шаманъ @ Mar 31 2017, 12:31) *
Вы претендуете на наличие у Вас универсального решения? Так сказали "а", говорите "б" - рассказывайте, чтобы и кэши учитывались и несколько комманд и т.д., или Вы чисто поговорить?

Читайте выше. Из соответствующих регистров можно прочитать реальный адрес где произошёл fault.
ViKo
Цитата(jcxz @ Mar 31 2017, 16:11) *
Читайте выше. Из соответствующих регистров можно прочитать реальный адрес где произошёл fault.

Только не в случае Imprecise Bus Fault, разве не так?
Forger
Цитата(Шаманъ @ Mar 31 2017, 13:31) *
Но, по моему опыту (М3/М7) обычно все отлавливается после возврата простым анализом 5..10 комманд до точки возврата.

В подавляющем большинстве подобных случаев в этой злополучной строке будет обращение по указателю, особенно с приведением к другому типу. smile3046.gif
Например, как тут:
Код
if(--(*(MyClass*)p) )
Такой набор символов сходу и прочитать-то правильно сложно, а уж ошибиться - подавно ))

Короче, при HF первым делом нужно проверять (в порядке важности):
отсутствие любых предупреждений при компиляции (иногда даже стоит ужесточить условия их формирования), должно быть "Warinigs: 0"
объем стека/стеков и кучи,
конкурентный доступ к переменным из кода и прерываний (особое внимание обратить на глобальные переменные, которые используются в прерываниях),
все указатели, а особенно те, которые используются с приведением типа,
доступ к не инициализированным локальным переменным,
если есть RTOS и используются приоритеты прерываний, то убедится, что нет вызовов сервисов оси из обработчиков, приоритет прерываний которых выше значения, заданного в настройках оси (FreeRTOS),
ну и может еще что, с ходу не вспомню ))
Шаманъ
Цитата(jcxz @ Mar 31 2017, 16:11) *
Читайте выше. Из соответствующих регистров можно прочитать реальный адрес где произошёл fault.

В смысле мне себя почитать?
Цитата(Шаманъ @ Mar 31 2017, 12:38) *
Вывалились в обработчик посмотрели регистры, вернулись обратно (так сказать с комфортом) и посмотрели как содержимое регистров использовалось в момент вылета.

rolleyes.gif

Цитата(Forger @ Mar 31 2017, 16:39) *
В подавляющем большинстве подобных случаев в этой злополучной строке будет обращение по указателю, особенно с приведением к другому типу. smile3046.gif
Например, как тут:
Код
if(--(*(MyClass*)p) )

Я обычно в таких случаях смотрю ассемблерный код - это намного продуктивнее.
Forger
Цитата(Шаманъ @ Mar 31 2017, 17:01) *
Я обычно в таких случаях смотрю ассемблерный код - это намного продуктивнее.

А я под словом "продуктивный" понимаю такой код, который вообще исключает всякую необходимость рыться в "белье" компилятора biggrin.gif

Сложные выражения предпочитаю разбить на примитивные, так и отлаживать проще.
Зачастую это в итоге вынуждает переписать код, отказавших от мудреных конструкций со "звездочками".
В итоге это экономит кучу времени, которое в ином случае было бы потрачено на поиск причин трудноуловимых багов.
jcxz
Цитата(ViKo @ Mar 31 2017, 15:37) *
Только не в случае Imprecise Bus Fault, разве не так?

Честно говоря - не помню уже. Обработчик fault-ов написал несколько лет назад. И забыл про эту проблему и какие конкретно регистры надо читать - он их сам читает и показывает когда надо. wink.gif
Шаманъ
Цитата(Forger @ Mar 31 2017, 17:11) *
А я под словом "продуктивный" понимаю такой код, который вообще исключает всякую необходимость рыться в "белье" компилятора biggrin.gif

Я тоже за качественный и легко читаемый код - и в этом Вас поддерживаю, обычно это предполагает и отсутствие предмета обсуждения. Но раз уж отлавливаем faultы, то смысл заглянуть в ассемблер есть. А порыться в том, что наделал компилятор я лично люблю, бывает очень полезно и познавательно.
Forger
Цитата(Шаманъ @ Mar 31 2017, 17:35) *
Но раз уж отлавливаем faultы, то смысл заглянуть в ассемблер есть.

Честно, мне было бы вломы рыться в том, что там наделал компилятор на мою кривую конструкцию.
По мне быстрее и проще переписать саму кривую конструкцию, на которой вылезает fault, иначе этот fault вылезет в другом месте ....
Но если бесконечный поиск fault-ов и ковыряние в ассемблере - это некое хобби, то это меняет дело sm.gif
Шаманъ
Цитата(Forger @ Mar 31 2017, 18:04) *
Честно, мне было бы вломы рыться в том, что там наделал компилятор на мою кривую конструкцию.

У меня конструкции обычно достаточно прямые, чтобы код (в смысле сгенерированный компилятором) легко читался.

Цитата
Но если бесконечный поиск fault-ов и ковыряние в ассемблере - это некое хобби, то это меняет дело sm.gif

Не надо передергивать. За последние пол года могу вспомнить только два случая, оба решились в течении пары минут.
Forger
Цитата(Шаманъ @ Mar 31 2017, 19:08) *
У меня конструкции обычно достаточно прямые, чтобы код (в смысле сгенерированный компилятором) легко читался.
Не надо передергивать. За последние пол года могу вспомнить только два случая, оба решились в течении пары минут.

Ну, это у вас заняло всего пару минут и, полагаю, что вы можете позволить себе полистать ассемблерный код под хорошую сигару и стаканчик коньяка у теплого камина, так сказать, в удовольствие sm.gif
Однако, я сильно сомневаюсь, что это можно сказать про того, кто готов заводить целые темы только лишь ради поиска тривиальной причины fault-а (я не про ТС конкретно, а воообще, в целом).
Потому и ваша рекомендация "заглянуть в ассемблерный код", по-моему, звучит несколько надменно что ли ...
Впрочем, не лучше звучат и мои персто-указующие назидания wacko.gif

зы. Что-то тема пошла не в то русло ...
Шаманъ
Цитата(Forger @ Mar 31 2017, 19:28) *
Потому и ваша рекомендация "заглянуть в ассемблерный код", по-моему, звучит несколько надменно что ли ...

Та не, я ничего такого не имел ввиду. Извиняюсь, если кого-то обидел. В конце концов все мы когда-то знали и умели мало sm.gif
Forger
Цитата(Шаманъ @ Mar 31 2017, 20:16) *
В конце концов все мы когда-то знали и умели мало sm.gif

Согласен, очень трудно делиться опытом так, чтобы это не звучало менторским тоном ... у меня ни разу не получалось )))

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