Falls ein paar Tipps hilfreich sind, stehe ich gerne zur Verfügung.
Einige der Ausdrücke in C existieren auch in luna, beispielsweise BitShift mit << und >>.
Die Portierung von C-Source ist möglich, zum Großteil wird der geschriebene Code kürzer, beispielsweise beim setzen von Portpins.
Auch ist es sinnvoll in solchen Fällen eine entsprechende Klasse anzulegen, um den Code modular aufzubauen.
Ein gutes Beispiel hierfür sind die Klassen zur Ansteuerung von SD-Karten mit FAT32 und langen Dateinamen.
Zu beachten ist, dass in luna im Unterschied zu C ein anderes Parameterkonzept für Methoden verwendet wird. D.h. Variablen/Arrays und Strukturen befinden sich in einem geschlossenen Namensraum, sodass die Übergabe von referenzierten Variablen oder Arrays in der Regel nicht notwendig ist. Die Implementation ist jedoch zusätzlich geplant.
Beispiel:
in vielen C-Funktionen werden Buffer-Arrays als Referenz/Zeiger übergeben:
Code:
uint8_t recv_str(char *buf, uint8_t size) { .. }
in luna erstellt man für die meisten Anwendungen bestenfalls eine Klasse, in welcher globale Arrays Klassenweit verfügbar sind. Hierdurch ist eine Referenzübergabe nicht notwendig, da es auf das Selbe hinausläuft:
Code:
class USB
dim buf(31) as byte
function recv_str(size as byte) as byte
dim i as byte
if size then
for i=0 to size
buf(i) = readByte()
next
return 1 ' success
endif
return 0 ' failed
endfunc
function readByte() as byte
return [...]
endfunc
endclass
aus dem Hautprogramm ist der Buffer ebenfalls über die Klasse erreichbar:
Einfacher ist es jedoch, man nutzt die dynamische Speicherverwaltung in luna und damit die Möglichkeit dynamische Datenlängen einzulesen:
Code:
class USB
function recv_str(size as byte) as string
dim i as byte
dim s as string
if size then
s = spc(size) ' buffer erzeugen (schneller wenn Speicherbereich bereits angelegt)
for i=1 to size
s.ByteValue(i) = readByte()
next
endif
return s
endfunc
function readByte() as byte
return [...]
endfunc
endclass
Man benötigt prinzipiell also keinen Byte-Buffer für das Einlesen von Strings, sondern überlässt das der Speicherverwaltung.
Bei großen, festen Blöcken wie im Beispiel der SD-Karten-Sektoren und -Daten ist es demgegenüber dann natürlich sinnvoller und schneller einen innerhalb der Klasse globalen Speicherbereich zu allozieren. Hierfür gibt es die MemoryBlocks, auf die dann alle möglichen Zugriffe vorgenommen werden können.
Gruß, rgf
Lesezeichen