Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR 5.41 и таблица векторов прерываний
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
gladov
В связи с переходом на 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 вообще забыть, но может есть более красивое решение чтобы правильно заместить обработчик прерывания или исключения не изменяя стартап?
Student Pupkin
Цитата(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 из каталога иара...
gladov
Вы сейчас про какой конкретно ИАР??? Точно про пятый?

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

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

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


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


Ессно не подключил. И сделал это умышленно. Дело в том, что последние ИАРы "умные" и сами подстегивают нужный прекомпиленый стартап из библиотеки если я явно его не подключил руками. Так вот идея как раз в том, чтобы в стандартном стартапе, подключаемом автоматом из родной библиотеки, заменить секцию описания векторов прерываний.
Student Pupkin
Цитата(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 Мало ли, мож обидел где нечаянно...
gladov
Цитата(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.
MALLOY2
Вам сказали же что в 5 версии нету больше команд которые располагают данные по определенному адресу.

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

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

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

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


Да в том-то и дело, что нельзя. А вопрос как раз и состоял в том, не ввели ли в пятый линкер новых "фишек" позволяющих "наложить" секции. Не ввели.... Поэтому придется полностью менять секцию с векторами. Это вовсе не проблема, просто хотел узнать нет ли более красивого решения.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.