|
|
  |
Обработка Faults на Cortex-Mx, Как используете? |
|
|
|
Jul 12 2018, 12:41
|

Местный
  
Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264

|
Цитата(jcxz @ Jul 12 2018, 16:29)  А эскалация - это когда к примеру у Вас запрещён BusFault, но происходит причина его вызывающая и, так как он запрещён, то происходит эскалация до HF. У меня обработка всех fault-ов построена на эскалации до HF - так проще, чем писать кучу обработчиков с одинаковыми действиями. В ISR HF по регистрам всегда можно определить первоначальный источник, до эскалации. Ну да. На самом деле-то вот что интересно: вообще возможно ли сделать так, чтобы "вычислить" начальное место, откуда пошло затирание памяти  Вангую, что нет Разве что всегда при входе проверять аргументы на заданные диапазоны (указатели тем более) и в случае чего делать assert() с тем же вызовом SVC и записью в журнал. Да и не совсем очевидно, что делать, если в функцию пришли не ожидаемые параметры (к пример, слишком большой объем запрашиваемых данных на копирование) - совсем не отрабатывать (прямой return из функции), копировать по максимальному ожидаемому размеру, и т.д. Обычно такие ситуации я передаю наверх по стеку вызовов и там уже на уровне логики принимаю решение - делать ли перезапрос, например А вот насчет порчи памяти третьим лицом (функцией в нашем случае) - вещь тоже довольно интересная, случалось сталкиваться с таким, причем даже с отладчиком порой можно просидеть день, ничего не надебаживши. Правда в таких случаях меня все-таки спасают assert-ы по входу функций. Сразу видно кому снесло голову.
|
|
|
|
|
Jul 12 2018, 12:51
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(haker_fox @ Jul 12 2018, 08:10)  Один из источников полностью программный. Т.е. связка таймер-ПДП-АЦП рулит ШИМ и обеспечивает цифровой ПИД-регулятор. В XMC4xxx можно периферию связывать между собой ещё более аппаратно - даже без использования DMA, который вносит непредсказуемую задержку. Например в текущем проекте у меня передача блока данных по UART запускается сигналом от таймера (аппаратным сигналом без всяких DMA). Это позволяет устройству-приёмнику синхронизировать свои часы с передатчиком с точностью до такта CPU. С DMA такое не сделаешь. Или например: АЦП по нескольким каналам измеряет и суммирует данные с большой скоростью, но пропускает окна из заданного числа тактов вокруг интервалов мёртвого времени от 3-фазного ШИМ (сигналы у переключении ключей на время замораживают АЦП), убирая таким образом из измерений помехи в моменты переключения мощной нагрузки. Да ещё много что возможно.  Цитата(Arlleex @ Jul 12 2018, 15:41)  Ну да. На самом деле-то вот что интересно: вообще возможно ли сделать так, чтобы "вычислить" начальное место, откуда пошло затирание памяти  Вангую, что нет  В общем случае нет, но в части таких случаев - возможно. Нужны соответствующие инструменты. Вот тут коллега haker_fox (вроде?) писал, что работает с LPC43xx. Так в нём есть ETB. Он позволяет сделать обратную отладку. И если со времени первопричины прошло не очень много времени, то так можно найти её. Ну или эмулировать возможности ETB программно: у меня например для этого во многих проектах реализован "Монитор выполнения" - это высокочастотное периодическое прерывание, в котором в FIFO фиксируются регистры CPU и верхушка стека. Он не раз мне тоже помогал находить такие сложные ошибки с разрушением памяти. Цитата(Arlleex @ Jul 12 2018, 15:41)  А вот насчет порчи памяти третьим лицом (функцией в нашем случае) - вещь тоже довольно интересная, случалось сталкиваться с таким А мне даже очень часто случалось сталкиваться. Потому что работаю обычно в команде, и это третье лицо очень часто - один из коллег. Вот это самая засада, когда у тебя начинает глючить совершенно на ровном месте когда ты ничего не менял даже. Просто накосячил один из коллег...
|
|
|
|
|
Jul 12 2018, 13:15
|

Местный
  
Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264

|
Цитата(jcxz @ Jul 12 2018, 16:51)  А мне даже очень часто случалось сталкиваться. Потому что работаю обычно в команде, и это третье лицо очень часто - один из коллег. Вот это самая засада, когда у тебя начинает глючить совершенно на ровном месте когда ты ничего не менял даже. Просто накосячил один из коллег... Вот тут я Вас очень даже понимаю. Бывает над одним проектом работает несколько человек и у каждого "работает все". Про ETB спасибо, кстати, надо бы до конца поразбираться со всякими CoreSight финтиклюшками - ITM, TPIU, ETB (Embedded Trace Bus который) и т.д. А то может уже все придумали давно а мы я не пользуемся(-юсь)
|
|
|
|
|
Jul 12 2018, 19:40
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(jcxz @ Jul 11 2018, 23:01)  Ну никто-ж не спорит, что лучше быть богатым и здоровым чем бедным и больным писать код сразу и без багов. Но что-то ни у кого это не получается. И при компиляции в RELEASE ненайденные баги не исчезают волшебным образом.  Сдаётся мне, что попытка вытворить такое не уменьшит, а наоборот - увеличит вероятность наличия багов. Вопрос не куда деваются баги, а где и когда их лучше искать. Просто включить логику и осознать целесообразность. При полной неопределенности целесообразней искать там где удобно. А напрягать юзеров и техподдержку логами не имеет смысла. Я на этом обжегся. Во-первых юзеры устраивают истерику когда просишь логи, а тех.поддержка почитав логи начинает косо смотреть и требовать расшифровщик логов для их уровня интеллекта и даже начинают требовать что писать и что не писать в логи. Второе, искать надо там где бОльшая вероятность. И я согласен с ST, что самый чувствительный участок - это RAM. RAM занимает самую большую площадь на чипе. А сбои в RAM-е имеют свойство накапливаться. Поэтому чем чаще тестируете RAM тем меньше накопленных ошибок будет. Ну и последняя модная фишка от IAR 8.20 - стековые канарейки (stack canaries) Такая фича компилера, когда он автоматом вставляет некую проверку стека на целостность в каждую подозрительную функцию. Кста, если кто забыл. Есть еще такая фича у IAR как С-RUN Runtime Checking, тож проверяет кучу косяков в риалтайме как и Ubsan
|
|
|
|
|
Jul 13 2018, 01:27
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
QUOTE (AlexandrY @ Jul 13 2018, 03:40)  Ну и последняя модная фишка от IAR 8.20 - стековые канарейки (stack canaries) Такая фича компилера, когда он автоматом вставляет некую проверку стека на целостность в каждую подозрительную функцию. Прямо сейчас внедрил в проект этот инструмент. Пусть будет. Вдруг поймает что-то. AlexandrY, я, как понял, вы IAR только используете?
--------------------
Выбор.
|
|
|
|
|
Jul 17 2018, 09:54
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Arlleex @ Jul 17 2018, 12:03)  А нормальная ли практика фиксировать критические события во внутреннюю Program Flash МК? Не лучший вариант, если принять во внимание сложность реализации и возникающую привязку к железу. EEPROM стоит копейки, ни к чему экономить. Цитата(AlexandrY @ Jul 17 2018, 12:09)  Расскажите лучше как вы по регистровым фреймам способны хоть что-то понять о причине сбоя.  Аншлаг прям.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|