von GCC definierte Interrupt Tabelle überschreiben

Gast #1257532
Lesenswert?
• ▲
▼
Hallo,

angenommen ich habe folgendes Programm
1
#include <avr/io.h>
2

3
int main()
4
{
5
    while(1);
6
}

dann generiert mir der gcc eine Interrupt Vektor Tabelle der Form
1
00000000 <__vectors>:
2
   0:   0c 94 2a 00     jmp     0x54    ; 0x54 <__ctors_end>
3
   4:   0c 94 47 00     jmp     0x8e    ; 0x8e <__bad_interrupt>
4
   .
5
   .
6
   .
7
  50:   0c 94 47 00     jmp     0x8e    ; 0x8e <__bad_interrupt>

so, diese Adressen möchte ich nun ändern ohne dabei die Interrupt 
Funktionalität die mir die avr-libc zur Verfügung stellt zu benutzen.

dazu nehme ich folgenden Assembler code
1
.section .vectors
2

3
.org 0x0000
4
    jmp INIT
5
    jmp INIT
6
    jmp INIT
7
    jmp INIT
8
    jmp INIT
9
    jmp INIT
10
    jmp INIT
11
    jmp INIT
12
    jmp INIT
13
    jmp INIT
14

15
INIT:
16
    nop
17
    reti

die Funktionalität ist dabei hier erstmal ohne Bedeutung, es geht mir um 
das Prinzip

so, wenn ich jetz den C und ASM Code übersetze und zusammen linke kommt 
dabei folgendes raus:
1
00000000 <__vectors>:
2
   0:   22 c0           rjmp    .+68            ; 0x46 <__ctors_end>
3
   2:   3d c0           rjmp    .+122           ; 0x7e <__bad_interrupt>
4
   .
5
   .
6
   .
7
  18:   32 c0           rjmp    .+100           ; 0x7e <__bad_interrupt>
8
  1a:   0c 94 21 00     jmp     0x42    ; 0x42 <INIT>                   
9
  1e:   0c 94 21 00     jmp     0x42    ; 0x42 <INIT>                   
10
  22:   0c 94 21 00     jmp     0x42    ; 0x42 <INIT>                   
11
  26:   0c 94 21 00     jmp     0x42    ; 0x42 <INIT>                   
12
  2a:   0c 94 21 00     jmp     0x42    ; 0x42 <INIT>                   
13
  2e:   0c 94 21 00     jmp     0x42    ; 0x42 <INIT>                   
14
  32:   0c 94 21 00     jmp     0x42    ; 0x42 <INIT>                   
15
  36:   0c 94 21 00     jmp     0x42    ; 0x42 <INIT>                   
16
  3a:   0c 94 21 00     jmp     0x42    ; 0x42 <INIT>                   
17
  3e:   0c 94 21 00     jmp     0x42    ; 0x42 <INIT>

ich möchste jedoch das die Vektortabelle ersetzt wird

Wie genau stelle ich das am besten an?

Grüße
Thomas
#1257679
Lesenswert?
• ▲
▼
Thomas Prescher schrieb:
> nein ich möchte alle Adressen selbst definieren (und es sollen
> unterschiedliche sein), ich möchste lediglich NICHT die avr-libc
> Definition benutzen.

Vielleicht solltest du erstmal erklären, wozu das überhaupt gut sein 
soll. Kaum jemand hier wird sich nämlich den Kopf über etwas zerbrechen, 
was auf den ersten Blick keinen sinnvollen Zweck erfüllt.
Gast #1258257
Lesenswert?
• ▲
▼
Ja ok da hast du warscheinlich recht!
Also Grund ist folgender: Wir arbeiten hier zu Testzwecken an einem 
kleinem Multitasking Betriebsystem wozu eben auch ein Interrupthandler 
gehört. Prinzipiell soll es so sein, das wenn ein Interrupt auftritt 
folgendes passiert:

Pseudocode:

push interruptnummer
call handler

Ich hoffe mein Problem ist jetzt etwas klarer

Grüße
Thomas
Gast #1258276
Lesenswert?
• ▲
▼
hab vor kurzem ähnliches gemacht und so gelöst:

ich habe meine eigenen handler in eine section vectors2 gepackt, im 
linkerscript die section vectors auf discard gesetzt und meine vectors2 
an die position der alten vectors platziert.
Gast #1258320
Lesenswert?
• ▲
▼
>Prinzipiell soll es so sein, das wenn ein Interrupt auftritt
>folgendes passiert:

>Pseudocode:

>push interruptnummer
>call handler

Und warum muß das ohne die "avr-libc Definition" passieren? Schreib 
deine ISR's halt in Assembler, und lass die toolchain weiterhin die 
Vektoren verwalten.

Im avr-libc-User manual gibt es den Abschnitt "avr-libc and assembler 
programs". Da wird gezeigt, wie einfach eine ISR in Assembler angelegt 
werden kann.

Oliver
#1258330
Lesenswert?
• ▲
▼
Oliver schrieb:

> Und warum muß das ohne die "avr-libc Definition" passieren? Schreib
> deine ISR's halt in Assembler, und lass die toolchain weiterhin die
> Vektoren verwalten.

Wahrscheinlich weil er sich "dazwischenhängen" will, und der Benutzer 
des OS weiterhin diese AVR-Libc Definitionen benutzen können soll.

@ Thomas Prescher:

Ohne eigenes Linker-Script wird das wohl nichts.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren