|
Hard Fault Exception на кортексе м3, как узнать откуда прилезло |
|
|
|
 |
Ответов
|
Mar 31 2017, 09:02
|
Знающий
   
Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839

|
Цитата(juvf @ Mar 31 2017, 11:30)  По мойму нельзя. Можно. Более того есть смысл оформить обработчик так: Код void Default_Handler(void) { volatile int i = 1; while (i) { } } Тогда можно переменную i в отладчике поменять на 0 и пройтись до выхода из HardFault, выйдет как раз в место его возникновения, бывает очень удобно. Можно конечно адрес из стека вытащить, но так проще, удобней, нагляднее.
|
|
|
|
|
Mar 31 2017, 09:13
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Шаманъ @ Mar 31 2017, 11:02)  Тогда можно переменную i в отладчике поменять на 0 и пройтись до выхода из HardFault, выйдет как раз в место его возникновения, бывает очень удобно. Можно конечно адрес из стека вытащить, но так проще, удобней, нагляднее. У Cortex есть неточные ошибки с памятью (Imprecise Bus Fault). Так Вы их место не найдёте. А через регистры - найдёте. Да и очень неудобно каждый раз вспоминать где какой стек, лучше иметь готовый код. Не зря же даже в винде подобный обработчик сделали с регистрами и стеком (синий экран). Вот у меня как раз подобный для Cortex есть  Цитата(Forger @ Mar 31 2017, 11:08)  Все HF следует отлавливать еще на этапе отладки и прогона на месте, иначе грош-цена такому коду. А вот для фиксации различных событий и т. п. следует использовать самописный или готовый журнал событий, который писать на внешнюю или внутр. флэшку. Это конечно всё хорошо и правильно. Но на практике почему-то случаются такие ошибки (в том числе и HF), которые проявляются почему-то только у заказчика Вот тут-то фиксация в журнал спасает (а особенно - в энергонезависимый).
|
|
|
|
|
Mar 31 2017, 09:32
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(jcxz @ Mar 31 2017, 12:13)  У Cortex есть неточные ошибки с памятью (Imprecise Bus Fault). Так Вы их место не найдёте. А через регистры - найдёте. Да и очень неудобно каждый раз вспоминать где какой стек, лучше иметь готовый код. А не надо думать про стек. При шаге - возврате из обработчика - попадете туда, откуда упали. Цитата(jcxz @ Mar 31 2017, 12:13)  Но на практике почему-то случаются такие ошибки (в том числе и HF), которые проявляются почему-то только у заказчика  Летом было. На скорую руку поправил одну функцию, типа, улучшил, по требованию. Проверил - работает, да и забыл про нее. Отправили 10 приборов в Нижний Новгород. Там они все "зависли намертво". Вернулись назад. Причину нашел быстро. Если бы там были лучшие умельцы, могли бы обновить программу сами. Но таковых не оказалось. Я уже заподозрил в попытке взлома...
|
|
|
|
|
Mar 31 2017, 09:46
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(ViKo @ Mar 31 2017, 11:32)  А не надо думать про стек. При шаге - возврате из обработчика - попадете туда, откуда упали. Не обязательно. Прочитайте про неточные ошибки с памятью. Fault может произойти через несколько команд после места ошибки. Когда уже может выполняться другая функция или даже другая задача ОС или ISR. Возвращаетесь так по LR, а в том месте даже команд обращения к памяти вообще нет.  Цитата(ViKo @ Mar 31 2017, 11:32)  Вернулись назад. Причину нашел быстро. Если бы там были лучшие умельцы, могли бы обновить программу сами. Но таковых не оказалось. Я уже заподозрил в попытке взлома...  Надо делать удалённое обновление. Цитата(Шаманъ @ Mar 31 2017, 11:38)  ViKo уже ответил, все произойдет само - вернетесь туда откуда выпали, вне зависимости от используемого стека. И Вам тоже - читать мануал на ядро Cortex-M. Плюс - набраться опыта в отладке и ловле fault-ов. Или тут все только с Cortex-M0 работают где нет кешей и буферов отложенной записи и т.п.? Ну так и это ненадолго.
|
|
|
|
|
Mar 31 2017, 10:31
|
Знающий
   
Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839

|
Цитата(jcxz @ Mar 31 2017, 12:46)  Не обязательно. Прочитайте про неточные ошибки с памятью. Fault может произойти через несколько команд после места ошибки. Когда уже может выполняться другая функция или даже другая задача ОС или ISR. Возвращаетесь так по LR, а в том месте даже команд обращения к памяти вообще нет.  И Вам тоже - читать мануал на ядро Cortex-M. Плюс - набраться опыта в отладке и ловле fault-ов. Или тут все только с Cortex-M0 работают где нет кешей и буферов отложенной записи и т.п.? Ну так и это ненадолго.  Вы претендуете на наличие у Вас универсального решения? Так сказали "а", говорите "б" - рассказывайте, чтобы и кэши учитывались и несколько комманд и т.д., или Вы чисто поговорить? Я на наличие универсального решения не претендовал. 99% разных fault отлавливаются приведенным выше алгоритмом. Если fault произошел не в той команде куда возвратились смотрим, что было до нее. Если совсем туго, то смотрим в регистр BFSR, оттуда можно почерпнуть полезной инфы в том числе произошла ли ошибка по адресу возврата или нет. Ну и если так ничего и не понятно через регистр ACTLR можно поотключать разные улучшатели и сделать из М7 почти что М0  Но, по моему опыту (М3/М7) обычно все отлавливается после возврата простым анализом 5..10 комманд до точки возврата.
|
|
|
|
Сообщений в этой теме
klen Hard Fault Exception на кортексе м3 Feb 4 2010, 10:37 klen проблему я пофиксил - SNTP клиент косячил. все пре... Feb 4 2010, 17:12 AHTOXA Вот так у меня сработало:
Кодvoid hard_fault_hand... Feb 5 2010, 11:23  klen очень хорошо будем смотреть в "бубен около ко... Feb 5 2010, 14:45   AHTOXA Цитата(klen @ Feb 5 2010, 19:45) только с... Feb 5 2010, 14:58    klen уря уря уря!!!
naked действительно во ... Feb 5 2010, 15:23 juvf Выпадаю в Hard Fault Exception. описал обработчик... Feb 25 2014, 18:54 AHTOXA Судя по
Цитата(juvf @ Feb 26 2014, 00:54... Feb 26 2014, 11:30  jcxz Цитата(AHTOXA @ Feb 26 2014, 17:30) Судя ... Feb 27 2014, 02:20   AHTOXA Цитата(jcxz @ Feb 27 2014, 08:20) Почему ... Feb 27 2014, 05:21    jcxz Цитата(AHTOXA @ Feb 27 2014, 11:21) Потом... Feb 27 2014, 06:09     Сергей Борщ Цитата(jcxz @ Feb 27 2014, 08:09) Адрес в... Feb 27 2014, 06:56      jcxz Функции как вызываются? Правильно: обычно через BL... Feb 27 2014, 07:48       Сергей Борщ Цитата(jcxz @ Feb 27 2014, 09:48) BL что ... Feb 27 2014, 09:51        jcxz Цитата(Сергей Борщ @ Feb 27 2014, 15:51) ... Feb 27 2014, 11:42     AHTOXA Цитата(jcxz @ Feb 27 2014, 12:09) Адрес в... Feb 27 2014, 08:46      jcxz Цитата(AHTOXA @ Feb 27 2014, 14:46) Судя ... Feb 27 2014, 09:11       AHTOXA Цитата(jcxz @ Feb 27 2014, 15:11) И что? ... Feb 27 2014, 10:54        jcxz Цитата(AHTOXA @ Feb 27 2014, 16:54) Потом... Feb 27 2014, 11:51         juvf Цитата(jcxz @ Feb 27 2014, 16:51) если ад... Feb 27 2014, 12:05          jcxz Цитата(juvf @ Feb 27 2014, 18:05) ну адре... Feb 27 2014, 12:50           juvf Цитата(jcxz @ Feb 27 2014, 17:50) Если у ... Feb 27 2014, 13:03         AHTOXA Цитата(juvf @ Feb 27 2014, 17:48) Думаю, ... Feb 27 2014, 15:00          jcxz Цитата(AHTOXA @ Feb 27 2014, 21:00) При т... Feb 28 2014, 02:32           AHTOXA Цитата(jcxz @ Feb 28 2014, 08:32) Вот тол... Feb 28 2014, 04:36            jcxz Я с вами тоже Feb 28 2014, 05:59 juvf спасибо.
перед 0x8002c09 такой код
КодLDR R1, ... Feb 26 2014, 12:28 AHTOXA Цитата(juvf @ Feb 26 2014, 18:28) перед 0... Feb 26 2014, 12:54 Axel Цитата(juvf @ Feb 26 2014, 16:28) Подозре... Feb 26 2014, 14:00 MALLOY2 Если это иар и используется его алокатор, то вам h... Feb 26 2014, 12:47 ViKo При прерываниях адрес возврата сохраняется в стек ... Feb 27 2014, 05:51 juvf Думаю, что я нашел граблю. я в одном потоке делаю ... Feb 27 2014, 11:48 juvf Давайте жить дружно Feb 28 2014, 09:14 juvf stm32L052 падает в HF
пытаюсь сделать обработчик ... Mar 30 2017, 15:27 AHTOXA Цитата(juvf @ Mar 30 2017, 20:27) Error[O... Mar 30 2017, 16:10 jcxz Цитата(juvf @ Mar 30 2017, 17:27) препроц... Mar 30 2017, 17:03  juvf Цитата(jcxz @ Mar 30 2017, 22:03) Препроц... Mar 31 2017, 03:34    Forger Цитата(jcxz @ Mar 31 2017, 12:13) Вот тут... Mar 31 2017, 09:17      ViKo Цитата(jcxz @ Mar 31 2017, 12:46) Не обяз... Mar 31 2017, 10:07       jcxz Цитата(ViKo @ Mar 31 2017, 12:07) Этот вы... Mar 31 2017, 10:17        ViKo Цитата(jcxz @ Mar 31 2017, 16:11) Читайте... Mar 31 2017, 13:37         jcxz Цитата(ViKo @ Mar 31 2017, 15:37) Только ... Mar 31 2017, 14:34       Forger Цитата(Шаманъ @ Mar 31 2017, 13:31) Но, п... Mar 31 2017, 13:39    Шаманъ Цитата(jcxz @ Mar 31 2017, 12:13) У Corte... Mar 31 2017, 09:38 ViKo Можно. Только, когда ошибка появляется в рабочем п... Mar 31 2017, 08:14 Forger Цитата(ViKo @ Mar 31 2017, 11:14) Можно. ... Mar 31 2017, 09:08 Obam "…в рабочем приборе, вдалеке от отладчика…... Mar 31 2017, 08:26 ViKo Цитата(Obam @ Mar 31 2017, 11:26) "…... Mar 31 2017, 08:38 ViKo Будем считать, что мне везло, и я всегда попадал и... Mar 31 2017, 10:34 Шаманъ Цитата(jcxz @ Mar 31 2017, 16:11) Читайте... Mar 31 2017, 14:01 Forger Цитата(Шаманъ @ Mar 31 2017, 17:01) Я обы... Mar 31 2017, 14:11  Шаманъ Цитата(Forger @ Mar 31 2017, 17:11) А я п... Mar 31 2017, 14:35   Forger Цитата(Шаманъ @ Mar 31 2017, 17:35) Но ра... Mar 31 2017, 15:04    Шаманъ Цитата(Forger @ Mar 31 2017, 18:04) Честн... Mar 31 2017, 16:08     Forger Цитата(Шаманъ @ Mar 31 2017, 19:08) У мен... Mar 31 2017, 16:28      Шаманъ Цитата(Forger @ Mar 31 2017, 19:28) Потом... Mar 31 2017, 17:16       Forger Цитата(Шаманъ @ Mar 31 2017, 20:16) В кон... Mar 31 2017, 18:05
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|