Forum: Mikrocontroller und Digitale Elektronik 8051 Kernel unterprogrammaufruf


von Gustav K. (hanibal)


Lesenswert?

Hallo,
Ich habe vor, ein Kernel für einen 8051 zu schreiben.
Sprich scheduler usw.
Mein momentanes Problem ist:
Wie kann man in eiem Programm das unter diesem Kernel als Prozess leuft 
ein unterprgramm aufrufen? sprich mein problem ist, das ich denn stack 
pointer nicht auf den externen Speicher zeigen lassen kann, und selbst 
wenn das gehen würde, wie kann ich dafür sorgen, das ein LCALL auf denn 
pastenden bereich springt, weil ich beim assemblieren des programmes ja 
noch garnicht weiß, wo mein programm später im speicher sitzen wird.
Mein Bisheriger gedanke ist es, das alles mit software nachzubilden, und 
als syscall zur verfügung zu stellen. nur wird darunter natürlich die 
geschwindigkeit sehr drunter leiden und das programmieren wird deutlich 
komplizierter.

von Tauwetter (Gast)


Lesenswert?

>Ich habe vor, ein Kernel für einen 8051 zu schreiben.

Warum nur? Es ist doch vergeudete Zeit, einem Hasen das Fliegen 
beibringen zu wollen.
Nimm einen zeitgemäßen µC, der Dir ein besseres, direktes 
Erfolgserlebnis liefert und für reale Anwendungen verwertbar ist.

von Peter D. (peda)


Lesenswert?

Schau Dir einfach mal an, wie es die vielen bereits existierenden 
8051-RTOS-e machen.

Den 8051 gibts ja schon länger, da müßte für fast alles schon ne fertige 
und optimale Lösung zu finden sein.
Alles selber von Grund auf zu entwickeln, kostet nur unnötig Zeit.

Und Du hast ja nichtmal gesagt, für welchen C-Compiler das RTOS sein 
soll.
Da muß man sich nämlich mit der Speicherverwaltung und Parameterpassing 
drauf abstimmen.


Peter

von Gustav K. (hanibal)


Lesenswert?

Ich habe garnicht vor, irgend ein programm in c zu schreiben, sondern 
alles in assembler.Und das mit der Zeitverschwendung ist ekin problem, 
da ich das nicht für irgendein reales Projekt mache, sondern nur aus 
Spass an der Freude.
Achja, es soll kein Echtzeit System werden.

Edit: Mir fällt zwar gerade auf, das man bei einem AVR mit alle dem kein 
Problem hätte, aber da kann man ja leider keinen externen Speicher 
anschließen. Unbd ich habe sowiso vor das auf einem 8051 zu machen.

von nils (Gast)


Lesenswert?

Ich habe sowas ähnliches mal gemacht, dort habe ich abwechselnd Werte 
reinbekommen und bearbeitet und da den Stack oft gebraucht. Ich habe mir 
eine Routine geschrieben, die mir den Stack erst an XYZ sichert und beim 
zweiten Aufruf zurückholt, allerdings ist das sehr fehleranfällig und 
unübersichtlich.
Das geht eigentlich nur, wenn das für eine bestimmte Anwendung ist und 
nicht grossartig verändert werden soll im Lauf der Zeit.

von Peter D. (peda)


Lesenswert?

Gustav K. schrieb:
> wie kann ich dafür sorgen, das ein LCALL auf denn
> pastenden bereich springt, weil ich beim assemblieren des programmes ja
> noch garnicht weiß, wo mein programm später im speicher sitzen wird.

Wie soll denn das gehen?
Welcher 8051-Assembler kann denn assemblieren, ohne die Adressen zu 
kennen?

Du kannst z.B. ein Programm für 0x4000 und das andere für 0x8000 
assemblieren und dann genau dorthin laden.
Schwierig wirds aber, wenn beide Programme Interrupts benötigen, das 
geht dann nicht.

Ich sehe allerdings noch nicht den Sinn dahinter, wozu sowas nütze sein 
soll.
Insbesondere bei Assemblerprogrammierung sind ja Programme klein und 
übersichtlich. Da muß man nicht so einen riesen Aufwand treiben.


Ich benutze 8051-er von Atmel mit Bootloader. Da braucht man überhaupt 
keinen Zirkus veranstalten. Die Programme werden immer an 0x0000 
compiliert, dann per Bootloader geflasht und gut is. Der Reset geht 
immer erstmal zum Bootvektor und nach einem Timeout wird nach 0x0000 
gesprungen.

Assembler progge ich eh nicht mehr, ich möchte den Komfort von C nicht 
mehr missen.


Peter

von (prx) A. K. (prx)


Lesenswert?

Nur ist 8051 aufgrund technisch beschränktem Raum für den Stack und 
schechter Implementierbarkeit von reentrant functions eine denkbar 
ungünstige Voraussetzung für sowas. Jedenfalls wenn in Hochsprache 
programmiert wird. Und reentrant muss sein, wenn nebenläufig.

Es gibt zwar Plattformen, die dafür noch weniger taugen (8-Bit PIC), 
aber wenn nicht grad Leib und Leben von 8051 abhängt, dann wäre eine 
andere Plattform sinnvoller.

von Gustav K. (hanibal)


Lesenswert?

das problem mit den jup's werde ich warscheinlich so lösen, das dem 
Prozess mitgeteiltwird ab welcher ardresse er beginnt, und so die 
Adresse Aufaddiert, wobei ich mir da noch ein paar gedanken machen muss, 
aber ich denke, das ist machbar.
Das größere problem ist eigentlich der stack, da man ohne den ja 
bekanntlich eußerst "unbequem" calls durchführen kann (calls werde ich 
genau so machen wir jumps, nur das durch die software dir 
rücksprungadresse gesichert wird).

Kennt irgendwer eine schnelle und kompfortable möglichkeint, einen stack 
nachzubilden, und das natürlich für jeden Prozess einzelnd?

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.