Die Hausaufgabe besteht diesmal aus zwei unabhängigen Teilen. Such Dir heraus, was Dich interessiert und Dir Spass macht.
Eine mögliche Lösung zu der Hausaufgabe vom 10. August findest Du unter https://gist.github.com/cstrotm/00c96d36391668fa169a076b227bc23a
Zwischenergebnisse und auch diesen Text findest Du auf meiner Github-Gist Seite unter https://gist.github.com/cstrotm
Aufgabe 1) mit Mecrisp Quintus
Erstelle eine Applikation, welche Daten (z.B. von der seriellen
Schnittstelle) liest und auf die SD-Karte schreibt. Benutze dabei den
Treiber für die SD-Karte mit dem Namen mysdcard.fs
in der Nextcloud
unter Forth-lernen/mysdcard.fs
:
https://cloud.forth-ev.de/s/PQrT8PQ9wxjokXi
(@Martin: ist dies die korrekte Datei mit dem Treiber für die SD-Karte?)
Optional: Implementiere auf Basis des Treibers das ‘Block words’ und ‘Block extension words’ Wortset (ich werde das machen und, wenn es klappt, vor dem Wochenende auf meiner Github-Gist Seite veröffentlichen) https://forth-standard.org/standard/block
Die Block-Wörter der Forth-Standards implementieren ein
Virtual-Memory Model, welches das Arbeiten mit einem Datenträger ohne
den Overhead eines Dateisystems vereinfacht (sobald die
Dateisystem-Implementierung für die SD-Karte im Logan-Nano stabil ist
werden wir auch die Dateisystemzugriffe benutzen). Schreibzugriffe
sind beim Block-IO “implizit”, immer dann wenn ein neuer Block in den
Speicher geladen werden soll, dann wird ein ggf. geänderter Block
vorher gesichert. Über das Wort flush
kann aber das Schreiben eines
geänderten Blocks erzwungen werden.
Ein weiteres Wort sollte die Daten von der SD-Karte in einer sinnvollen Art auf dem Bildschirm ausgeben.
Weiterführende Idee: Implementiere ein einfaches Dateisystem auf Basis des Block-IO. Beispiel: https://github.com/forth-ev/VolksForth/blob/master/sources/cpm/simpfile.fth
Aufgabe 2) mit GForth
Recheriere über die Implementation von verketteten Listen unter Forth. Anbei eine (unvollständige) Liste von Texten und Implementationen
- List Library: http://www-personal.umich.edu/~williams/archive/forth/lists/
- Simple linked list implementation in Forth https://gist.github.com/niconii/2e2857fb062f46abc164a2cb73db782b
- Linked Lists in GForth https://github.com/forthy42/gforth/blob/master/list.fs
- GForth Listen sind mit Structs implementiert https://github.com/forthy42/gforth/blob/master/struct.fs
- Dokumentation von GForth Structs https://www.complang.tuwien.ac.at/forth/gforth/Docs-html/Structures.html#Structures
- execution chains for gforth https://github.com/forthy42/gforth/blob/master/chains.fs
- Rosettacode Implementierung: https://rosettacode.org/wiki/Singly-linked_list/Element_definition#Forth
- Rosettacode Singly-linked list/Element insertion https://rosettacode.org/wiki/Singly-linked_list/Element_insertion#Forth
Schreibe eine einfache Implementation einer verketteten Liste.
Optional: benutze dynamische Speicherverwaltung (allocate, free): https://forth-standard.org/standard/memory/ALLOCATE
Weiterführende Idee: Implementiere eine eigene Version von
allocate
, free
und resize
, welche mittels Block-IO auf einem
Datenträger arbeitet (und nicht im Hauptspeicher)