Микроконтролери и електроника
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 е поместен във векторната тяблица инициализираща ми се в началото на програмата:
Код:
#pragma DATA_SECTION(g_pfnVectors, ".intvecs")
void (* const g_pfnVectors[256])(void) =
{
    (void (*)(void))((unsigned long)&__STACK_END),
                                            // The initial stack pointer
    ResetISR,                               // The reset handler
    NmiSR,                                  // The NMI handler
    FaultISR,                               // The hard fault handler
                  /*A hard fault is an exception that occurs because of an error during exception processing,or because an exception cannot be managed by any other exception mechanism. Hard faults have a fixed priority of -1, meaning they have higher priority than any exception with configurable priority.*/
    IntDefaultHandler,                      // The MPU fault handler
    BusFaultHandler,                        // The bus fault handler
    IntDefaultHandler,                      // The usage fault handler
    0,                                      // Reserved
    0,                                      // Reserved
    0,                                      // Reserved
    0,                                      // Reserved
#ifdef USE_FREERTOS
    vPortSVCHandler,                        // SVCall handler
#else
    IntDefaultHandler,                      // SVCall handler
#endif
    IntDefaultHandler,                      // Debug monitor handler
    0,                                      // Reserved
#ifdef USE_FREERTOS
    xPortPendSVHandler,                     // The PendSV handler
    xPortSysTickHandler,                    // The SysTick handler
#else
    IntDefaultHandler,                      // The PendSV handler
    IntDefaultHandler,                      // The SysTick handler
#endif
    IntDefaultHandler,                      // GPIO Port A
    IntDefaultHandler,                      // GPIO Port B
    IntDefaultHandler,                      // GPIO Port C
    IntDefaultHandler,                      // GPIO Port D
    0,                                      // Reserved
    IntDefaultHandler,                      // UART0 Rx and Tx
    IntDefaultHandler,                      // UART1 Rx and Tx
    0,                                      // Reserved
    IntDefaultHandler,                      // I2C0 Master and Slave
    0,0,0,0,0,                              // Reserved
    IntDefaultHandler,                      // ADC Channel 0
    IntDefaultHandler,                      // ADC Channel 1
    IntDefaultHandler,                      // ADC Channel 2
    IntDefaultHandler,                      // ADC Channel 3
    IntDefaultHandler,                      // Watchdog Timer
    IntDefaultHandler,                      // Timer 0 subtimer A                     
    IntDefaultHandler,                      // Timer 0 subtimer B
    IntDefaultHandler,                      // Timer 1 subtimer A
    IntDefaultHandler,                      // Timer 1 subtimer B
    IntDefaultHandler,                      // Timer 2 subtimer A
    IntDefaultHandler,                      // Timer 2 subtimer B
    0,0,0,0,                                // Reserved
    IntDefaultHandler,                      // Flash
    0,0,0,0,0,                              // Reserved
    IntDefaultHandler,                      // Timer 3 subtimer A
    IntDefaultHandler,                      // Timer 3 subtimer B
    0,0,0,0,0,0,0,0,0,                      // Reserved
    IntDefaultHandler,                      // uDMA Software Transfer
    IntDefaultHandler,                      // uDMA Error
    0,0,0,0,0,0,0,0,0,0,                    // Reserved
    0,0,0,0,0,0,0,0,0,0,                    // Reserved
    0,0,0,0,0,0,0,0,0,0,                    // Reserved
    0,0,0,0,0,0,0,0,0,0,                    // Reserved
    0,0,0,0,0,0,0,0,0,0,                    // Reserved
    0,0,0,0,0,0,0,0,0,0,                    // Reserved
    0,0,0,0,0,0,0,0,0,0,                    // Reserved
    0,0,0,0,0,0,0,0,0,0,                    // Reserved
    0,0,0,0,0,0,0,0,0,0,                    // Reserved
    0,0,0,0,0,0,0,0,0,0,                    // Reserved
    IntDefaultHandler,                      // SHA
    0,0,                                    // Reserved
    IntDefaultHandler,                      // AES
    0,                                      // Reserved
    IntDefaultHandler,                      // DES
    0,0,0,0,0,                              // Reserved
    IntDefaultHandler,                      // SDHost
    0,                                      // Reserved
    IntDefaultHandler,                      // I2S
    0,                                      // Reserved
    IntDefaultHandler,                      // Camera
    0,0,0,0,0,0,0,                          // Reserved
    IntDefaultHandler,                      // NWP to APPS Interrupt
    IntDefaultHandler,                      // Power, Reset and Clock module
    0,0,                                    // Reserved
    IntDefaultHandler,                      // Shared SPI
    IntDefaultHandler,                      // Generic SPI
    IntDefaultHandler,                      // Link SPI
    0,0,0,0,0,0,0,0,0,0,                    // Reserved
    0,0,0,0,0,0,0,0,0,0,                    // Reserved
    0,0,0,0,0,0,0,0,0,0,                    // Reserved
    0,0,0,0,0,0,0,0,0,0,                    // Reserved
    0,0,0,0,0,0,0,0,0,0,                    // Reserved
    0,0,0,0,0,0,0,0,0,0,                    // Reserved
    0,0                                     // Reserved
};

това което се опитвам да разбера е какво ми генерира този 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

Използвам прикаченият файл за работа с ядрото....

Прикачени файлове:
DUI0553A_cortex_m4_dgug.pdf [1.67 MiB]
223 пъти

Автор:  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" показва конкретен регистър, само че това едва ли те топли...

Автор:  breaniac [ Сря Окт 08, 2014 5:50 pm ]
Заглавие:  Re: Hard Fault handle

За дебъгера, да мога да чета адреси както и да следя регистрите на самото ядро. Иначе за документацията занам че е разпръсната. В момента работя с три документа едновременно :), а и да допълня не работя с нея от ден два, именно заради това отворих и този пост. Иначе може да погледнеш двата скрииншота за това как мога да чета от адреси или да имам поглед върху регистрите на ядрото. Благодаря!

Прикачени файлове:
Core_Address.jpg
Core_Address.jpg [ 450.53 KiB | Прегледано 2405 пъти ]
Address.jpg
Address.jpg [ 393.25 KiB | Прегледано 2405 пъти ]

Автор:  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/