|
|
  |
Help! Не вызываются IRQ в обработчике Data Abort |
|
|
|
Mar 1 2007, 21:37
|
Местный
  
Группа: Свой
Сообщений: 201
Регистрация: 23-01-06
Из: Msk
Пользователь №: 13 490

|
Переопределил функцию обработчика исключений (keil carm):
void DAbt_Handler(void) __arm { extern unsigned long E_LastErrAdr; __asm { ldr r6, =E_LastErrAdr; } // это рутина для сохранения адреса где случилось exception __asm { subs r7, lr, #8; } __asm { str r7, [r6, #0x00]; }
__asm { MSR cpsr_c, #0x90; } // user mode + irq enable
printf ("Data access violation! Address = 0x%08x\n", E_LastErrAdr); while (1); }
Putchar() тоже переопределен - данные сначала кладутся в буфер, затем по прерыванию выпихиваются в порт uart1. Дык вот, почему то не происходит вызов обработчика прерывания uart1, хотя соответствующие биты в 1-це (RawInt + IntEnable)...
|
|
|
|
|
Mar 2 2007, 01:30
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Цитата почему то не происходит вызов обработчика прерывания uart1 Чего-то недопонял, наверно. Помнится, исключение Abort имеет более высокий приоритет, чем исключение IRQ
--------------------
aka Vit
|
|
|
|
|
Mar 2 2007, 10:33
|
Местный
  
Группа: Свой
Сообщений: 201
Регистрация: 23-01-06
Из: Msk
Пользователь №: 13 490

|
Цитата(sensor_ua @ Mar 2 2007, 01:30)  Цитата почему то не происходит вызов обработчика прерывания uart1 Чего-то недопонял, наверно. Помнится, исключение Abort имеет более высокий приоритет, чем исключение IRQ И чего делать?! Я ж переключаюсь обратно в user-режим...
|
|
|
|
|
Mar 3 2007, 08:33
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Цитата Я ж переключаюсь обратно в user-режим... Немного не досмотрел комменты. Но в том, что Вам это удастся инлайновым ассемблером сделать, я очень не уверен - о нас компиляторы слишком сильно заботятся, чтобы мы глупостей не наделали  . На голом асме эти строки если переписать, то, вероятнее всего, даже заработает. Только, ИМХО, это всё-равно изврат - в таком неприятном месте пытаться так вывернуться. Прислушайтесь к Dron_Gus лучше или вааще попробуйте обойтись без такой затеи.
--------------------
aka Vit
|
|
|
|
|
Mar 4 2007, 18:02
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(sensor_ua @ Mar 3 2007, 07:33)  Цитата Я ж переключаюсь обратно в user-режим... Немного не досмотрел комменты. Но в том, что Вам это удастся инлайновым ассемблером сделать, я очень не уверен - о нас компиляторы слишком сильно заботятся, чтобы мы глупостей не наделали Переключение произойдет нормально. Но мы не знаем где именно и из-за чего произошел Abort (вполне возможно из-за переполнения стека или из-за порчи кода), поэтому надо также, кроме перехода в user режим, перенастроить стек, перенастроить обработчики исключений, переинициализировать VIC, переинициализировать периферию, использовать заведомо целые функции и обработчики прерываний. И только тогда слать сообщение. Когда возникает Dabt, нельзя расчитывать на то, что хоть какие-то функции основной программы будут работать. Все сообщения должны быть "hardcoded".
|
|
|
|
|
Mar 6 2007, 13:42
|
Местный
  
Группа: Свой
Сообщений: 201
Регистрация: 23-01-06
Из: Msk
Пользователь №: 13 490

|
Цитата(defunct @ Mar 4 2007, 18:02)  Когда возникает Dabt, нельзя расчитывать на то, что хоть какие-то функции основной программы будут работать. Все сообщения должны быть "hardcoded". Спасибо, так и сделаю... P.S. переключение в режим проходит нормально
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|