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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Thomas Prescher (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

int main()
{
    while(1);
}

dann generiert mir der gcc eine Interrupt Vektor Tabelle der Form
00000000 <__vectors>:
   0:   0c 94 2a 00     jmp     0x54    ; 0x54 <__ctors_end>
   4:   0c 94 47 00     jmp     0x8e    ; 0x8e <__bad_interrupt>
   .
   .
   .
  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
.section .vectors

.org 0x0000
    jmp INIT
    jmp INIT
    jmp INIT
    jmp INIT
    jmp INIT
    jmp INIT
    jmp INIT
    jmp INIT
    jmp INIT
    jmp INIT

INIT:
    nop
    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:
00000000 <__vectors>:
   0:   22 c0           rjmp    .+68            ; 0x46 <__ctors_end>
   2:   3d c0           rjmp    .+122           ; 0x7e <__bad_interrupt>
   .
   .
   .
  18:   32 c0           rjmp    .+100           ; 0x7e <__bad_interrupt>
  1a:   0c 94 21 00     jmp     0x42    ; 0x42 <INIT>                   
  1e:   0c 94 21 00     jmp     0x42    ; 0x42 <INIT>                   
  22:   0c 94 21 00     jmp     0x42    ; 0x42 <INIT>                   
  26:   0c 94 21 00     jmp     0x42    ; 0x42 <INIT>                   
  2a:   0c 94 21 00     jmp     0x42    ; 0x42 <INIT>                   
  2e:   0c 94 21 00     jmp     0x42    ; 0x42 <INIT>                   
  32:   0c 94 21 00     jmp     0x42    ; 0x42 <INIT>                   
  36:   0c 94 21 00     jmp     0x42    ; 0x42 <INIT>                   
  3a:   0c 94 21 00     jmp     0x42    ; 0x42 <INIT>                   
  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)


Bewertung
0 lesenswert
nicht lesenswert
Suchst du das?
ISR(BADISR_vect)
{
}
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)


Bewertung
0 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.