Forum: Mikrocontroller und Digitale Elektronik Atmega nC rudimentär-"Betriebssystem"


von Phillip H. (philharmony)


Lesenswert?

Hi,
ich arbeite an einem Projekt, in dem ich mehrer Master-Boards an denen 
dann verschiedene "Slaves" mit unterschiedlichen Aufgaben hängen.
Die Master-Boards an sich sind eigentlich fast identisch, enthalten alle 
einen Atmega8535, ein UM232R-Modul, eine ISP6 Schnittstelle, einen 8er 
Dip-Switch für Adresszuweisung und je nach Anwendung die restlichen 
Ports vergeben.
Daran hängen dann zb Boards mit Relais, Servos, Schieberegistern etc.
Das Protokoll mit dem in dann über das UM232R-Modul mit den Boards 
komuniziere ist bei allen gleich, ich kann Commands (Reset, resend 
Data...) und Daten an die Boars senden sowie empfangen, die Daten kommen 
in einen RX-Speicher und werden dann im Hauptprogramm verarbeitet.
Die Idee ist jetzt, eine art rudimentärst-"Betriebssystem" (wenn man das 
überhaupt so nennen kann) zu schreiben, das auf alle Controller drauf 
kommt, nach dem Prinzip:
1
void main(void)
2
{init(); //including setup.cfg
3
 prefunct()
4
 for(;;)
5
  {void PROGRAM(void(?)); //das ist dan individuell je nach Anwendung
6
  }
7
8
}
9
10
11
ISR_Vect...
12
{  //zB RX-Handler. Timers...
13
}


Die init, setup.cfg, Prefunct und PROGRAM würden dann individuell 
geschrieben, der rest einmal für alle. in der Init wird dann zb auch 
bestimmt, welche der ISR-Handler benutzt werden...
Da PROGRAM ja mehr als nur einen Wert ändern soll, muß ich darin dann 
vermutlich mit Zeigern arbeiten, richtig? Das heißt ich muß dann auch 
alle Variablen die ich geändert abspeichern will als Parameter (bzw mit 
var_type &var_name deren Speicheradresse) übergeben und mit *var_name = 
xyz speichern?
Bin ich mit diesen Gedanken auf dem richtigen Weg oder hab ich mich da 
verlaufen?

Wie sieht es aus, wenn ich einen Wert als Ein- und als Ausgabe benutze?
Also
1
void change(int &Wert, int Difference) //mit oder ohne '&' oder zweimal aufrufen?
2
{*Wert = Wert + Difference; //geht da auch *Wert += Difference?
3
}

von Bastler (Gast)


Lesenswert?

Wenn man die Endlosschleife in PROGRAMM hineinpackt, dürfte es sicher um 
einiges effizienter sein als so wie du es gemacht hast.

Außerdem sollte man beachten dass alle Programme sich die selben 
Interruptfunktionen verwenden und sich eventuell in die Quere kommen 
könnten.

Eventuell könnte man dass Ganze mittels Bootloader lösen.

von Phillip H. (philharmony)


Lesenswert?

Hi,
daß ich bei verschiedenen Interrupts aufpassen muß ist klar, geht ja nur 
um die Struktur.
Stimmt, die Endlosschleife macht im Program selbst mehr sinn.
Ansonsten so machbar und vernünftig?

von .... (Gast)


Lesenswert?

Das muss alles in einen Bootloader sein, denn ein AVR kann keinen Code 
im Speicher ausfuehren. Ob der Mega8535 passend Bootspace hat ist eine 
Frage... sonst den 644er oder so anschauen.

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.