Forum: Mikrocontroller und Digitale Elektronik Getrenntes Bios und Firmware


von Micha06 (Gast)


Lesenswert?

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 :-)

von Manos (Gast)


Lesenswert?

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

von Rahul (Gast)


Lesenswert?

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.

von Micha06 (Gast)


Lesenswert?

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

von peter dannegger (Gast)


Lesenswert?

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

von Micha06 (Gast)


Lesenswert?

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 ?

von peter dannegger (Gast)


Lesenswert?

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

von Micha06 (Gast)


Lesenswert?

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 ?

von Manos (Gast)


Lesenswert?

"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,...).

von Micha06 (Gast)


Lesenswert?

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 ?

von Manos (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.