ASM Scheduler

Gast #4839552
Lesenswert?

Hallo,

ich habe mir einen kleinen Scheduler in ASM geschrieben, siehe Anhang.
Gedacht ist er für nicht zeitkritisches quasi Multitasking und in seiner 
späteren Anwendung auch für Powermanagement.

Der Scheduler wird im MAIN loop aufgerufen und ist daher nicht all zu 
genau, kann aber ohne großen Aufwand auch auf Interruptsteuerung 
umgebaut werden.

Das ganze ist im Moment für ein mega164 mit dementsprechenden 
Registerpositionen gedacht, aber kritische Passage sind im Quelltext 
markiert.

Geplant ist eventuell noch eine Routine um Tasks zu löschen, im Moment 
besteht dazu aber keine Notwendigkeit.

Wenn Ihr Fragen oder Anregungen habt, immer her damit.
Gast #4839848
Lesenswert?

Danke alles gut habs überlesen :D

ne das kein Makro, ich kanns nachvollziehen wenn man es zum Beispiel auf 
nen Controller packt wo z.B das TIFR2 ausserhalb des IO-Bereiches(>$3F) 
liegt dann muss man LDS/STS nutzen statt IN/OUT.
Gast #4839872
Lesenswert?

an chris:

Wieso kein Macro? So z.B.:
1
.macro  STO
2
.if  @0 < $60
3
  out    @0,@1
4
.else
5
  sts    @0,@1
6
.endif
7
.endmacro
8

9
.macro  LOD
10
.if  @1 < $60
11
  out    @1,@0
12
.else
13
  sts    @1,@0
14
.endif
15
.endmacro


Und wenn man dann noch die defs für tmp&c. ergänzt sowie 
SDLR_STRUCT_ADDR mit was auch immer, dann wird zumindest assembliert.
Gast #4839910
Lesenswert?

Es ist aber kein MACRO weils oben so drin steht.

 LOD is synonym for IN/LDS depending on
 actual register position in AVR. Same for
 for STO - OUT/STS.

Beitrag "AVR-Assembler Verständnisfrage bei IN/ OUT vs. STS/LDS verwenden"
Beitrag "ersetzen von in/out durch lds/sts"

MaWin schrieb:
> Wo ist denn jetzt der Vorteil das in ASM zu schreiben statt in C?

Darum gehts jetzt nicht!
Angehängte Dateien:
Gast #4839932
Lesenswert?

Hab nicht geschrieben das man keine Macros schreiben kann. Nur in seiner 
Beschreibung hab ichs überlesen für was sto/lod steht und nein es müssen 
nicht zwingend Macros sein. Naja jetzt wird wieder getrollt....
Gast #4839945
Lesenswert?

Donny schrieb:
> Bist du der Psychopath?

Ich bin MaWin und ich würde gerne wissen, wo der Threadersteller seine 
Motivation hernimmt das in ASM zu implementieren. Wo ist da jetzt das 
Problem? Die Antwort kann auch lauten: "Weil es mir in ASM mehr Spaß 
macht." Das wäre natürlich völlig OK. Ich würde es halt nur gerne 
wissen.
Könnten wir jetzt mit der Trollerei aufhören?
Gast #4839967
Lesenswert?

Mich würde die Motivation auch interessieren. Multithreading hat wohl 
wenig Sinn mit 2K RAM, genauso wenig Sinn macht es einen Scheduler in 
ASM zu schreiben, bis auf den Contextswitch. Für die AVRs sind wohl 
Statemachinen besser.
Gast #4840212
Lesenswert?

Hallo,

wieso Assembler? Weil ich uCs eigentlich nur in Assembler programmiere. 
Das hat verschiedenen Gründe.

Die LOD / STO Befehle sind wie schon vermutet einerseits Macros, aber 
andererseits auch Gedankenstützen um es von Hand an verschiedenen AVRs 
anpassen zu können, falls man nicht die Macrosammlung aus AVR001 
benützt.
http://read.pudn.com/downloads169/sourcecode/math/777464/macros.inc__.htm

Ob Multitasking in kleinen 8bittern sinnvoll ist, steht hier nicht zur 
Diskussion, das muss jeder für sich selbst und seine Anwendung 
entscheiden. Als Beispiel könnten lange aber nicht rechenintensive 
Routinen, die auf Peripherie warten, genannt werden.
Wenn sich die Diskussion aber einfach nur um den Code selbst drehen 
könnte, wäre ich dankbar.


Frohe Weihnachten!
(Firma: Vescomp) #4840247
Lesenswert?

flex schrieb:
> Ob Multitasking in kleinen 8bittern sinnvoll ist, steht hier nicht zur
> Diskussion, das muss jeder für sich selbst und seine Anwendung
> entscheiden.
 Das, was du gepostet hast, ist aber kein Multitasking, es sind ganz
 einfach Routinen, die hintereinander aufgerufen werden.
 Sollte nur eine davon blockieren, bzw. auf irgendeine Eingabe warten,
 wartet dein Scheduler auch vergebens.

> Als Beispiel könnten lange aber nicht rechenintensive
> Routinen, die auf Peripherie warten, genannt werden.
 Und genau da ist dein Scheduler, welcher in Main sitzt, nutzlos.
 Der wartet geduldig darauf, dass die Routine endet und zurückkehrt.

> Wenn sich die Diskussion aber einfach nur um den Code selbst drehen
> könnte, wäre ich dankbar.
 Warum ?
 So, wie es jetzt aussieht, ist es absolut nutzlos.
 Genauso kann man die Routinen auch aufrufen.
Gast #4840265
Lesenswert?

So als Idee: Weiß eine Routine, dass sie Wartezeiten hat oder zu lange 
rechnet, aber die Operation nicht Zeitkritisch ist, könnte sie sich eine 
Task einrichten (der die Wartezeit abschätzt) und dann den Prozessor 
freigeben. Nennt sich Kooperatives Multitasking.
Daran arbeite ich gerade und es funktioniert wunderbar, insofern ist 
deine Aussage schlichtweg falsch.

Zusätzlich ist ein recht gutes Powermanagement möglich, da wartende 
Prozesse Tasks einrichten können und zwischen den Task der uC schlafen 
geht.

Da der Scheduler sehr einfach auf Interruptmodus umgebaut werden kann, 
könnte man übrigens auch Präemptives Multitasking implementieren.
Z.B. prüft der Scheduler bei einem neuen anstehend Task ob der PC beim 
Aufruf innerhalb eines bestimmten Bereichs war, der Subroutinen enthält 
die unterbrochen werden können. Ist dem der Fall wird ein neuer Task 
angelegt, der dorthin zurück springt und die Register wieder herstellt. 
Der anstehende Task wird abgearbeitet und der ursprüngliche darf seine 
Aufgabe erledigen wenn sein Timeslot gekommen ist.
(Firma: Vescomp) #4840297
Lesenswert?

flex schrieb:
> So als Idee: Weiß eine Routine, dass sie Wartezeiten hat oder zu lange
> rechnet, aber die Operation nicht Zeitkritisch ist, könnte sie sich eine
> Task einrichten (der die Wartezeit abschätzt) und dann den Prozessor
> freigeben. Nennt sich Kooperatives Multitasking.
> Daran arbeite ich gerade und es funktioniert wunderbar, insofern ist
> deine Aussage schlichtweg falsch.

 Nein.
 Dein Problem ist, dass alles ohne Timer-Interrupt über main geht.

 Praktisch eine Statemachine, nur fehleranfälliger und komplizierter.
 Wenn schon aus main und ohne Timer, dann geht das Ganze mit Flags und
 Statemachine viel besser.
 Vorteil:
 a) Dein Programm weiss immer welche Tasks ausgeführt und welche noch
 auszuführen sind.
 b) Dein Programm ist viel leichter zu debuggen und zu verstehen, auch
 noch nach ein paar Wochen.

 Ohne Timer-ISR bringt das Ganze überhaupt keine Vorteile, da jeder neue
 Task erst die anderen Tasks abwarten muss, aber nicht im Voraus wissen
 kann, wieviele Tasks noch vor ihm auf Abarbeitung warten und wie lange
 dessen Ausführung überhaupt dauert.
 Wenn es keiner oder nur einer ist, kann das u. U. zu schnell sein,
 wenn es aber mehrere sind, kann es schon zu spät sein.
 Oder es wird als besonders geniale Idee mit Task-Stack rum hantiert,
 Anzahl der Tasks rausgefunden, die benötigte Gesammtzeit erechnet und
 am Ende ist dann doch nicht genug Zeit vorhanden.
 Was dann ?
 Einen Flag setzen und wieder zurückkehren oder in der Routine warten?
 Falls Flag - genauso gut geht es mit Statemachine.
 Falls warten - nix mit Multitasking...

 Einen Sinn macht das Ganze nur mit Interrupts und TimeSlice, das aber
 ist eine ganz andere Liga.
(Firma: matzetronics) #4840452
Lesenswert?

Zeig uns doch jetzt mal, wie man jetzt z.B. zwei Tasks einbindet, von 
denen eine einen Piepser an irgendeinem Port quäken lässt und eine einen 
Taster abfragt, die den Piepser startet und meinetwegen 2 Sekunden 
quäken lässt.

Ich vermisse übrigens die .def für deine Register.
#4855605
Lesenswert?

Hallo und allen noch ein gesundes Neues Jahr 2017!

Falls es den einen oder anderen interessiert:
Ich habe mal zwei Bibliotheken erstellt, die auf AVR den Umgang mit Code 
vereinfachen sollen.
U.a. die CPU abstrahieren fuer z.B. cooperatives Multitasking...

Fuer konstruktive Anmerkungen, Forks oder Sternchen bin ich dankbar :-)

https://github.com/dumpsite/avr-contexts


MfG Stephan

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren