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
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
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
@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...
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)
okay, danke @Helmi. Darauf bin ich nicht gekommen... so kann das funktionieren. Danke! Grüsse Tobias
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.