Отговори на тема  [ 7 мнения ] 
Hard Fault handle 
Автор Съобщение
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Сеп 17, 2011 10:13 am
Мнения: 112
Мнение 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()? Благодаря ви предварително!!!
Поздрави !


Сря Окт 08, 2014 4:16 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: Hard Fault handle
Като начало е добре да кажеш кой е проца, а не да гадаем по векторната таблица...

Както ти пише в коментарите hardfault се получава когато възникне проблем за който няма подходящ ексепшън или когато има ексепшън, обаче той не може да бъде извикан, защото неговият приоритет е по-нисък от текущия. Второто е по-вероятната причина в твоя случай. Примери за това е ако да кажем се опиташ да изпълниш svc инструкция от прекъсване, което е с по-висок приоритет от приоритета на svc handler-a. Има и още един куп ситуации с омазани стек поинтери и т.н.

По-важното е как се разбира къде е проблема...
Първо в хендлъра е добре да инспектираш system control block-а (SCB) там има разни регистри (BFAR, MMFAR и т.н) дето понякога помагат да се ориентираш ;-)
Второ в конкретното желязо може да имаш още жокери, ама сега няма да гадая какво ти е джелязото...
Трето, може с дебъгване. Повечето дебъгери могат да брейкват автоматично при ексепшън, в краен случай слагаш цикъл, който чака някаква променлива да стане нещо различно от дефаулт стойността си... та от дебъгера й сменяш стойността, за да излезеш от цикъла и многоо внимателно минаваш на дебъг на асемблер, инструкция по инструкция и внимаваш при излизане от ексепшъна къде ще отиде. Ако имаш късмет ще отиде на проблемния код, а може и да се върне в хардфаулт.... В тоя случай може да си провериш и регистрите, и стека...

При всички случаи се разбира, само понякога е по-сложно.... особено ако си с кеш и пишеш на адрес дето го няма, тогава отиваш на impresize exception, това е малко по-сложно но обикновено не e хардфаулт....


Сря Окт 08, 2014 4:43 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Сеп 17, 2011 10:13 am
Мнения: 112
Мнение Re: Hard Fault handle
Здравей, проца върху който пиша е CORTEX M4 това е ядрото на чипът, а самият чип е СС3200 (WiFi module). Иначе за дебъг ползвам Code Composer Studio на Тексас. Средата е като тази на Eclipse... а как мога да взема инспектирам SCB?


Последна промяна breaniac на Сря Окт 08, 2014 4:58 pm, променена общо 2 пъти



Сря Окт 08, 2014 4:52 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Сеп 17, 2011 10:13 am
Мнения: 112
Мнение Re: Hard Fault handle
Използвам прикаченият файл за работа с ядрото....


Прикачени файлове:
DUI0553A_cortex_m4_dgug.pdf [1.67 MiB]
222 пъти
Сря Окт 08, 2014 4:56 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение 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" показва конкретен регистър, само че това едва ли те топли...


Сря Окт 08, 2014 5:18 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Сеп 17, 2011 10:13 am
Мнения: 112
Мнение Re: Hard Fault handle
За дебъгера, да мога да чета адреси както и да следя регистрите на самото ядро. Иначе за документацията занам че е разпръсната. В момента работя с три документа едновременно :), а и да допълня не работя с нея от ден два, именно заради това отворих и този пост. Иначе може да погледнеш двата скрииншота за това как мога да чета от адреси или да имам поглед върху регистрите на ядрото. Благодаря!


Прикачени файлове:
Core_Address.jpg
Core_Address.jpg [ 450.53 KiB | Прегледано 2398 пъти ]
Address.jpg
Address.jpg [ 393.25 KiB | Прегледано 2398 пъти ]
Сря Окт 08, 2014 5:50 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: Hard Fault handle
Важното е че се справяш ;-)

Сега спираш на хардфаулта и гледаш откъде е дошло и/или SCB-то...


Сря Окт 08, 2014 6:10 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 7 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 0 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни