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

 
 
> IAR 5.41 и таблица векторов прерываний
gladov
сообщение Oct 1 2010, 18:06
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687



В связи с переходом на 5-й ИАР осваиваю его линкер. Платформа - АРМ. Вообще, для определения пользовательского обработчика прерывания дока рекомендует переопределить соотв. "слабую" функцию, например, IRQ_Handler() в случае обработчика IRQ. Т.е. в случае использования стандартого стартапа я могу переопределить вышеупомянутую IRQ_Handler() и "вперед на мины". Но я хочу вообще обойти использование этой функции и по аресу 0x18 поместить инструкцию "LDR PC,VICVectAddr"

Насколько я понял, я больше не могу где-то в асм-файле сказать "SEGMENT .... ORG 0x18 ..." Тут либо секция определена в стартапе, либо я ее должен переопределить полностью, а "влезть грязыми руками" в готовую секцию мне уже нельзя. Но мне пока не удалось и всю секцию перепределить. Такой код омпилится и линкуется без проблем, но по адресу 0x18 по-прежнему остается вызов IRQ_Handler():
Код
        SECTION .intvec:CODE:NOROOT(2)

        EXTERN  __iar_program_start
        EXTERN  Undefined_Handler
        EXTERN  SWI_Handler
        EXTERN  Prefetch_Handler
        EXTERN  Abort_Handler
        EXTERN  FIQ_Handler
        
        ARM

    ; All default exception handlers (except reset) are
    ; defined as weak symbol definitions.
    ; If a handler is defined by the application it will take precedence.
        LDR     PC,Reset_Addr    ; Reset
        LDR     PC,Undefined_Addr; Undefined instructions
        LDR     PC,SWI_Addr; Software interrupt (SWI/SVC)
        LDR     PC,Prefetch_Addr    ; Prefetch abort
        LDR     PC,Abort_Addr    ; Data abort
        DCD     0                ; RESERVED
        LDR     PC, VICVectAddr
        LDR     PC,FIQ_Addr; FIQ

        DATA

Reset_Addr:     DCD   __iar_program_start
Undefined_Addr: DCD   Undefined_Handler
SWI_Addr:       DCD   SWI_Handler
Prefetch_Addr:  DCD   Prefetch_Handler
Abort_Addr:     DCD   Abort_Handler
FIQ_Addr:       DCD   FIQ_Handler


Пока есть только одна идея: приведенный выше код сунуть в другую секцию и ее расположить по нулевому адресу, а про .intvec вообще забыть, но может есть более красивое решение чтобы правильно заместить обработчик прерывания или исключения не изменяя стартап?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MALLOY2
сообщение Oct 4 2010, 10:59
Сообщение #2


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Вам сказали же что в 5 версии нету больше команд которые располагают данные по определенному адресу.

В линкере нужно объявить секцию и расположить ее в нужном вам месте ( это делается в линкере), а код положить в эту секцию(это делается в исполняемом файле).

Обезательное для изучения

Ваш случай
Go to the top of the page
 
+Quote Post
Student Pupkin
сообщение Oct 4 2010, 18:56
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 328
Регистрация: 23-05-08
Пользователь №: 37 760



Цитата(MALLOY2 @ Oct 4 2010, 14:59) *
В линкере нужно объявить секцию и расположить ее в нужном вам месте ( это делается в линкере), а код положить в эту секцию(это делается в исполняемом файле).

А разве можно заставить линкер директивой place at расположить по нулевому адресу секцию .intvec (размером где-то 64 байта), а по адресу 0x018 расположить другую секцию (сосбно содержащую только одну ARM-команду - это и требуется топикстартеру)??? Линкер должен ошибку выдать.

Сообщение отредактировал Student Pupkin - Oct 4 2010, 18:56
Go to the top of the page
 
+Quote Post
gladov
сообщение Oct 5 2010, 06:58
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687



Цитата(Student Pupkin @ Oct 4 2010, 22:56) *
А разве можно заставить линкер директивой place at расположить по нулевому адресу секцию .intvec (размером где-то 64 байта), а по адресу 0x018 расположить другую секцию (сосбно содержащую только одну ARM-команду - это и требуется топикстартеру)??? Линкер должен ошибку выдать.


Да в том-то и дело, что нельзя. А вопрос как раз и состоял в том, не ввели ли в пятый линкер новых "фишек" позволяющих "наложить" секции. Не ввели.... Поэтому придется полностью менять секцию с векторами. Это вовсе не проблема, просто хотел узнать нет ли более красивого решения.
Go to the top of the page
 
+Quote Post



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

 


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


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