Forum: Mikrocontroller und Digitale Elektronik Mehrere programme in einem µC


von tom (Gast)


Lesenswert?

Hallo, ist es möglich mehrere Programme in einen µC zu laden.

Die Programme sollen dabei an festen Speicherpositionen untergebracht 
werden (Damit sie unabhängig von einander eingespielt werden können).
Dabei soll eine Art Bootmanager das auswählen des Programms erledigen.

Spricht irgendetwas dagegen?

Auch würde mich interessieren wie man in C zu einer bestimmten 
Speicheraddresse Springen kann.

void *jump() = 0x00;
jump();

Geht das?

von Falk B. (falk)


Lesenswert?

@ tom

>Hallo, ist es möglich mehrere Programme in einen µC zu laden.

Warum nicht. Auch Main ist am Ende nur eine Funktion.

>Die Programme sollen dabei an festen Speicherpositionen untergebracht
>werden (Damit sie unabhängig von einander eingespielt werden können).

Das dürfte schon schwieriger werden.

>Auch würde mich interessieren wie man in C zu einer bestimmten
>Speicheraddresse Springen kann.

Mit absoluten Speicheradressen arbeitet man in C praktisch kaum.

http://www.mikrocontroller.net/articles/FAQ#Funktionszeiger

MFG
Falk

von jonny (Gast)


Lesenswert?

könnte man nicht jedes Programm eine eine Funktion schrieben und in der 
Main wird dann immer das jeweilige Programm also die Funktion 
ausgewählt.

über taster o.ä.

jonny

von Hartmut S. (hsemken)


Lesenswert?

tom wrote:
> Dabei soll eine Art Bootmanager das auswählen des Programms erledigen.

Wie soll der aussehen?
Ne Tastatur, nen Jumper oder einen RS-xxx Input belauschen?

Wenn Dein Problem ist, dass Du die verschiedenen Programme separat 
voneinander aktualisieren willst, dann wird das etwas knifflig.

Wenn Du damit leben kannst, immer den kompletten aktuenn Firmwareset 
einzuspielen (und bei maximal 256k Flash ist das nicht wirklich eine 
Hürde, oder?), dann mach doch einfach ein main() als "Bootmanager" das 
dann schlciht abhängig vom Select-Imput die passenden Funktion aufruft.

Eine separate Aktualisierung wird knifflig, weil das Flash ja nicht 
partitioniert ist (bzw. eben nur in zwei Partitionen: Bootflash und 
Rest).

Bei Projekten, bei denen ich Code-Trennung brauche, z.B. weil die 
beteiligten Personen bestimmte Kenntnisse nicht haben dürfen, die der 
andere hat, kommen einfach 2 Controller rein und reden miteinander (SPI, 
TWI oder was auch immer).
Die ISP-Schnittstelle muxt man dann über einen Schalter und gut.
Die controller kosten mit eeenzatchzich das Stück ja auch kein Vermögen 
mehr :-)

hase

von S. W. (Gast)


Lesenswert?

tom wrote:
> Hallo, ist es möglich mehrere Programme in einen µC zu laden.
>
> Die Programme sollen dabei an festen Speicherpositionen untergebracht
> werden (Damit sie unabhängig von einander eingespielt werden können).
> Dabei soll eine Art Bootmanager das auswählen des Programms erledigen.
>
> Spricht irgendetwas dagegen?


Nein, es kommt auf den Controller an. Wenn das Flash in Pages unterteilt 
ist, wie z.B. beim M16C der Fall ist, dann können diese Bereiche 
unterschiedlich geflasht werden. Dies ist z.B. in der Automobilbranche 
der Fall, wo in Starter, Bootloader und Applikation unterschieden wird. 
Der Starter bleibt immer gleich, sodass bequem per CD Bootloader und App 
geschrieben werden können.

von Falk B. (falk)


Lesenswert?

@ Hartmut Semken

>Eine separate Aktualisierung wird knifflig, weil das Flash ja nicht
>partitioniert ist (bzw. eben nur in zwei Partitionen: Bootflash und
>Rest).

???
Der Flash ist ausserdem in Pages a 256? Byte aufgeteilt. Die kann man 
separat brennen.
Knifflig ist eher dem Linker zu verklickern, dass die einzelnen Module 
an feste Adressen sollen. Machbar, aber erfordern ne Menge 
Insiderwissen.

MFG
Falk

von tom (Gast)


Lesenswert?

Einfache Funktionsaufrufe bringen mich nicht weiter, die Programme 
müssen wirklich unabhängig voneinander sein.

Der Bootmanager wird aller voraussicht per LCD gesteuert.

Das Programm an die richtige Stelle zu laden sollte weniger das Problem 
sein (Da wird sowieso eine Spezielle ProgrammiereSoftware her müssen), 
es geht mehr um die großen Speichersprünge.

Es wird  ein großer AVR zum Einsatz kommen (mindestens 128k, eher 256k 
Flash).

Wie könnte ich den da im Speicher rumspringen?

von Falk B. (falk)


Lesenswert?

@ tom

>Es wird  ein großer AVR zum Einsatz kommen (mindestens 128k, eher 256k
>Flash).

>Wie könnte ich den da im Speicher rumspringen?

Entweder mit den Funktionspointern, welche "per Hand" auf feste Adressen 
initialisiert werden oder mit Inline Assembler.

MfG
Falk


von Andreas L. (andi84)


Angehängte Dateien:

Lesenswert?

Bei interrupts wirdsetwas eklig, weil die Vektoren beim AVR statisch im 
Flash liegen. Da braucht man nochmal extra code (siehe Bild), der die 
IRQs auf die einzelnen Programme verteilt.

von tom (Gast)


Lesenswert?

Danke,

stimmt, die Interrupt geschichte wird noch einmal einwenig knifflig, 
aber da habe ich auch schon eine Idee.

von Markus (Gast)


Lesenswert?

Hallo!

Tom, wegen deiner Frage vorhin.
>Auch würde mich interessieren wie man in C zu einer bestimmten
>Speicheraddresse Springen kann.

Beim Codevision-AVR-Compiler ist es möglich ASM-Code einzubinden.
Deshalb kann man ein JUMP durchführen.
...
#asm("jmp 0")
...

Tschüss
Markus

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.