Atmel Studio переопределить вектор прерывания - PullRequest
0 голосов
/ 04 мая 2018

мне нужно переопределить вектор прерывания, сгенерированный автоматически из Атмел Студио. кто-нибудь может мне помочь с этим?

Обновление с использованием кода прерывания, сгенерированного Atmel Studio.

00000000 <__vectors>:
   0:   0c 94 34 00     jmp 0x68    ; 0x68 <__ctors_end>
   4:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
   8:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
   c:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
  10:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
  14:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
  18:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
  1c:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
  20:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
  24:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
  28:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
  2c:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
  30:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
  34:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
  38:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
  3c:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
  40:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
  44:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
  48:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
  4c:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
  50:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
  54:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
  58:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
  5c:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
  60:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
  64:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>

00000068 <__ctors_end>:
  68:   11 24           eor r1, r1
  6a:   1f be           out 0x3f, r1    ; 63
  6c:   cf ef           ldi r28, 0xFF   ; 255
  6e:   d8 e0           ldi r29, 0x08   ; 8
  70:   de bf           out 0x3e, r29   ; 62
  72:   cd bf           out 0x3d, r28   ; 61
  74:   0e 94 44 00     call    0x88    ; 0x88 <main>
  78:   0c 94 47 00     jmp 0x8e    ; 0x8e <_exit>

0000007c <__bad_interrupt>:
  7c:   0c 94 00 00     jmp 0   ; 0x0 <__vectors>

Обновление прерывания регистра

void (*fnVectors[NUM_INTERRUPTS])(void);

void IntRegister(unsigned int intrNum, void (*fnHandler)(void))
{
    /* Assign ISR */
    fnVectors[intrNum] = fnHandler;
}

1 Ответ

0 голосов
/ 04 мая 2018

Они связаны с использованием слабых символов в avr-libc; Вам нужно объявить свои собственные ISR с помощью макроса ISR. Смотрите, например, документацию по прерыванию avr-libc .

Фактический исходный код для gcrt1.S использует макрос, который расширяется до перехода к символам, подобным __vector_4, и слабо определяет это имя, равное __bad_interrupt. Если вы определяете такие подпрограммы (что поможет вам макрос ISR), слабое определение игнорируется. Этот же файл gcrt1.S собирается для каждого отдельного MCU, создавая файлы, такие как crtatmega168.o. Если вы осмотрите один из них с avr-objdump -xd, вы найдете слабые ссылки:

SYMBOL TABLE:
...
00000000  w      .init0 00000000 __init
00000000  w      .text  00000000 __vector_1
00000000 g       .text  00000000 __bad_interrupt
...
00000000 <__vectors>:
   0:   0c 94 00 00     jmp     0       ; 0x0 <__vectors>
                        0: R_AVR_CALL   __init
   4:   0c 94 00 00     jmp     0       ; 0x0 <__vectors>
                        4: R_AVR_CALL   __vector_1
...