|
|
  |
IAR 5.41 и таблица векторов прерываний |
|
|
|
Oct 1 2010, 18:06
|
Частый гость
 
Группа: Свой
Сообщений: 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 вообще забыть, но может есть более красивое решение чтобы правильно заместить обработчик прерывания или исключения не изменяя стартап?
|
|
|
|
|
Oct 2 2010, 19:08
|
Местный
  
Группа: Участник
Сообщений: 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 из каталога иара...
|
|
|
|
|
Oct 3 2010, 12:27
|
Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687

|
Вы сейчас про какой конкретно ИАР??? Точно про пятый? Цитата(Student Pupkin @ Oct 2 2010, 23:08)  Где-то вот так: Код LDR PC, [PC, #–0xFF0] Вы покопайте доки получше, трюк вполне известный, где-то в апноутах или мануале есть... Как записать инструкцию я знаю. Вопрос в том как ее в ПЯТОМ иаре заставить лечь в нужный адрес. В новом линкере нельзя (или я не знаю как) переопределить часть уже определенной в стартапе секции. Цитата Это как это? Пардон за такие вопросы, но мож Вы это... того... к проекту асмовский файл со своим переделанным стартапом не пристегнули? Add file... Только тогда может получится подобный результат - в линковке будет участвовать штатный cstarup.s из каталога иара... Ессно не подключил. И сделал это умышленно. Дело в том, что последние ИАРы "умные" и сами подстегивают нужный прекомпиленый стартап из библиотеки если я явно его не подключил руками. Так вот идея как раз в том, чтобы в стандартном стартапе, подключаемом автоматом из родной библиотеки, заменить секцию описания векторов прерываний.
|
|
|
|
|
Oct 3 2010, 13:42
|
Местный
  
Группа: Участник
Сообщений: 328
Регистрация: 23-05-08
Пользователь №: 37 760

|
Цитата(gladov @ Oct 3 2010, 16:27)  Вы сейчас про какой конкретно ИАР??? Точно про пятый? Есессно.  У меня 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)  Вопрос в том как ее в ПЯТОМ иаре заставить лечь в нужный адрес. В новом линкере нельзя (или я не знаю как) переопределить часть уже определенной в стартапе секции. ниче не понял  Вроде только линкером можно заставить лечь, никаких ассемблерных директив теперь нет. Цитата(gladov @ Oct 3 2010, 16:27)  Ессно не подключил. И сделал это умышленно. Дело в том, что...  Ну че же Вы? Копируйте себе исходник стартапа (у меня - ...\arm\src\lib\arm\cstartup.s) в папку с проектом. Поправьте его, где надо. Если камень NXP, то возмите стартап из examples, либо допилите в плане PUBLIC __vector_0x14. Добавьте файл к проекту. Make... Ничего зазорного в использовании своего стартапа нет. Можете также скачать себе исходники FreeRTOS или TNkernel. Там все примеры со своими старапами. Посмотрите и позаимствуйте, где надо - поправьте. Если че - извините.  Мало ли, мож обидел где нечаянно...
|
|
|
|
|
Oct 3 2010, 22:46
|
Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687

|
Цитата(Student Pupkin @ Oct 3 2010, 17:42)  Если че - извините.  Мало ли, мож обидел где нечаянно... Да не, все нормально. Цитата(Student Pupkin @ Oct 3 2010, 17:42)   Ну че же Вы? Копируйте себе исходник стартапа (у меня - ...\arm\src\lib\arm\cstartup.s) в папку с проектом. Поправьте его, где надо. Если камень NXP, то возмите стартап из examples, либо допилите в плане PUBLIC __vector_0x14. Добавьте файл к проекту. Make... Ничего зазорного в использовании своего стартапа нет. Можете также скачать себе исходники FreeRTOS или TNkernel. Там все примеры со своими старапами. Посмотрите и позаимствуйте, где надо - поправьте. Дело не в том, что не умею/не хочу использовать готовый стартап. Задача более конкретно: хочу сделать порт scmRTOS для АРМа под 5-м ИАРом. Имеется его порт под 4-й ИАР, который хочу портировать с МИНИМАЛЬНЫМИ изменениями. Остаться на стандартном стартапе вопрос принципиальный: я-то могу перекроить стартап под себя как хочу, но не хотелось бы заставлять это делать каждого пользователя ОС, даже если речь идет всего лишь об изменении таблицы векторов прерываний. Хочется максимально облегчить жизнь людям. Сделать чтобы порт работал "из коробки". Поэтому и пытаюсь заставить линкер переопределить вектор преывания, который предварительно уже объявлен в библиотечном стартапе. Цитата(Student Pupkin @ Oct 3 2010, 17:42)  ниче не понял  Вроде только линкером можно заставить лечь, никаких ассемблерных директив теперь нет. А вот тут я не понял. Вопрос как раз и состоит в том, как заставить линкер переопределить одну команду внутри секции, или всю секцию целиком? Проблема такова: код, приведенный мной в первом посте выкидывается линкером как неиспользуемый. Если же ввести там какую-то метку и дать линкеру опцию --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  Т.е. не происходит замещения одной инструкции в библиотечной секции .intvec.
|
|
|
|
|
Oct 4 2010, 18:56
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Oct 5 2010, 06:58
|
Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687

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