mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C-Programmierung - Funktion an bestimmter Adresse


Autor: Tobias Plüss (hubertus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ihr,
mal ne kleine Frage:
Ich möchte für mein Mikrocontrollerboard gewisse Routinen schreiben, 
welche man immer wieder braucht. z.B. initialisiere LC-Display, gib 
einen Text dort aus und so weiter. Diese Routinen solen in C 
Programmiert werden und kommen dann ins EPROM (bzw. Flash) das auf dem 
Board verbaut ist.
Im RAM kann man jetzt selber entwickelte Programme abspeichern. Nun soll 
das ganze so aufgebaut werden, dass ich im C-Code (den ich nachher ins 
RAM runterlade) nur ein Verweis auf eine solche Funktion existiert (z.B. 
InitLCD). Der Prozessor soll dann automatisch wissen, dass deise 
Funktion im Flash an der Adresse sowieso liegt. Die Frage ist nun, wie 
ich sowas realisieren kann. Ich kann ja nach dem Compilieren nicht mehr 
wissen, an wlecher Adresse wleche Funktion steht. Weiss jemand von euch 
vielleicht, wie man sowas realisiert? Auf dem PC wüsste ich wie ... nur 
wie macht man das im Mikrocontroller?

Übrigens verwende ich den Hiware C-Compiler für 68k. Falls das jemandem 
was nützt...

Grüsse
      Tobias

Autor: helmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt 2 Methoden
1. Du legst die an einer genau definierten Stelle ein Sprungtabelle an 
und springst ueber diese die Funktionen an.
zb.  Jmp  LcdInit
     jmp LcdTextout

2. Du gehst ueber einen Software Interrupt und uebergibst in einen 
Register ein Funktion nummer. Dein Programm im Flash verzweigt dann 
aufgrund dieser Nummer dann zu deiner Routine. Mit dieser Methode wird 
zum Beispiel bei MSDOS die einzelen Funktionen aufgrufen

Gruss Helmi

Autor: Tobias Plüss (hubertus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und wie lege ich eine solche Jumptabelle an?
Mein Controller erlaubt es, sogenannte "Traps" zu verwenden. Man kann 
(ich weiss nur wies in Assembler geht) z.B. im Code schreiben: TRAP #7 - 
dann wird die Funktion Nr. 7 aufgerufen, die man vorher einmal definiert 
hat (mittels ihrer Adresse). Aber ich verstehe immer noch nicht, wie ich 
im C-Code festlegen kann, dass z.B. die Funktion "LCDInit" an Adresse 
0x1234 stehen soll bzw. wie ich rausfinden kann, an welcher Adresse 
diese Funktion beginnt. Aber genau das muss ich ja wissen, wenn ich eine 
Jumptabelle bastel', odeR?

Grüsse
    Tobias

Autor: Berti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@helmi: hä?

Ich würd sagen du schaust was dein Compiler so an Funktionalität 
nützt...
dann arbeitest du mit #pragma oder sonst weis gott einer 
Linkerdirektive...

Autor: helmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du must nur bei Trap eine Addresse eintragen und zwar die wo deine 
Verzweigungs routine aufgerufen wird.

void Verteiler(int No)
{
     switch(No){
     case 1: Lcdinit(); break;
     case 2: LcdOut();break;
     }
}


Du must nur die Addresse von Verteiler haben

       void *Addr;

       Addr = (void*)&Verteiler;

Diese Addr traegst du bei deinem TRAP Vector ein (beim Start des 
Systems)

Autor: Tobias Plüss (hubertus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
okay, danke @Helmi.
Darauf bin ich nicht gekommen... so kann das funktionieren. Danke!

Grüsse
    Tobias

Autor: helmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du must nur den Parameter in einenm Register übergeben und nicht auf dem 
Stack , Ich weiss nicht ob dein Compiler das unterstützt. Ansonst must 
du entweder noch eine kleine Assembler routine vorschalten oder den 
Parameter per Inline Assembler abholen .

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.