Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обработка исключительной ситуации
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
arttech
Подскажите пожалуйста, как правильно определить функцию обработки исключительных ситуаций на С, для:

- Сбоя выборки PAbt_Handler?A
- Сбоя данных DAbt_Handler?A

В литературе написано, что опиание даётся подобно описанию функций для прерываний:
- void Pabt_Handler (void) __abort
- void Dabt_Handler (void) __abort
в реальности такое описание на проходит, а суффикс __irq результата не даёт...
VladislavS
О какой среде разработки идет речь?
arttech
Цитата(VladislavS @ Nov 10 2007, 20:07) *
О какой среде разработки идет речь?

Да, забыл указать...
Keil, под LPC2368
aaarrr
Цитата(arttech @ Nov 10 2007, 17:51) *
Подскажите пожалуйста, как правильно определить функцию обработки исключительных ситуаций на С, для:

- Сбоя выборки PAbt_Handler?A
- Сбоя данных DAbt_Handler?A

А какой смысл их на C обрабатывать? Так Вы не узнаете ни адреса сбоя (на некоторых процессорах), ни содержимого регистров и стека.
Я предпочитаю делать ассемблерную обёртку для сохранения регистров, а из неё уже передаю управление C-обработчику для вывода отладочной информации.
abcdefg
Цитата(arttech @ Nov 10 2007, 17:51) *
Подскажите пожалуйста, как правильно определить функцию обработки исключительных ситуаций на С, для:

- Сбоя выборки PAbt_Handler?A
- Сбоя данных DAbt_Handler?A

В литературе написано, что опиание даётся подобно описанию функций для прерываний:
- void Pabt_Handler (void) __abort
- void Dabt_Handler (void) __abort
в реальности такое описание на проходит, а суффикс __irq результата не даёт...


?A - обозначает arm-режим, поэтому функция должна определяться как void xAbt_Handler(void) __arm

держи для примера:

void DAbt_Handler(void) __arm
{
extern unsigned long E_LastErrAdr;

__asm { ldr r6, =E_LastErrAdr; }
__asm { subs r7, lr, #8; }
__asm { str r7, [r6, #0x00]; }

printf ("Data access violation! Address = 0x%08x\n", E_LastErrAdr);

while (1);
}
Spb_Alex
>>держи для примера:

>> __asm { subs r7, lr, #8; }

Keil, RealView не знает (не хочет) найти r7, lr - регистры, ругается, что неизвестные переменные, как их задефайнить?
Andrew_Ch
Цитата(Spb_Alex @ Nov 15 2007, 10:10) *
>>держи для примера:

>> __asm { subs r7, lr, #8; }

Keil, RealView не знает (не хочет) найти r7, lr - регистры, ругается, что неизвестные переменные, как их задефайнить?


Пример из хелп RV как писать asm inline. Объявите r7 как int, а затем используйте.

int f(int x)
{
int r0;
__asm
{
ADD r0, x, 1
EOR x, r0, x
}
return x;
}
Spb_Alex
Цитата(Andrew_Ch @ Nov 15 2007, 10:35) *
Пример из хелп RV как писать asm inline. Объявите r7 как int, а затем используйте.

int f(int x)
{
int r0;
__asm
{
ADD r0, x, 1
EOR x, r0, x
}
return x;
}


не, это не дело, просто в новом RV (>3) нельзя обращаться к r13,r14

__asm void func()
{
/*__asm*/ LDMFD sp!, {lr} /* Restore LR */
} - правильно

блин, только сегодня узнал,

а если asm перед операторами, то надо пользовать

__current_pc() и __current_sp()
Andrew_Ch
Цитата(Spb_Alex @ Nov 15 2007, 11:22) *
не, это не дело, просто в новом RV (>3) нельзя обращаться к r13,r14

__asm void func()
{
/*__asm*/ LDMFD sp!, {lr} /* Restore LR */
} - правильно

блин, только сегодня узнал,

а если asm перед операторами, то надо пользовать

__current_pc() и __current_sp()


Еще из хелпа.

The following methods enable you to access the sp, lr, and pc registers correctly in your source code:

Method 1
Use the compiler intrinsics in inline assembly, for example:

void printReg()
{
unsigned int spReg, lrReg, pcReg;

__asm
{
MOV spReg, __current_sp()
MOV pcReg, __current_pc()
MOV lrReg, __return_address()
}
printf("SP = 0x%X\n",spReg);
printf("PC = 0x%X\n",pcReg);
printf("LR = 0x%X\n",lrReg);
}

Method 2
Use embedded assembly to access physical ARM registers from within a C or C++ source file, for example:

__asm void func()
{
MOV r0, lr
...
BX lr
}

This enables the return address of a function to be captured and displayed, for example, for debugging purposes, to show the call tree.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.