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

 
 
> 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
Ответов
Student Pupkin
сообщение Oct 2 2010, 19:08
Сообщение #2


Местный
***

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



Цитата(gladov @ Oct 1 2010, 22:06) *
Но я хочу вообще обойти использование этой функции и по аресу 0x18 поместить инструкцию "LDR PC,VICVectAddr"

Где-то вот так:
Код
LDR PC, [PC, #–0xFF0]

Вы покопайте доки получше, трюк вполне известный, где-то в апноутах или мануале есть...

Цитата(gladov @ Oct 1 2010, 22:06) *
Насколько я понял, я больше не могу где-то в асм-файле сказать "SEGMENT .... ORG 0x18 ..." Тут либо секция определена в стартапе, либо я ее должен переопределить полностью, а "влезть грязыми руками" в готовую секцию мне уже нельзя. Но мне пока не удалось и всю секцию перепределить. Такой код омпилится и линкуется без проблем, но по адресу 0x18 по-прежнему остается вызов IRQ_Handler()

Это как это? Пардон за такие вопросы, но мож Вы это... того... к проекту асмовский файл со своим переделанным стартапом не пристегнули? Add file... Только тогда может получится подобный результат - в линковке будет участвовать штатный cstarup.s из каталога иара...
Go to the top of the page
 
+Quote Post
gladov
сообщение Oct 3 2010, 12:27
Сообщение #3


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

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



Вы сейчас про какой конкретно ИАР??? Точно про пятый?

Цитата(Student Pupkin @ Oct 2 2010, 23:08) *
Где-то вот так:
Код
LDR PC, [PC, #–0xFF0]

Вы покопайте доки получше, трюк вполне известный, где-то в апноутах или мануале есть...

Как записать инструкцию я знаю. Вопрос в том как ее в ПЯТОМ иаре заставить лечь в нужный адрес. В новом линкере нельзя (или я не знаю как) переопределить часть уже определенной в стартапе секции.


Цитата
Это как это? Пардон за такие вопросы, но мож Вы это... того... к проекту асмовский файл со своим переделанным стартапом не пристегнули? Add file... Только тогда может получится подобный результат - в линковке будет участвовать штатный cstarup.s из каталога иара...


Ессно не подключил. И сделал это умышленно. Дело в том, что последние ИАРы "умные" и сами подстегивают нужный прекомпиленый стартап из библиотеки если я явно его не подключил руками. Так вот идея как раз в том, чтобы в стандартном стартапе, подключаемом автоматом из родной библиотеки, заменить секцию описания векторов прерываний.
Go to the top of the page
 
+Quote Post
Student Pupkin
сообщение Oct 3 2010, 13:42
Сообщение #4


Местный
***

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



Цитата(gladov @ Oct 3 2010, 16:27) *
Вы сейчас про какой конкретно ИАР??? Точно про пятый?

Есессно. smile.gif У меня 5.41
Цитата(gladov @ Oct 3 2010, 16:27) *
Как записать инструкцию я знаю.

А я и не учу Вас. Просто на всякий случай -у Вас псевдоинструкция LDR.
А вот LDR PC, [PC, #–0xFF0] - это тру ARM-команда загрузки unsigned word (32 bit) в режиме immediate offset... Чтоб казусов не было.
Цитата(gladov @ Oct 3 2010, 16:27) *
Вопрос в том как ее в ПЯТОМ иаре заставить лечь в нужный адрес. В новом линкере нельзя (или я не знаю как) переопределить часть уже определенной в стартапе секции.

ниче не понял smile.gif Вроде только линкером можно заставить лечь, никаких ассемблерных директив теперь нет.
Цитата(gladov @ Oct 3 2010, 16:27) *
Ессно не подключил. И сделал это умышленно. Дело в том, что...

sad.gif Ну че же Вы? Копируйте себе исходник стартапа (у меня - ...\arm\src\lib\arm\cstartup.s) в папку с проектом. Поправьте его, где надо. Если камень NXP, то возмите стартап из examples, либо допилите в плане PUBLIC __vector_0x14. Добавьте файл к проекту. Make... Ничего зазорного в использовании своего стартапа нет. Можете также скачать себе исходники FreeRTOS или TNkernel. Там все примеры со своими старапами. Посмотрите и позаимствуйте, где надо - поправьте.
Если че - извините. smile.gif Мало ли, мож обидел где нечаянно...
Go to the top of the page
 
+Quote Post
gladov
сообщение Oct 3 2010, 22:46
Сообщение #5


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

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



Цитата(Student Pupkin @ Oct 3 2010, 17:42) *
Если че - извините. smile.gif Мало ли, мож обидел где нечаянно...

Да не, все нормально.

Цитата(Student Pupkin @ Oct 3 2010, 17:42) *
sad.gif Ну че же Вы? Копируйте себе исходник стартапа (у меня - ...\arm\src\lib\arm\cstartup.s) в папку с проектом. Поправьте его, где надо. Если камень NXP, то возмите стартап из examples, либо допилите в плане PUBLIC __vector_0x14. Добавьте файл к проекту. Make... Ничего зазорного в использовании своего стартапа нет. Можете также скачать себе исходники FreeRTOS или TNkernel. Там все примеры со своими старапами. Посмотрите и позаимствуйте, где надо - поправьте.

Дело не в том, что не умею/не хочу использовать готовый стартап. Задача более конкретно: хочу сделать порт scmRTOS для АРМа под 5-м ИАРом. Имеется его порт под 4-й ИАР, который хочу портировать с МИНИМАЛЬНЫМИ изменениями. Остаться на стандартном стартапе вопрос принципиальный: я-то могу перекроить стартап под себя как хочу, но не хотелось бы заставлять это делать каждого пользователя ОС, даже если речь идет всего лишь об изменении таблицы векторов прерываний. Хочется максимально облегчить жизнь людям. Сделать чтобы порт работал "из коробки". Поэтому и пытаюсь заставить линкер переопределить вектор преывания, который предварительно уже объявлен в библиотечном стартапе.

Цитата(Student Pupkin @ Oct 3 2010, 17:42) *
ниче не понял smile.gif Вроде только линкером можно заставить лечь, никаких ассемблерных директив теперь нет.


А вот тут я не понял. Вопрос как раз и состоит в том, как заставить линкер переопределить одну команду внутри секции, или всю секцию целиком? Проблема такова: код, приведенный мной в первом посте выкидывается линкером как неиспользуемый. Если же ввести там какую-то метку и дать линкеру опцию --keep <моя метка> то код остается, но тогда в секцию .intvec ложатся обе таблицы сразу (и библиотечная и моя). И в каком порядке они лягут имхо неизвестно. Пока вижу один вариант: сделать секцию .intvec_my и ее поместить конфигом линкера в начало памяти, а про .intvec забыть вообще. А в идеале хотел бы сделать как в четвертом иаре:
Код
        COMMON  INTVEC:CODE:ROOT
        org     0x00000018
        LDR PC, [PC, #–0xFF0]

Но если сделать так:
Код
        SECTION  .intvec:CODE:ROOT
        LTORG     0x00000018
        LDR PC, [PC, #–0xFF0]

то компилция проходит без проблем, но указаная интрукция по адресу 0х18 не ложится - она попадает в нулевой адрес, а таблица векторов из библиотечного стартапа сдвигается на 4 байта и начинается с адреса 0х04 sad.gif Т.е. не происходит замещения одной инструкции в библиотечной секции .intvec.
Go to the top of the page
 
+Quote Post



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

 


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


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