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?
@ 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
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
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
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.
@ 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
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?
@ 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
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.
Danke, stimmt, die Interrupt geschichte wird noch einmal einwenig knifflig, aber da habe ich auch schon eine Idee.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.