www.mikrocontroller.net

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


Autor: Thomas Prescher (Gast)
Datum:

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

Autor: Jörg G. (joergderxte)
Datum:

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

Autor: Thomas Prescher (Gast)
Datum:

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.

Autor: T. H. (pumpkin) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Denk mal hierüber nach:

  http://www.nongnu.org/avr-libc/user-manual/group__...

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.

Autor: Stefan Ernst (sternst)
Datum:

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.

Autor: Thomas Prescher (Gast)
Datum:

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

Autor: gast (Gast)
Datum:

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.

Autor: Oliver (Gast)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

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.

Autor: Thomas Prescher (Gast)
Datum:

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?

Autor: Stefan Ernst (sternst)
Datum:

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/Script...

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.