|
|
  |
источник прерывания, в DummyHandler |
|
|
|
Jan 13 2014, 09:32
|
Местный
  
Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304

|
Советую изучить как работает контроллер прерываний. 1. Почитайте книгу Джозеф Ю "Ядро Cortex M3 компании ARM" 2. Приведенный код позволяет понять, где "застряли". CODE void Hard_fault_handler_c(unsigned long* hardfault_args) { unsigned int stacked_r0; unsigned int stacked_r1; unsigned int stacked_r2; unsigned int stacked_r3; unsigned int stacked_r12; unsigned int stacked_lr; unsigned int stacked_pc; unsigned int stacked_psr;
stacked_r0 = ((unsigned long) hardfault_args[0]); stacked_r1 = ((unsigned long) hardfault_args[1]); stacked_r2 = ((unsigned long) hardfault_args[2]); stacked_r3 = ((unsigned long) hardfault_args[3]);
stacked_r12 = ((unsigned long) hardfault_args[4]); stacked_lr = ((unsigned long) hardfault_args[5]); stacked_pc = ((unsigned long) hardfault_args[6]); stacked_psr = ((unsigned long) hardfault_args[7]);
printf ("[Hard fault handler]\n"); printf ("R0 = %x\n", stacked_r0); printf ("R1 = %x\n", stacked_r1); printf ("R2 = %x\n", stacked_r2); printf ("R3 = %x\n", stacked_r3); printf ("R12 = %x\n", stacked_r12); printf ("LR = %x\n", stacked_lr); printf ("PC = %x\n", stacked_pc); printf ("PSR = %x\n", stacked_psr); printf("BFAR: %x\n", *((volatile uint32_t*)0xE000ED38)); printf("CFSR: %x\n", *((volatile uint32_t*)0xE000ED28)); printf("HFSR: %x\n", *((volatile uint32_t*)0xE000ED2C)); printf("DFSR: %x\n", *((volatile uint32_t*)0xE000ED30)); printf("AFSR: %x\n", *((volatile uint32_t*)0xE000ED3C));
while (1) { } }
/******************************************************************************/ /* Cortex-M3 Processor Exceptions Handlers */ /******************************************************************************/
/** * @brief This function handles NMI exception. * @param None * @retval None */ void NMI_Handler(void) { while (1){}; }
/** * @brief This function handles Hard Fault exception. * @param None * @retval None */ void HardFault_Handler(void) { unsigned int contr_reg;
contr_reg = __get_CONTROL(); if(contr_reg&2) { asm("MRS R0, PSP"); } else{ asm("MRS R0, MSP"); } asm("B (Hard_fault_handler_c)"); //top of stack is in R0. It is passed to C-function.
/* Go to infinite loop when Hard Fault exception occurs */ while (1) { } }
|
|
|
|
|
Jan 13 2014, 10:01
|
Местный
  
Группа: Свой
Сообщений: 443
Регистрация: 11-02-09
Пользователь №: 44 698

|
Цитата(KSN @ Jan 13 2014, 13:32)  contr_reg = __get_CONTROL(); Спасибо А что реализует функция __get_CONTROL хотя понял - регистр контроля Прошу прощения а чем отличаются M3 и M4?
|
|
|
|
|
Jan 13 2014, 12:49
|
Местный
  
Группа: Свой
Сообщений: 443
Регистрация: 11-02-09
Пользователь №: 44 698

|
Цитата(Lotor @ Jan 13 2014, 15:37)  Когда попадете в свой Dummy_Handler, смотрите поле Exception Number в регистре Special-purpose program status registers (xPSR). Получается stacked_psr 0x00000040 Какой это номер 0 или 0x40 Получается номер исключения f9 в регистре Это неадекватное значение - максимум 80 Как такое возможно Может проблема со стеком? Не сталкивались?
|
|
|
|
|
Jan 13 2014, 12:50
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Вы просто в своем Dummy_Handler остановитесь отладчиком и посмотрите xPSR. А до этого действия посмотрите документацию, например, тут - нужное Вам поле ISR NUMBER [8:0].
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Jan 13 2014, 13:07
|
Местный
  
Группа: Свой
Сообщений: 443
Регистрация: 11-02-09
Пользователь №: 44 698

|
Цитата(Lotor @ Jan 13 2014, 16:50)  Вы просто в своем Dummy_Handler остановитесь отладчиком и посмотрите xPSR. А до этого действия посмотрите документацию, например, тут - нужное Вам поле ISR NUMBER [8:0]. в каком поле смотреть xPSR кажется тут сбой памяти в основной прг
Эскизы прикрепленных изображений
|
|
|
|
|
Jan 13 2014, 14:21
|
Местный
  
Группа: Свой
Сообщений: 443
Регистрация: 11-02-09
Пользователь №: 44 698

|
Цитата(Lotor @ Jan 13 2014, 17:46)  Ох, Вам на картинке надо смотреть Interrupt Program Status. Значение сами в состоянии прочитать или тоже помочь?)
Бонус: У Вас HardFault, Вам уже выше подсказали код, как это анализироват. Чтобы быстро узнать место проблемной строки кода: прочтите значение стека, прибавьте к нему 24 и посмотрите, что лежит по этому адресу (0x200024C8 для Вашего случая). Это и будет адрес места, откуда Вы свалились. Мерси
|
|
|
|
|
Jan 14 2014, 08:33
|
Местный
  
Группа: Свой
Сообщений: 443
Регистрация: 11-02-09
Пользователь №: 44 698

|
Цитата(Lotor @ Jan 13 2014, 17:46)  Ох, Вам на картинке надо смотреть Interrupt Program Status. Значение сами в состоянии прочитать или тоже помочь?)
Бонус: У Вас HardFault, Вам уже выше подсказали код, как это анализироват. Чтобы быстро узнать место проблемной строки кода: прочтите значение стека, прибавьте к нему 24 и посмотрите, что лежит по этому адресу (0x200024C8 для Вашего случая). Это и будет адрес места, откуда Вы свалились. А почему плюс 24
|
|
|
|
|
Jan 14 2014, 09:35
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(sifadin @ Jan 14 2014, 12:33)  А почему плюс 24 Потому что документация... Популярно тут.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Jan 14 2014, 12:58
|
Местный
  
Группа: Свой
Сообщений: 443
Регистрация: 11-02-09
Пользователь №: 44 698

|
Цитата(Lotor @ Jan 14 2014, 13:35)  Потому что документация... Популярно тут. Благодарю! А можете кинуть ссылку на руководство по ассемблеру? и на совм исп С и asm На atmel не нашел Честно пытался
|
|
|
|
|
Jan 15 2014, 09:27
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(sifadin @ Jan 14 2014, 16:58)  На atmel не нашел Честно пытался  Ну теперь честно попытайтесь поискать на сайте производителя ядра Вашего мк - armPS Предположу, что Вам будет проще скачать со здешнего фтп книгу, что тут советовали выше.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|