|
Обработка исключительной ситуации, как правильно описать функцию вызова |
|
|
|
Nov 10 2007, 14:51
|
Участник

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

|
Подскажите пожалуйста, как правильно определить функцию обработки исключительных ситуаций на С, для:
- Сбоя выборки PAbt_Handler?A - Сбоя данных DAbt_Handler?A
В литературе написано, что опиание даётся подобно описанию функций для прерываний: - void Pabt_Handler (void) __abort - void Dabt_Handler (void) __abort в реальности такое описание на проходит, а суффикс __irq результата не даёт...
|
|
|
|
|
 |
Ответов
(1 - 8)
|
Nov 10 2007, 17:15
|
Участник

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

|
Цитата(VladislavS @ Nov 10 2007, 20:07)  О какой среде разработки идет речь? Да, забыл указать... Keil, под LPC2368
|
|
|
|
|
Nov 14 2007, 13:19
|
Местный
  
Группа: Свой
Сообщений: 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); }
|
|
|
|
|
Nov 15 2007, 07:35
|
Группа: Новичок
Сообщений: 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; }
|
|
|
|
|
Nov 15 2007, 08:22
|

Участник

Группа: Новичок
Сообщений: 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()
|
|
|
|
|
Nov 15 2007, 09:06
|
Группа: Новичок
Сообщений: 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.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|