23.05.2013, 23:03
|
|
Гражданин KAZUS.RU
Регистрация: 08.07.2006
Сообщений: 583
Сказал спасибо: 76
Сказали Спасибо 90 раз(а) в 66 сообщении(ях)
|
LPC2138 DAbt_Handler
Вопрос вот какой. Как добавить свой обработчик DAbt_Handler?
Догадываюсь, что надо что-то прописать в Startup.s, но что и где именно, теряюсь
__________________
Sex, Druggs, Rock&Roll
|
|
|
|
24.05.2013, 07:10
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: LPC2138 DAbt_Handler
Туда же, где и все остальные прерывания прописаны... Хоть в main, хоть в стартап
|
|
|
|
24.05.2013, 09:34
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,548
Сказал спасибо: 384
Сказали Спасибо 737 раз(а) в 417 сообщении(ях)
|
Re: LPC2138 DAbt_Handler
Сообщение от alberio
|
Как добавить свой обработчик DAbt_Handler?
|
Если планируется анализ ошибки, то:
1. В Startup.s инициализируете указатель стека и флаги разрешения прерываний для режима "Data Abort".
2. В самом обработчике исключения - сохранение регистров режима, вызвавшего ошибку. lr - 8 =› указатель на инструкцию, вызвавшую "Data_Abort".
3. Собственно обработка, по выбору, на асме или сях.
P.S. В чём тайный смысл "EXPORT Exc_Handler"(строки 265-267), Вы их из С планируете вызывать?
Последний раз редактировалось AJScorp; 24.05.2013 в 09:44.
|
|
|
|
24.05.2013, 13:01
|
|
Гражданин KAZUS.RU
Регистрация: 08.07.2006
Сообщений: 583
Сказал спасибо: 76
Сказали Спасибо 90 раз(а) в 66 сообщении(ях)
|
Re: LPC2138 DAbt_Handler
Вопрос-то у меня - что и где именно . В армовском ассемблере не силен, посем у спрашиваю, нет ли у кого примера кода для таких случаев?
Сообщение от AJScorp
|
P.S. В чём тайный смысл "EXPORT Exc_Handler"(строки 265-267), Вы их из С планируете вызывать?
|
а файл этот взят из примера кейловского, потому в чем этот смысл - увы не знаю
__________________
Sex, Druggs, Rock&Roll
|
|
|
|
24.05.2013, 17:27
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,548
Сказал спасибо: 384
Сказали Спасибо 737 раз(а) в 417 сообщении(ях)
|
Re: LPC2138 DAbt_Handler
Сообщение от alberio
|
нет ли у кого примера кода для таких случаев?
|
Могу поделиться асмовой частью, сишная часть только выводила содержимое структуры на экран.
Код:
|
IMPORT Exc_Context
IMPORT C_Abt_ExcHandler
................................
DAbt_Handler SUB lr, lr, #0x08 ;lr = lr - 8
STMFD sp!, {r0, lr} ;Сохраняем адрес вызвавшей ошибку инструкции в стек
LDR r14, =Exc_Context ;Кладем в r14 адрес структуры для сохранения контекста
STMIA r14, {r0-r14}^ ;Сохраняем регистры в структуру
MRS r0, spsr
STR r0, [r14, #0x3C] ;Сохраняем SPSR в структуру
LDR r0, [sp, #0x04] ;Берём адрес инструкции из стека
STR r0, [r14, #0x40] ;Кладём в структуру
MOV r0, r14 ;В r0 - адрес структуры "Exc_Context", параметр 0 для С-обработчика
BL C_Abt_ExcHandler ;Вызов обработчика на СИ
;Тут нужен анализ результатов работы обработчика на СИ -
;всё хорошо или всё плохо. Куда возвращаться - зависит от того,
;какая ситуация вызвала исключение.
; LDMFD sp!, {r0, pc}^ ;Возврат на вызвавшую ошибку инструкцию |
Структура описывалась в сишной части проекта
Код:
|
typedef struct
{
unsigned int r0; //0x00
unsigned int r1; //0x04
unsigned int r2; //0x08
unsigned int r3; //0x0C
unsigned int r4; //0x10
unsigned int r5; //0x14
unsigned int r6; //0x18
unsigned int r7; //0x1C
unsigned int r8; //0x20
unsigned int r9; //0x24
unsigned int r10; //0x28
unsigned int r11; //0x2C
unsigned int r12; //0x30
unsigned int r13; //0x34
unsigned int r14; //0x38
unsigned int spsr; //0x3C
unsigned int ExcAddr; //0x40
}EXC, *pEXC;
EXC Exc_Context; |
Что менять в Вашем Startup.s не знаю, выкладывайте, посмотрим что там со стеком и вообще.
|
|
|
Сказали "Спасибо" AJScorp
|
|
|
24.05.2013, 18:09
|
|
Гражданин KAZUS.RU
Регистрация: 08.07.2006
Сообщений: 583
Сказал спасибо: 76
Сказали Спасибо 90 раз(а) в 66 сообщении(ях)
|
Re: LPC2138 DAbt_Handler
Код:
|
IMPORT Data_Abort_Handler_C
EXPORT Reset_Handler
EXPORT Undef_Handler
EXPORT PAbt_Handler
EXPORT DAbt_Handler
DAbt_Handler
BL Data_Abort_Handler_C
Reset_Handler
Undef_Handler
PAbt_Handler |
Data_Abort_Handler_C - сишная функция. На что получаю:
Цитата:
|
Error: L6238E: startup.o(RESET) contains invalid call from '~PRES8 (The user did not require code to preserve 8-byte aligment of 8-byte data objects)' function to 'REQ8 (Code was permitted to depend on the 8-byte aligment of 8-byte data items)' function Data_Abort_Handler_C.
|
__________________
Sex, Druggs, Rock&Roll
|
|
|
|
24.05.2013, 20:31
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,548
Сказал спасибо: 384
Сказали Спасибо 737 раз(а) в 417 сообщении(ях)
|
Re: LPC2138 DAbt_Handler
Сообщение от alberio
|
На что получаю:
|
Что-то связанное с разницей в настройках для 8-ми байтного выравнивания кода. Ничего не могу сказать по этому поводу, может кто из знатоков кейла подскажет.
Последний раз редактировалось AJScorp; 24.05.2013 в 20:33.
Причина: очепятка
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:48.
|
|