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

 
 
 
Reply to this topicStart new topic
> 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
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
MALLOY2
сообщение Oct 4 2010, 10:59
Сообщение #6


Знающий
****

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



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

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

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

Ваш случай
Go to the top of the page
 
+Quote Post
gladov
сообщение Oct 4 2010, 12:03
Сообщение #7


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

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



Вот теперь все понятно. Спасибо за ссылки!
Go to the top of the page
 
+Quote Post
Student Pupkin
сообщение Oct 4 2010, 18:56
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 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
Сообщение #9


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

Группа: Свой
Сообщений: 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 Текстовая версия Сейчас: 27th July 2025 - 20:29
Рейтинг@Mail.ru


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