| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Hard Fault handle http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=13256 |
Страница 1 от 1 |
| Автор: | breaniac [ Сря Окт 08, 2014 4:16 pm ] | |||||||||
| Заглавие: | Hard Fault handle | |||||||||
Здравейте, реших да отворя този пост поне же четейки в нет-а за т.нар Hard Fault handle, намирам различна информация за това как да дебъгна и да видя какво при причинява този ивент (ако така мога да го нарека), и нещата се пообъркват наместа. Проблемът който се явява е слудният: имам функция, която ми обсужва hard fault ивентът - FaultISR(). Тялото й не е нищо особенно, един while(1) и нищо повече. Нейния handler е поместен във векторната тяблица инициализираща ми се в началото на програмата:
това което се опитвам да разбера е какво ми генерира този hadr fault interrupt, или какъв е event-ът който ми вкарва изпълнението на кодът в тази FaultISR() функция? Понеже кодът ми радоти с един от UAR-те на чипът,който ползвам, статур регистърът за прекъсванията ми показва че когато се извика тази функция имам прекъсвания съответно TX,RX и Overflow. Ако намаля скороста на комуникация на 9600 (понеже работя на 115200) са ми вдигнати съответно флагове RX и Overflow. Ако намаля броят байтове които изпращам при 9600, RX и Overflow пак ми се вдигат , но този път не влизам в FaultISR() а в друга фунция, която има същото "тяло", самоче е свързана с препълването на стекът на задачата която в моментът ми рънва(използвам ОС за моят апликейшън и има заредени две задачи в опашката на раунд робина). Може ли накой да даде мнение, как мога да разбера, кой event ми вика FaultISR()? Благодаря ви предварително!!! Поздрави ! |
||||||||||
| Автор: | miro_atc [ Сря Окт 08, 2014 4:43 pm ] |
| Заглавие: | Re: Hard Fault handle |
Като начало е добре да кажеш кой е проца, а не да гадаем по векторната таблица... Както ти пише в коментарите hardfault се получава когато възникне проблем за който няма подходящ ексепшън или когато има ексепшън, обаче той не може да бъде извикан, защото неговият приоритет е по-нисък от текущия. Второто е по-вероятната причина в твоя случай. Примери за това е ако да кажем се опиташ да изпълниш svc инструкция от прекъсване, което е с по-висок приоритет от приоритета на svc handler-a. Има и още един куп ситуации с омазани стек поинтери и т.н. По-важното е как се разбира къде е проблема... Първо в хендлъра е добре да инспектираш system control block-а (SCB) там има разни регистри (BFAR, MMFAR и т.н) дето понякога помагат да се ориентираш Второ в конкретното желязо може да имаш още жокери, ама сега няма да гадая какво ти е джелязото... Трето, може с дебъгване. Повечето дебъгери могат да брейкват автоматично при ексепшън, в краен случай слагаш цикъл, който чака някаква променлива да стане нещо различно от дефаулт стойността си... та от дебъгера й сменяш стойността, за да излезеш от цикъла и многоо внимателно минаваш на дебъг на асемблер, инструкция по инструкция и внимаваш при излизане от ексепшъна къде ще отиде. Ако имаш късмет ще отиде на проблемния код, а може и да се върне в хардфаулт.... В тоя случай може да си провериш и регистрите, и стека... При всички случаи се разбира, само понякога е по-сложно.... особено ако си с кеш и пишеш на адрес дето го няма, тогава отиваш на impresize exception, това е малко по-сложно но обикновено не e хардфаулт.... |
|
| Автор: | breaniac [ Сря Окт 08, 2014 4:52 pm ] |
| Заглавие: | Re: Hard Fault handle |
Здравей, проца върху който пиша е CORTEX M4 това е ядрото на чипът, а самият чип е СС3200 (WiFi module). Иначе за дебъг ползвам Code Composer Studio на Тексас. Средата е като тази на Eclipse... а как мога да взема инспектирам SCB? |
|
| Автор: | breaniac [ Сря Окт 08, 2014 4:56 pm ] | ||
| Заглавие: | Re: Hard Fault handle | ||
Използвам прикаченият файл за работа с ядрото....
|
|||
| Автор: | miro_atc [ Сря Окт 08, 2014 5:18 pm ] |
| Заглавие: | Re: Hard Fault handle |
1) конкретното джелязо не ми е познато, както и композера... 2) няма нужда да прикачваш АРМ документации.... по-скоро аз мога ти прикачвам в случай че не може да се ориентираш. Не помня дали в generic user guide-a или в документите за дебъг модулите беше описан SCB-то. Общо взето ако сега навлизаш в АРМ по-добре сам да се полуташ малко, щото тяхната документация е много пръсната и трябва да свикваш Иначе как да инспектираш... тоя дебъгер дето го ползваш не позволява ли да четеш адреси? Ако не позволява сменяй го овреме Принципно зависи какъв емулатор ползваш, примерно OCD-то си има конзола и команда за четене на адрес, макар че за целта трябва да знаеш кои регистри на кои адреси. Другия вариант е през дебъгера, който или трябва да има някакъв визуален начин, било то memory browser било то нещо експрешън... аз не съм им съпорт и не мога да ти помогна. И другия вариант ако дебъгера има конзола... както GDB примерно там p (или print) и ти показва каквото кажеш. Може да е адрес кастнат до някакъв тип, а ако ги имаш дефинирани регистрите както са дефинирани, ама как са дефинирани питай съпорта си или АРМ за техния смотан CMSIS. Aз мога да ти кажа как е при мен "p *SCB" или "p/x *SCB" показва (в GDB) всички регистри нa SCB-to... a "p/x SCB->SCB_MMFAR" показва конкретен регистър, само че това едва ли те топли... |
|
| Автор: | miro_atc [ Сря Окт 08, 2014 6:10 pm ] |
| Заглавие: | Re: Hard Fault handle |
Важното е че се справяш Сега спираш на хардфаулта и гледаш откъде е дошло и/или SCB-то... |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|