*** Protokolldatei gestartet *** Datum: Mi Nov 4 19:54:53 2009 [Mi Nov 4 2009] [19:54:53] Betreten Sie haben den Kanal #forth-ev betreten (~bernd@ppp-88-217-19-201.dynamic.mnet-online.de). [Mi Nov 4 2009] [19:54:57] Modus Kanalmodi: [Mi Nov 4 2009] [20:10:38] Betreten MatthiasT hat den Kanal betreten (-MatthiasT@p4FE696C2.dip0.t-ipconnect.de). [Mi Nov 4 2009] [20:10:45] Hallo Matthias! [Mi Nov 4 2009] [20:10:48] servus [Mi Nov 4 2009] [20:11:16] Mit dem Chat muss wohl mal wieder eine Übungsrunde einlegen [Mi Nov 4 2009] [20:11:34] Mein IRC Client mag seit dem Update nicht mehr [Mi Nov 4 2009] [20:11:49] Zum Glück gibt's Java Applets bei der FU [Mi Nov 4 2009] [20:12:40] Betreten erwaelde hat den Kanal betreten (-user@p549E968F.dip0.t-ipconnect.de). [Mi Nov 4 2009] [20:12:45] Tag. [Mi Nov 4 2009] [20:12:46] Hallo Erich! [Mi Nov 4 2009] [20:13:13] Hallo Erich [Mi Nov 4 2009] [20:14:08] Sieht nach "kein Thema" aus? [Mi Nov 4 2009] [20:15:20] Ich kämpfe noch mit der Tücke der Technik [Mi Nov 4 2009] [20:15:45] Irc im Java Applet ist als Notbehelf ganz schick... [Mi Nov 4 2009] [20:16:48] Soso. Java applet. Das klingt kompliziert. [Mi Nov 4 2009] [20:17:22] http://irc.fu-berlin.de/instantIRC/ [Mi Nov 4 2009] [20:17:27] Ich muss doch mal den gforth-IRC-Client fertig machen... [Mi Nov 4 2009] [20:17:46] Oder mit bigForth und MINOS... [Mi Nov 4 2009] [20:17:56] IRC ist eigentlich ein total simples Protokoll. [Mi Nov 4 2009] [20:18:22] Stimmt [Mi Nov 4 2009] [20:18:25] Zur Not könnt ich auch emacs/erc noch vorschlagen ... [Mi Nov 4 2009] [20:19:42] Beenden MatthiasT hat den Server verlassen (EOF From client). [Mi Nov 4 2009] [20:19:59] Betreten MatthiasT3 hat den Kanal betreten (-MatthiasT@p4FE696C2.dip0.t-ipconnect.de). [Mi Nov 4 2009] [20:20:17] Das war einfach. [Mi Nov 4 2009] [20:20:25] Fast schon suizidal [Mi Nov 4 2009] [20:20:29] Aber ich kämpfe auch mit der Technik: hab ich mir doch einen tollen rs485 Bus zusammengekabelt, aber irgendwie will dann doch nicht jeder mit jedem reden. Die Pegel sind eigentlich ausreichend. Keine Ahnung wo's klemmt. [Mi Nov 4 2009] [20:20:57] Was jetzt? emacs??? [Mi Nov 4 2009] [20:21:19] grmpl [Mi Nov 4 2009] [20:21:59] Kein Emacs [Mi Nov 4 2009] [20:25:30] Da hätt ich doch tatsächlich noch 'ne amforth Frage. [Mi Nov 4 2009] [20:25:47] Multitasker. [Mi Nov 4 2009] [20:25:51] oh je [Mi Nov 4 2009] [20:26:07] Ich hab das Beispiel seziert und das tut auch soweit. [Mi Nov 4 2009] [20:26:27] Ich kann einen "job" laufen lassen und gleichzeitig mit dem "prompt" reden. [Mi Nov 4 2009] [20:26:57] Also, hab ich mir gedacht, ich tät das gerne automatisch via turnkey hinkriegen. Das funktioniert auch soweit. [Mi Nov 4 2009] [20:27:33] Was mir aber auffällt, ist daß der 2. Task nach jedem restart eine höhere Adresse bekommt (Ausgabe von tlist). [Mi Nov 4 2009] [20:27:49] Wahrscheinlich benutz ich das falsch. [Mi Nov 4 2009] [20:27:58] hmm [Mi Nov 4 2009] [20:28:48] Der "job" hat 'ne Schleife mit ... do 1ms pause loop [Mi Nov 4 2009] [20:28:53] task alloziert bei jedem Aufruf Speicher [Mi Nov 4 2009] [20:29:09] turnkey darf also task nicht aufrufen [Mi Nov 4 2009] [20:29:51] Da sollte ich wohl noch etwas factorn [Mi Nov 4 2009] [20:30:05] D.h. der task wird beim "hochladen" des Programms initialisiert ... [Mi Nov 4 2009] [20:30:30] es sind ja zwei Aufgaben: [Mi Nov 4 2009] [20:30:43] einmal Platz schaffen für die Taskspezifischen Dinge [Mi Nov 4 2009] [20:30:43] Hm. Wenn ich mich recht erinnere, dann kotzt tlist aber nach einem reset. Irgendwas scheint im RAM verloren zu gehen. [Mi Nov 4 2009] [20:30:57] und zum anderen den Platz mit was sinnvollem füllen [Mi Nov 4 2009] [20:31:14] und dann den Task laufen zu lassen. [Mi Nov 4 2009] [20:31:31] Allozieren beim Einschalten ist definitiv falsch [Mi Nov 4 2009] [20:31:39] Ich habs mir notiert. [Mi Nov 4 2009] [20:31:40] Ok. [Mi Nov 4 2009] [20:31:57] Braucht's dann den Aufruf von "activate" auch nur einmal? [Mi Nov 4 2009] [20:32:16] ja [Mi Nov 4 2009] [20:33:52] nachdem ich den "job" definiert habe, der das activate enthält, ist dann genügend info abgelegt? Ich muß doch den "job" einmal aufrufen. Muß ich das nach dem reset nicht neut? [Mi Nov 4 2009] [20:34:12] neut=neu. [Mi Nov 4 2009] [20:34:23] Nicht so ganz, da in TASK ja auch noch die ganze user area initialisiert wird. [Mi Nov 4 2009] [20:34:52] Das ist zumindest für das ganze IO Geraffel nicht unwichtig [Mi Nov 4 2009] [20:35:14] Hm. Werd nochmal ein wenig experimentieren. [Mi Nov 4 2009] [20:35:53] Du kannst ja mal probeweise TASK aufteilen [Mi Nov 4 2009] [20:36:07] Ein Teil alloziert die Speicher (USER, die Stacks) [Mi Nov 4 2009] [20:36:21] der andere Teil füllt die Speicher mit Inhalt (USER) [Mi Nov 4 2009] [20:36:32] Und nur den letzteren dann in turnkey verwenden [Mi Nov 4 2009] [20:37:42] Aha. Mal sehen ... [Mi Nov 4 2009] [20:38:11] ich werd das auch mal angehen. Ich weiss nur noch nicht wann [Mi Nov 4 2009] [20:39:50] Keine Eile. [Mi Nov 4 2009] [20:41:49] Wenn ich ACTIVATE ansehe, dann wäre das letzte Wort (task-awake) der Kandidat zum rausnehmen und nach turnkey verschieben ... [Mi Nov 4 2009] [20:43:19] ich denke ACTIVATE kann so bleiben, auch innerhalb von turnkey sollte es keine Probleme machen [Mi Nov 4 2009] [20:44:20] Schließlich habe ich den Multitasker nur geklaut, da mag ich nicht allzuviel vom Konzept verändern [Mi Nov 4 2009] [20:45:27] Aber turnkey-fähig sollte er schon werden. [Mi Nov 4 2009] [20:45:49] In gforth-ec für den r8c gab's auch 'n bi-tasker. Der konnte nur 2 tasks. Das war völlig ausreichend. Aber ehrlich gesagt hab ich den code keinen Millimeter verstanden. Sorry Bernd. [Mi Nov 4 2009] [20:47:22] Dabei ist der Code doch nur ein paar Zeilen lang ;-) [Mi Nov 4 2009] [20:47:26] vielleicht muß ich beim Starten (turnkey) zuerst nachsehen, ob's schon tasks hat, (in tlist klauen gehen) und dann entsprechend reagieren. [Mi Nov 4 2009] [20:48:09] Ja, der was so kurz, daß es mit total fasziniert, daß aus den 10 Zeilen ein 2-tasker resultiert. [Mi Nov 4 2009] [20:48:26] Soll ich die paar Zeilen mal erklären? [Mi Nov 4 2009] [20:48:41] Variable bgtask ram $20 cells allot rom [Mi Nov 4 2009] [20:48:47] Jo. [Mi Nov 4 2009] [20:49:00] Hier habe ich eine Variable und dann 32 Zellen im RAM - 16 für Stack, 16 für Returnstack [Mi Nov 4 2009] [20:49:14] User-Variablen kennt Gforth EC nicht. [Mi Nov 4 2009] [20:49:26] :noname bgtask @ 0= ?EXIT [Mi Nov 4 2009] [20:49:26] rp@ bgtask @ sp@ cell+ bgtask ! sp! rp! ; [Mi Nov 4 2009] [20:49:26] IS pause [Mi Nov 4 2009] [20:49:37] Die drei Zeilen definieren PAUSE. [Mi Nov 4 2009] [20:49:47] Ich gucke mir also erst mal an, ob überhaupt etwas in bgtask steht. [Mi Nov 4 2009] [20:49:57] Wenn 0, dann gibt es keinen zweiten Task - PAUSE fertig. [Mi Nov 4 2009] [20:50:11] Sonst lege ich den aktuellen Return-Stack-Wert auf den Daten-Stack [Mi Nov 4 2009] [20:50:25] hole mir aus bgtask den Datenstackpointer des 2. Tasks [Mi Nov 4 2009] [20:50:43] Und speichere den Datenstackpointer des aktuellen Tasks in bgtask wieder ab. [Mi Nov 4 2009] [20:51:03] Dann setze ich den Daten-Stack, und finde auf dem dann auch gleich die richitge Adresse für den Return-Stack. [Mi Nov 4 2009] [20:51:17] Task-Wechsel erledigt, und in bgtask ist jetzt der andere Task gespeichert. [Mi Nov 4 2009] [20:51:34] Ok, nun: Task anlegen: [Mi Nov 4 2009] [20:51:37] : task r> bgtask $20 cells + ! [Mi Nov 4 2009] [20:51:37] bgtask $20 cells + bgtask $10 cells + ! [Mi Nov 4 2009] [20:51:37] bgtask $10 cells + bgtask ! ; [Mi Nov 4 2009] [20:51:52] Du "verschiebst" also quasi die Anfangsadressen der beiden stacks? [Mi Nov 4 2009] [20:52:01] Ja. [Mi Nov 4 2009] [20:52:20] Die aktuellen Adressen der Top-of-Stacks. [Mi Nov 4 2009] [20:52:32] ok. [Mi Nov 4 2009] [20:52:43] Beim Anlegen des Tasks finde ich auf dem Return-Stack eine Adresse zum Weitermachen. [Mi Nov 4 2009] [20:52:58] Die speichere ich ganz unten auf dem Returnstack des Hintergrundtasks ab. [Mi Nov 4 2009] [20:53:35] Diese Returnstack-Adresse kommt ganz unten auf den Datenstack des Hintergrundtasks, weil wir sie dort brauchen, wenn wir mit PAUSE hinwechseln. [Mi Nov 4 2009] [20:53:54] Und diese Datenstackadresse kommt in bgtask selbst, weil das ja der Datenstack des Hintergrundprozesses ist. [Mi Nov 4 2009] [20:53:57] Feddisch. [Mi Nov 4 2009] [20:54:18] Fehlt nur noch, dass KEY nicht einfach wartet, sondern PAUSE bedient: [Mi Nov 4 2009] [20:54:20] :noname echo @ IF [Mi Nov 4 2009] [20:54:20] BEGIN pause key? UNTIL THEN (key) ; [Mi Nov 4 2009] [20:54:20] is key [Mi Nov 4 2009] [20:54:51] Wenn echo ausgeschaltet ist (Upload von Programmen), dann wird der Hintergrundtask aus Performancegründen übergangen. [Mi Nov 4 2009] [20:55:10] Schließlich hat Gforth R8C keinen Flow-Control auf der seriellen Schnittstelle. [Mi Nov 4 2009] [20:56:25] der Multitasker von amforth arbeitet grundsätzlich genauso [Mi Nov 4 2009] [20:56:38] Wer malt jetzt noch ein Bildchen zur Darstellung der Datenstruktur und stellt die Erklärung ins Forth-eV-Wiki? [Mi Nov 4 2009] [20:57:04] hat nur eine zirkuläre Liste von Tasks und kann für jeden Task entscheiden, ob der aufgerufen wird oder übersprungen wird [Mi Nov 4 2009] [20:57:14] In den $20 Zellen wohnt genau was? die ganzen Daten-Rstacks? [Mi Nov 4 2009] [20:57:24] Das Stackgezauber ist fast das gleiche [Mi Nov 4 2009] [20:57:24] Ja, die ganzen Stacks. [Mi Nov 4 2009] [20:57:32] Heißt das die sind jeweils $10 Zellen tief? [Mi Nov 4 2009] [20:57:36] Ja. [Mi Nov 4 2009] [20:57:38] Das reicht. [Mi Nov 4 2009] [20:57:51] Nicht schlecht. [Mi Nov 4 2009] [20:58:48] In meinen mehr-als-2-Tasks-Multitasker habe ich eine doppelt verlinkte Liste [Mi Nov 4 2009] [20:59:02] und hänge die schlafenden Tasks in eine zweite derartige Liste aus. [Mi Nov 4 2009] [20:59:22] Dann muss man nicht gucken, sondern kann jeden Task der aktiven Liste direkt ausführen. [Mi Nov 4 2009] [20:59:36] Matthias: werden da nicht noch die ganzen emit .. key XTs gespeichert, damit das mit der Umleitung pfunzzt? [Mi Nov 4 2009] [20:59:38] Von Linux geklaut? ;=) [Mi Nov 4 2009] [21:00:01] Das hatte ich schon, da hat Linus in seinem Schlafzimmer noch mit dem Sinclair QL gearbeitet. [Mi Nov 4 2009] [21:00:33] ROTFL. das war der neueste Schrei beim Task Scheduling neulich (also vor ein paar Jahren) [Mi Nov 4 2009] [21:00:38] Und laut seiner Biographie Forth ausprobiert und nicht verstanden ;-) [Mi Nov 4 2009] [21:01:01] @Erich: ja [Mi Nov 4 2009] [21:01:24] Aber da wollte ich auch noch etwas optimieren, was die Initialisierung der USER Area angeht [Mi Nov 4 2009] [21:01:26] Die Linuxer haben das Problem der Fairness. [Mi Nov 4 2009] [21:01:53] Wenn die Programme nicht kooperativ sind, muss man denen die Rechenzeit fair zuteilen. [Mi Nov 4 2009] [21:02:14] Dann glaube ich auch zu verstehen, daß der Hintergrundstask in gforth-r8c munter auf meine serielle Schnittstelle gemalt hat. War zwar u.U. ein wenig durcheinander, aber ganz schmerzfrei zu benutzen. [Mi Nov 4 2009] [21:03:15] Taskwechsel zu organisieren ist nicht einfach [Mi Nov 4 2009] [21:03:17] Fairness: deswegen heißt der neuste scheduler Versuch auch "brain fuck scheduler", oddrrr? [Mi Nov 4 2009] [21:03:25] Ja. [Mi Nov 4 2009] [21:03:26] ;-) [Mi Nov 4 2009] [21:03:45] So schwierig ist das aber eigentlich nicht: Fairness besteht aus Accounting und Gewichtung. [Mi Nov 4 2009] [21:03:49] Ich habe mal damit expermentiert, den Taskwechsel als Timer Interrupt zu machen [Mi Nov 4 2009] [21:04:02] Also man muss bei jedem Taskwechsel aufschreiben, wie lang der vorherige Task dran war. [Mi Nov 4 2009] [21:04:17] Also nicht beim warten auf IO sondern in (groben) Zeitscheiben [Mi Nov 4 2009] [21:04:45] Aber sonst unverändert (quasi pause in den Strom der Forth Worte eingesteut [Mi Nov 4 2009] [21:04:47] Auch beim Warten auf IO. [Mi Nov 4 2009] [21:05:05] ging gut [Mi Nov 4 2009] [21:05:21] Naja, die paar Tasks, die ein Mikrocontroller so fährt... [Mi Nov 4 2009] [21:05:31] Die braucht man nicht fair verteilen. [Mi Nov 4 2009] [21:06:05] Im Grunde kann man ein interaktives System eigentlich ganz problemlos ordentlich hinkriegen: [Mi Nov 4 2009] [21:06:37] Jeder Task, der innerhalb der ihm zugeteilten Zeitscheibe von sich aus die CPU wieder freigegeben hat ist kooperativ und wird bevorzugt bedient. [Mi Nov 4 2009] [21:06:54] Alle anderen, die bis zum Timeout gerechnet haben, sind nicht kooperativ, und landen weiter unten in der Liste. [Mi Nov 4 2009] [21:07:56] Meist gibt es aber einen Grund, warum die Zeitscheiben ausgeschöpft werden [Mi Nov 4 2009] [21:08:13] Für Batch-Prozesse schon. [Mi Nov 4 2009] [21:08:28] Der Taskwechsel, wenn IO noch nicht fertig ist, ist eher die Ausnahme [Mi Nov 4 2009] [21:09:00] Und einen Terminal Task, der nur deswegen hoch priorisiert ist, weil er oft abgibt..... [Mi Nov 4 2009] [21:09:21] Aber ich hatte schon mal drüber nachgedacht, die ganzen Interrupts als Task anzulegen [Mi Nov 4 2009] [21:09:46] trifft die Interruptbedingung ein, gehts zeitnah los, sonst weiter mit dem nächsten Task [Mi Nov 4 2009] [21:10:05] So eine Art Mischung aus Poll und Int [Mi Nov 4 2009] [21:10:38] Blöd nur, wenn es >>30 Interrupts gibt. Das koscht RAM [Mi Nov 4 2009] [21:10:42] Die interrupts werden aber erst beim nächsten pause bedient? [Mi Nov 4 2009] [21:10:51] aj [Mi Nov 4 2009] [21:11:33] Man kann PAUSE aber auch in den Inneren Interpreter integrieren [Mi Nov 4 2009] [21:11:41] Interessantes Konzept. Wassesallesgibbt. [Mi Nov 4 2009] [21:12:25] Ist aber noch unausgereift. Und mit dem aktuellen amforth vermutlich auch nicht sonderlich hübsch umzusetzen [Mi Nov 4 2009] [21:12:40] Ach ja, Ideen gibts viele... [Mi Nov 4 2009] [21:13:27] Bei Linux teilt man Interrupts in zwei Teile: ein Teil wird sofort ausgeführt, und der Rest dann in einen Task ausgelagert. [Mi Nov 4 2009] [21:13:36] Bernd: den 2-tasker abschalten heißt pause und key wieder auf die alte Funktion biegen, oddrrr? [Mi Nov 4 2009] [21:13:55] Einfach bgtask off [Mi Nov 4 2009] [21:14:03] Dann ist er abgeschaltet. [Mi Nov 4 2009] [21:14:09] @Bernd: Von da habe ich auch miene Inspiration bekommen [Mi Nov 4 2009] [21:15:28] aber ich lass euch jetzt alleine [Mi Nov 4 2009] [21:15:33] bis neulich dann [Mi Nov 4 2009] [21:15:34] Ciao [Mi Nov 4 2009] [21:15:38] Ciao. [Mi Nov 4 2009] [21:15:39] Verlassen MatthiasT3 hat den Kanal verlassen. [Mi Nov 4 2009] [21:16:09] So schnell geht die Zeit rum. Danke für die Erklärung. [Mi Nov 4 2009] [21:16:43] Dein tasker wohnt komplett im RAM, und savesystem sichert die Werte und stellt sie wieder her. So war's doch oder? [Mi Nov 4 2009] [21:16:50] Ja. [Mi Nov 4 2009] [21:17:05] user variablen, das ist doch auch ein RAM Bereich ... [Mi Nov 4 2009] [21:17:18] Klar. [Mi Nov 4 2009] [21:17:26] Würde auch "einfach so" funktionieren. [Mi Nov 4 2009] [21:17:34] Dann müsste das ja mit minimalen Modifikationen laufen. [Mi Nov 4 2009] [21:18:08] echo weiß ich nicht, ob's das hat. Na, das ist doch ein Experiment für einen verregneten Sonntag :-) [Mi Nov 4 2009] [21:18:18] Schneit's bei Euch schon??? [Mi Nov 4 2009] [21:18:43] Die Schilde sind heruntergefahren ;-) [Mi Nov 4 2009] [21:19:07] Aber draußen scheinen noch Sterne. [Mi Nov 4 2009] [21:19:27] Na dann. Fahren wir wieder auf den LinuxTag? 9.-12.6.2010 [Mi Nov 4 2009] [21:19:51] Denk schon. [Mi Nov 4 2009] [21:19:58] Das letzte Mal war sehr erfolgreich. [Mi Nov 4 2009] [21:20:35] Graben wir den Trizeps nochmal aus, oder gibt's was Neues? [Mi Nov 4 2009] [21:22:41] Bislang gibt's noch nix Neues. [Mi Nov 4 2009] [21:23:54] Mal sehen ob ich meinen Hausbus zum Leben erwecken kann. Das wär 'ne echte Weiterentwicklung im Vergleich zum letzten Mal. [Mi Nov 4 2009] [21:24:24] Na gut. Dann bis demNeXT. Mach's gut. [Mi Nov 4 2009] [21:24:28] Ciao. [Mi Nov 4 2009] [21:24:32] Ciao! [Mi Nov 4 2009] [21:24:37] Verlassen erwaelde hat den Kanal verlassen (.).