Forum: Mikrocontroller und Digitale Elektronik von GCC definierte Interrupt Tabelle überschreiben


von Thomas Prescher (Gast)


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

von Jörg G. (joergderxte)


Lesenswert?

Suchst du das?
1
ISR(BADISR_vect)
2
{
3
}
d.h. du willst eine eigene ISR, die aufgerufen wird, wenn für einen 
Interrupt keine richtige ISR definiert ist?

rtfm, Jörg

von Thomas Prescher (Gast)


Lesenswert?

nein ich möchte alle Adressen selbst definieren (und es sollen 
unterschiedliche sein), ich möchste lediglich NICHT die avr-libc 
Definition benutzen.

von T. H. (pumpkin) Benutzerseite


Lesenswert?

Denk mal hierüber nach:

  http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html#ga87c0c624b62f40a17539be6946c3e26

Du definierst einen Interrupt klassisch der genau das macht was du 
willst, scheinbar init() aufrufen. Danach definierst du für alle anderen 
ein alias-Attribut. Nicht schön, aber praktisch.

von Stefan E. (sternst)


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.

von Thomas Prescher (Gast)


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

von gast (Gast)


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.

von Oliver (Gast)


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

von Stefan E. (sternst)


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.

von Thomas Prescher (Gast)


Lesenswert?

Stefan Ernst schrieb:

> @ Thomas Prescher:

> Ohne eigenes Linker-Script wird das wohl nichts.

arr, das habe ich schon befürchtet.
Hast du dafür vllt. einen Link/Doku oder ähnliches?

von Stefan E. (sternst)


Lesenswert?

Thomas Prescher schrieb:

> Hast du dafür vllt. einen Link/Doku oder ähnliches?

Wie wäre es z.B. mit der offiziellen ld-Doku?

http://sourceware.org/binutils/docs-2.19/ld/Scripts.html#Scripts

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.