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

 
 
> Как прочитать link register в переменную, IAR5.11 + SAM7X
xelax
сообщение Jun 24 2008, 06:43
Сообщение #1


Местный
***

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



Портирую код из arm-elf-gcc в iar, стал возникать perfetch abort. Хочу почитать LR в локальную переменную в обработчике этой исключительной ситуации, но в синтаксисе IARа пока не силён.

Кто-нибудь знает как это сделать?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 14)
aaarrr
сообщение Jun 24 2008, 07:05
Сообщение #2


Гуру
******

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



У атмеловких ARM'ов есть Abort Status Register и Abort Address Status Register, посмотрите описание Memory Controller'а.

А для извлечения LR и остальных регистров лучше писать свой обработчик.
Go to the top of the page
 
+Quote Post
xelax
сообщение Jun 24 2008, 07:27
Сообщение #3


Местный
***

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



Цитата(aaarrr @ Jun 24 2008, 11:05) *
У атмеловких ARM'ов есть Abort Status Register и Abort Address Status Register, посмотрите описание Memory Controller'а.

А для извлечения LR и остальных регистров лучше писать свой обработчик.


Есть то он есть, но там адрес записан, по которому неправильный доступ был, а в каком месте кода он произошёл озябнешь искать, особенно если код пишется несколькими людьми и не один месяц.

Самый простой вариант посмотреть адрес возврата из прерывания, а следовательно предыдущая инструкция вызвала исключение. Для этого необходимо прочитать LR регистр и посчитать смещение. А как это сделать на IAR C я не умею. 05.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 24 2008, 07:38
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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).
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 24 2008, 08:33
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(xelax @ Jun 24 2008, 09:27) *
Самый простой вариант посмотреть адрес возврата из прерывания...

И получите адрес в какой-нибудь функции, например, memcpy вызываемой из сотни мест sad.gif. Короче еще стек сохранять (мне обычно 8 хватает) придется...


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
xelax
сообщение Jun 24 2008, 09:22
Сообщение #6


Местный
***

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



Возможно туплю, но не понятно откуда вы стек читаете. В arm в abort моде свой собственный стек и в текущем режиме ядра(abort mode) указатель стека, например на system(irq, fiq, supervisor в зависимости от того где исключение произошло) не доступен. Зато доступен указатель на стек abort режима. smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 24 2008, 09:28
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(xelax @ Jun 24 2008, 11:22) *
Возможно туплю, но не понятно откуда вы стек читаете.

Естественно, по указателю того режима из котрого вылетели в Abort.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
xelax
сообщение Jun 24 2008, 09:34
Сообщение #8


Местный
***

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



Цитата(zltigo @ Jun 24 2008, 13:28) *
Естественно, по указателю того режима из котрого вылетели в Abort.


А как вы режим узнаёте из которого вылетели в Abort, теоретически это может быть какой угодно.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 24 2008, 09:41
Сообщение #9


Гуру
******

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



Цитата(xelax @ Jun 24 2008, 13:34) *
А как вы режим узнаёте из которого вылетели в Abort, теоретически это может быть какой угодно.

На то есть SPSR.
Go to the top of the page
 
+Quote Post
xelax
сообщение Jun 24 2008, 15:10
Сообщение #10


Местный
***

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



Ок. Спасибо.

Ещё вопрос, как в IAR сделать функцию на C без пролога и эпилога?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 24 2008, 15:14
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(xelax @ Jun 24 2008, 17:10) *
как..

Зачем?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
xelax
сообщение Jun 24 2008, 15:47
Сообщение #12


Местный
***

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



Цитата(zltigo @ Jun 24 2008, 19:14) *
Зачем?


Что бы в обработчике исключения(сишная функция) не записывался LR в стек.

Ситуацию воспроизвёл, но LR оказалось указывает на мою функцию, сделал дизасм и увидел, что в эпилоге LR(настоящий) запихиватся в стек.

Пока ничего умней, чем в начале функции восстанавливать сохранённые регистры из стека руками не придумал.
Понятно, что это убьёт программу, но это нужно только для отладки, чтобы убить эксепшн.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 24 2008, 15:58
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(xelax @ Jun 24 2008, 17:47) *
Пока ничего умней...

Умнее - Вам пример дали. А о глупостях, типа __noreturn и иже с ней и говорить не хочется.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
xelax
сообщение Jun 25 2008, 05:36
Сообщение #14


Местный
***

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



Цитата(zltigo @ Jun 24 2008, 19:58) *
А о глупостях, типа __noreturn и иже с ней и говорить не хочется.


Но всё таки сказали wink.gif

Спасибо за подсказки.
Go to the top of the page
 
+Quote Post
Alex03
сообщение Jul 8 2008, 04:37
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Цитата(xelax @ Jun 24 2008, 21:10) *
Ещё вопрос, как в IAR сделать функцию на C без пролога и эпилога?

Не знаю как в IAR, а
в GCC __attribute__((naked)).
у MS __declspec( naked )
и т.д.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 14:53
Рейтинг@Mail.ru


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