Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вектора прерываний в .ASM STM8 IAR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
AShurick
Суть проблемы: Есть обработчик прерывания написанный на ассемблере. Как прописать вектор прерывания на обработчик в ASM файле? В IAR трансляторе ассемблера для AVR можно было сделать так:
Код
        NAME IntTable
        extern switch_int
        COMMON INTVEC(1)
        ORG TIMER0_OVF_vect
        JMP switch_int
        ENDMOD


А вот под STM8 вектора прерывания вставляются перед векторами размещенными С компилятором по коду:
Код
        section   .intvec:CODE
;-------------------------------------------------------------------------------
        DS32    1;RESET
        DS32    1;TRAP
        DS32    1;NMI
        DC32    $82000000 + switch_int
       .........................


Или вектора прерываний затираются векторами определенными в С программе
Код
        section   .intvec:CODE:NOROOT(2)
;-------------------------------------------------------------------------------
        DS32    1;RESET
        DS32    1;TRAP
        DS32    1;NMI
        DC32    $82000000 + switch_int


Сразу поясняю что нужно мне именно на ассемблере, т.к. это процедура переключения контентов в своей кооперативной ОС.
ReAl
Если я правильно понял, у IAR/STM8 таблицы векторов изначально заполнена weak-метками вида _interrupt_1
Достаточно в исходнике объявить метку с таким именем и линкер вместо адреса weak-затычки из библиотеки поставит адрес этой метки.
AShurick
Цитата(ReAl @ May 27 2011, 23:18) *
Если я правильно понял, у IAR/STM8 таблицы векторов изначально заполнена weak-метками вида _interrupt_1
Достаточно в исходнике объявить метку с таким именем и линкер вместо адреса weak-затычки из библиотеки поставит адрес этой метки.

Пробовал в ASM вставлять метки типа _interrupt_3: или как на C AWU_vector: - результат полный игнор. Линкер вставляет в вектора прерываний заглушки, т.е. затирает таблицу векторами определенными в C файле.
ReAl
Странно... «Должно бы работать»™, судя по идеологии инструмента.
Ну до STM8 я доберусь через недели две (в понедельник уезжаю, а до этого дел много), когда опять буду ковырятья в порте scmRTOS для IAR/STM8 и как раз добавлять переключатель контекстов специально выделенным прерыванием. Тогда и посмотрю.
AShurick
Действительно, немного протупил. Вектора прерываний объявлены как WEAK метки вида _interrupt_N. Но, чтобы прием сработал на ассемблере, необходимо метку сначала объявить видимой оператором public, например: public _interrupt_3. И о чудо, при сборке проекта в векторах прерывания появляется вектор на наш обработчик нарисованный на ASM, с меткой входа _interrupt_3:. Так что проблема решена.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.