Hallo, ich würde gerne 2 getrennte Programme auf einem Pic18 laufen lassen. Das 1. soll ein Bios sein. Es soll einen Bootloader, globale Konstanten und Standard Funktionen enthalten. Ausserdem soll es ebenso wie die Firmware die Hardware IRQ's des Pics nutzen können. Nach der Initialisierung und einem Firmwaretest (eventuelles Update) gibt dieses die Kontrolle an die Firmware ab. Das 2. entspricht der eigentlichen Firmware. Dieses greift auf die Funktionen und Konstanten des Bios zu und nutzt ebenfalls die Hardware IRQ's. Beide Programme sollen möglichst in C realisiert werden und mittels einer Interface-Header Datei miteinander kommunizieren. Nun meine Fragen: 1. Wie kann ich Konstanten im "code"-Segment des Controllers innerhalb des BIOS definieren, auf die ich aus der Firmware heraus ebenfalls zugreifen kann ? prinzipiell ungefähr so: interface.h #define GlobaleConstanteAdr 0x200 bios.c #include interface.h #pragma code GlobaleConstanteAdr const int GlobaleConstante = 100; firmware.c #include interface.h extern const int GlobaleConstante; 2. Siehe 1 für Funktionen :-)
Was bezweckst Du mit der Trennung? Warum schreibst Du nicht ein Programm in C was beides macht... Um nach evtl. Updates zu suchen kann man auch einen Bootloader machen der dann das Hauptprogramm austauscht (sofern das bei PIC auch geht).
Das BIOS kann man gleich als Bootloader auslegen. Globale Konstanten kann man im EEPROM (falls vorhanden) ablegen. Etwaige Funktionen sind in c-Libraries besser aufgehoben, da sie den Controller (speichermässig) nicht belasten, wenn sie gar nicht gebraucht werden. Eine Trennung, wie du sie dir vorstellst, ist auf Mikrocontroller-Basis ziemlich sinnlos. Überwiegend werden Mikrocontroller so eingesetzt, dass sie in einer gleichbleibenden Hardware eingesetzt werden. Da muß man vielleicht mal die Firmware wegen Software-Fehlern oder Hardware-Änderungen überarbeiten, aber sonst ändert sich da irgendwie nie was. Wozu man die "Trennung" haben sollte, ist mir völlig schleierhaft.
Ich habe 2 unterschiedliche Platinen. Beide müssen die Möglichkeit eines Firmware-Updates bieten. Die einzige Schnittstelle der beiden Platinen nach "draußen" ist ein Funk-Modul. Das Firmware-Update kann erst erfolgen, wenn das jeweilige Modul in ein bestehendes Netzwerk mit vielen anderen Teilnehmern eingebunden ist. Dies bedeutet, das fast sämmtliche Funk und Funk-Protokoll Funktionen sowohl im Bios(Bootloader) als auch in der Firmware vorhanden sein müßten, somit also doppelt vorhanden wären. Um mir dies zu ersparen möchte ich die Funktionen, die das Bios für die Netzwerkintegration und Paket- Handling benutzt, aus der Firmware heraus aufrufen können. Ist das Grund genug ???
Sowas kann eigentlich nur voll in die Hose gehen. Der Compiler müßte ja Deine Anwendung so programmieren, daß alle Speicheranforderungen über das BIOS verwaltet werden, ansonsten kommen sich beide unweigerlich ins Gehege. Ein Möglichkeit wäre höchstens, das BIOS komplett in Assembler zu programmieren und sämtliche Variablen des BIOS auf dem Stack anzulegen. Wenn mich aber nicht alles täuscht, hats der PIC nicht so mit Stack-Variablen. Daher bleibt beim PIC wohl nur, die benötigten Funktionen eben in beiden Programmen zu implementieren und einen entsprechend großen Flash zu nehmen. Kürzlich war gerade eine Frage bezüglich Fern-Update. Da hat sich als einzig zuverlässige Lösung abgezeichnet, den Bootloader und die Anwendung in getrennte MCs abzulegen. Denn nur so kann garantiert werden, daß bei einem Updatefehler ein nächster Versuch möglich ist und der MC nicht für alle Zeiten hängt. Der Bootloader-MC lauscht also immer auf das Updatekommando für den anderen MC, kann aber selber nicht versehentlich totgeflasht werden. Peter
Ich möchte ja kein eigenes Betriebsystem schreiben, sondern lediglich die im Bios-Code enthaltenen Funktionen von der Firmware aus aufrufen um Speicherplatz zu sparen. Beispiellösung für Funktionsaufruf: // interface.h ####################### typedef void (*EinfacheFunktion)(); #define TuWasFunktionAdr 0x0100 // bios.c ####################### #include "interface.h" #pragma code GlobaleFunktionen = TuWasFunktionAdr void TuWas() { // Source } // firmware.c ####################### #include "interface.h" EinfacheFunktion pTuWas; void main() { pTuWas = TuWasFunktionAdr; pTuWas(); } // Ende ############################# So müßte es eigentlich funktionieren. Man könnte beide Programme übersetzten und an unterschiedlichen Stellen im Programmspeicher des Pics ablegen. Die Funktion "TuWas" würde nur im Code- Bereich des Bios liegen, könnte aber über den Funktionspointer "pTuWas" von der Firmware benutzt werden. Leider braucht man auf diese Weise für jede Funktion einen Pointer in der Firmware, aber vielleicht erreicht man das gleiche, wenn man die Adresse "TuWasFunktionAdr" in einen Funktionspointer castet. So werde ich es wohl mal versuchen. Anmerkungen, Verbesserungsvorschläge ?
Das Problem ist nicht der Funktionsaufruf, sondern die Variablen, die diese Funktion benötigt und verändert. Davon weiß doch der Linker für Deine Anwendung nichts. Er wird also frisch fromm fröhlich auch Variablen dort ablegen, die dann Dein BIOS einfach überbrät. Peter
Könnte ich dieses Problem dadurch beheben, indem ich Bios und Firmware mit Hilfe des Linker Scripts jeweils nur einen Teil des Rams zur Verfügung stelle ? Wenn ich tatsächlich 2 komplett eigenständige Programme erstelle, wie kann ich dann Beiden die Hardware IRQ's zur verfügung stellen ?
"wie kann ich dann Beiden die Hardware IRQ's zur verfügung stellen?" Wahrscheinlich gar nicht... Du wirst der IRQ-Sprungtabelle nur eine Zieladresse geben können. Diese kann dann natürlich versuchen weiter zu verzweigen. Ebenso müßtest Du versuchen eine Sprungtabelle von Pragramm1 zu erstellen damit Programm2 die Einsprünge für die Routinen findet - ob das damit geht hab ich aber keine Ahnung... In ASM eher als in C denk ich mal. Du bräuchtest auf jeden Fall feste Offsetadressen (Programm1, Sprungtabelle, Programm2,...).
Das Problem dabei ist diesmal nicht die Sprungadresse, sondern die Bedingung ob gerade das Bios oder die Firmware aktiv ist. Diese Information müßte nämlich vom Bios in einer Variablen (Ram) gespeichert werden, die von der Firmware nicht benutzt werden darf. Wo lege ich also dieses "Firmware gestartet"- Flag hin ?
Das ist das Problem der Hochsprache... In ASM würdest Du einfach festlegen, dass diese oder jene RAM-Zelle nur Statusbits enthält. Du kannst das natürlich auch im EEPROM ablegen.. 100.000 Schreibversuche hast Du ja dann pro Zelle... Muß halt nur sichergestellt werden, dass bei einem Reset diese Zelle dann wieder auf "BIOS" abgeändert wird.
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.