www.mikrocontroller.net

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


Autor: tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: jonny (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hartmut Semken (hsemken)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Steven Wetzel (steven)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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


Autor: Andreas Lang (andi84)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke,

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

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.