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.
>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.
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
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.
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.