реклама на сайте
подробности

 
 
> Обработка исключительной ситуации, как правильно описать функцию вызова
arttech
сообщение Nov 10 2007, 14:51
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 62
Регистрация: 28-10-06
Из: г. Севастополь
Пользователь №: 21 744



Подскажите пожалуйста, как правильно определить функцию обработки исключительных ситуаций на С, для:

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

В литературе написано, что опиание даётся подобно описанию функций для прерываний:
- void Pabt_Handler (void) __abort
- void Dabt_Handler (void) __abort
в реальности такое описание на проходит, а суффикс __irq результата не даёт...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 8)
VladislavS
сообщение Nov 10 2007, 17:07
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



О какой среде разработки идет речь?
Go to the top of the page
 
+Quote Post
arttech
сообщение Nov 10 2007, 17:15
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 62
Регистрация: 28-10-06
Из: г. Севастополь
Пользователь №: 21 744



Цитата(VladislavS @ Nov 10 2007, 20:07) *
О какой среде разработки идет речь?

Да, забыл указать...
Keil, под LPC2368
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 14 2007, 01:07
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

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

А какой смысл их на C обрабатывать? Так Вы не узнаете ни адреса сбоя (на некоторых процессорах), ни содержимого регистров и стека.
Я предпочитаю делать ассемблерную обёртку для сохранения регистров, а из неё уже передаю управление C-обработчику для вывода отладочной информации.
Go to the top of the page
 
+Quote Post
abcdefg
сообщение Nov 14 2007, 13:19
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 201
Регистрация: 23-01-06
Из: Msk
Пользователь №: 13 490



Цитата(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);
}
Go to the top of the page
 
+Quote Post
Spb_Alex
сообщение Nov 15 2007, 07:10
Сообщение #6


Участник
*

Группа: Новичок
Сообщений: 22
Регистрация: 26-10-07
Пользователь №: 31 745



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

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

Keil, RealView не знает (не хочет) найти r7, lr - регистры, ругается, что неизвестные переменные, как их задефайнить?
Go to the top of the page
 
+Quote Post
Andrew_Ch
сообщение Nov 15 2007, 07:35
Сообщение #7





Группа: Новичок
Сообщений: 7
Регистрация: 25-01-07
Пользователь №: 24 756



Цитата(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;
}
Go to the top of the page
 
+Quote Post
Spb_Alex
сообщение Nov 15 2007, 08:22
Сообщение #8


Участник
*

Группа: Новичок
Сообщений: 22
Регистрация: 26-10-07
Пользователь №: 31 745



Цитата(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()
Go to the top of the page
 
+Quote Post
Andrew_Ch
сообщение Nov 15 2007, 09:06
Сообщение #9





Группа: Новичок
Сообщений: 7
Регистрация: 25-01-07
Пользователь №: 24 756



Цитата(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.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 16:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01421 секунд с 7
ELECTRONIX ©2004-2016