Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: обработчик прерывания в ассемблерном файле
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
forever failure
Возможно, вопрос простейший, но однако ответ мне не попался ни в документации по компилятору, ни в поиске.
Как правильно объявить функцию-обработчик прерывания, определённую в ассемблерном исходнике?
rezident
Все же вопрос про Си или про ASM? Где объявлять-то нужно?
forever failure
Вопрос по асму. Есть асмовский исходник, в котором опрделена функция - обработчик, скажем

;interrupt.S:

intr0_handler:
push r16
; ...
pop r16
reti

Как объявить эту фукцию (intr0_handler), чтобы она стала обработчиком прерывания INT0 ?
rezident
Цитата(forever failure @ Mar 29 2007, 13:43) *
Как объявить эту фукцию (intr0_handler), чтобы она стала обработчиком прерывания INT0 ?

C IAR для AVR я не работал, а в IAR для MSP430 подобное объявление выглядит так
Код
ORG 0FFECh
DW TA0_ISR_HANDLER
forever failure
Что это значит:

ORG 0FFECh
DW TA0_ISR_HANDLER

и где это всё надо размещать ? Почему 0FFECh ?
_Bill
Цитата(forever failure @ Mar 29 2007, 10:43) *
Вопрос по асму. Есть асмовский исходник, в котором опрделена функция - обработчик, скажем

;interrupt.S:

intr0_handler:
push r16
; ...
pop r16
reti

Как объявить эту фукцию (intr0_handler), чтобы она стала обработчиком прерывания INT0 ?

Например, так:
Код
        COMMON  INTVEC

        ORG     TIMER1_OVF_vect        ;;; Timer1 Overflow interrupt handler
        rjmp    Timer1Ov_Int           ;;;

;;;        ORG     TIMER0_OVF_vect        ;;; Timer0 Overflow interrupt handler
;;;        reti                           ;;;

;;        ORG     UART_RX_vect           ;;; UART receiver interrupt handler
;;       rjmp    UART_RX_Int            ;;;

        RSEG    CODE           ;;; Handlers code start

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Timer1Ov_Int:           ;;; Timer1 Overflow interrupt handler
        st      -Y, r30        ; Save used register on stack
        st      -Y,R19         ;
        in      R19,SREG       ; Save status register
        st      -Y,R19         ;

        ldi     r30, Flags             ;
        ld      r19, Z                 ; Set OFF LINE mode flag
        ori     r19, OFF_LINE_MODE     ;
        st      Z, r19                 ;

        ld      R19,Y+         ; Restore status register
        out     SREG,R19       ;
        ld      R19,Y+         ;
        ld      r30, Y+        ;
        reti
Сергей Борщ
Цитата(forever failure @ Mar 29 2007, 09:43) *
Как объявить эту фукцию (intr0_handler), чтобы она стала обработчиком прерывания INT0 ?

Код
    COMMON    INTVEC:CODE:ROOT(1); Align at an even address
    ORG        INT0_vect
    RJMP    intr0_handler
forever failure
Ага, вроде получается то, что надо.
Thanxx!

Всё равно надо будет более детально курнуть матчасть.
_Артём_
В продолжение темы...
А как передать в asm-файл имена переменных объяеленных в других C-файлах?
Ведь не напишешь
#include "somefile.h"
Сергей Борщ
Цитата(_Артём_ @ Mar 29 2007, 16:38) *
А как передать в asm-файл имена переменных объяеленных в других C-файлах?
Код
если somefile.h:
extern char variable1
extern int variable2
extern struct mytype variable3
extern float variable4
то somefile.inc:
   EXTERN variable1, variable2
   EXTERN variable3
   EXTERN variable4
otherfile.asm:
#include "somefile.inc"
_Bill
Цитата(Сергей Борщ @ Mar 29 2007, 22:21) *
Код
если somefile.h:
extern char variable1
extern int variable2
extern struct mytype variable3
extern float variable4
то somefile.inc:
   EXTERN variable1, variable2
   EXTERN variable3
   EXTERN variable4
otherfile.asm:
#include "somefile.inc"

Предвижу следующий вопрос: "Как передать в Си файлы имена переменных, объявленных в асм файлах?".
Сергей Борщ
Цитата(_Bill @ Mar 30 2007, 09:24) *
Предвижу следующий вопрос: "Как передать в Си файлы имена переменных, объявленных в асм файлах?".
Отвечать? biggrin.gif
Код
если otherfile.asm
   PUBLIC variable1, variable2
   PUBLIC variable3
   PUBLIC variable4

то somefile.h:
extern char variable1;
extern int variable2;
extern struct mytype variable3;
extern float variable4;
Да, если С++, то extern "C" char variable1; и т.д.
_Артём_
Правильно предвидите.
Спасибо за ответы...
forever failure
Ув. модераторы, раз уж тему перенесли из первоначального контекста, отметьте где-нить сверху, что речь идёт про IARовский компилятор для AVR.
zltigo
Цитата(forever failure @ Mar 31 2007, 13:29) *
речь идёт про IARовский компилятор для AVR.

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