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


von Tobias P. (hubertus)


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

von helmi (Gast)


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

von Tobias P. (hubertus)


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

von Berti (Gast)


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

von helmi (Gast)


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)

von Tobias P. (hubertus)


Lesenswert?

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

Grüsse
    Tobias

von helmi (Gast)


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 .

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.