|
Как прочитать link register в переменную, IAR5.11 + SAM7X |
|
|
|
 |
Ответов
(1 - 14)
|
Jun 24 2008, 07:38
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
На "C" такие вещи как-то вообще делать не стоит. Вот мой asm-обработчик: Код INCLUDE arm.inc
; *************************************************************************** ; *
EXPORT prefetch_abort_handler
IMPORT prefetch_abort_handler_c
; *************************************************************************** ; *
AREA code0, CODE, READONLY
; *************************************************************************** ; *
prefetch_abort_handler sub r14, r14, #0x04 stmfd r13!, {r14} stmfd r13!, {r0-r3, r12}
ldr r0, =regs_temp str r14, [r0], #0x04 mov r14, r0 ldr r0, [r13] stmia r14!, {r0-r12} mov r0, r14
mrs r14, SPSR stmfd r13!, {r14} orr r14, r14, #F_BIT :OR: I_BIT msr CPSR_c, r14 stmia r0!, {r13-r14} mov r0, #F_BIT :OR: I_BIT :OR: ARM_MODE_ABORT msr CPSR_c, r0
ldr r0, =regs_temp bl prefetch_abort_handler_c
ldmfd r13!, {r0} msr SPSR_c, r0
ldmfd r13!, {r0-r3, r12, pc}^
; *************************************************************************** ; *
AREA code1, DATA, READWRITE
regs_temp SPACE 0x40
END Вызывает prefetch_abort_handler_c и передает ему указатель на структуру (LR_abt-4, R0-R14).
|
|
|
|
|
Jun 24 2008, 15:47
|

Местный
  
Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035

|
Цитата(zltigo @ Jun 24 2008, 19:14)  Зачем? Что бы в обработчике исключения(сишная функция) не записывался LR в стек. Ситуацию воспроизвёл, но LR оказалось указывает на мою функцию, сделал дизасм и увидел, что в эпилоге LR(настоящий) запихиватся в стек. Пока ничего умней, чем в начале функции восстанавливать сохранённые регистры из стека руками не придумал. Понятно, что это убьёт программу, но это нужно только для отладки, чтобы убить эксепшн.
|
|
|
|
|
Jul 8 2008, 04:37
|
Местный
  
Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034

|
Цитата(xelax @ Jun 24 2008, 21:10)  Ещё вопрос, как в IAR сделать функцию на C без пролога и эпилога? Не знаю как в IAR, а в GCC __attribute__((naked)). у MS __declspec( naked ) и т.д.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|