MemoryBlock

Ein MemoryBlock ist ein Speicherbereich im Arbeitsspeicher (SRAM), genauer ein Speicher-Objekt im dynamisch verwalteten Speicherbereich von LunaAVR. Beim Erzeugen eines MemoryBlock wird die gewünschte Anzahl Bytes im Arbeitsspeicher reserviert und kann dann zur Speicherung von beliebigen Daten verwendet werden.

Der Zugriff auf den MemoryBlock bzw. dessen Daten darf ausschließlich nur über die Objekt-Methoden erfolgen, da ein MemoryBlock dynamisch im Speicher verwaltet wird.

Um einen MemoryBlock zu erzeugen, dimensioniert man eine Variable vom Typ MemoryBlock und ruft die „New“-Methode mit der gewünschten anzahl Bytes als Parameter auf. Die maximale Größe eines MemoryBlocks beträgt 65 kb.

Erzeugen eines neuen MemoryBlock

ACHTUNG! Ab Version 2013.r6 korrekte objektorientierte Notation:

dim myvar as MemoryBlock
myvar = New MemoryBlock(numBytes)

Freigabe eines MemoryBlock

Die Freigabe eines Speicherblocks erfolgt automatisch bei Zuweisung eines neuen Speicherblocks, sowie beim Verlassen einer Methode, außer es handelt sich um eine globale Variable, eine Referenz („byRef“-Parameter) oder eine statische Variable („dim x as static …“). Code-Beispiele zur Erläuertung siehe unten.

Methoden/Eigenschaften

Methoden (aufrufen)
Name Beschreibung
.New(length)1) Neuen MemoryBlock allozieren und zuweisen, ein vorhandener Block wird freigegeben.
.Free2) Ein vorhandener Block wird freigegeben.
  • length: zu allozierende Anzahl Bytes
Methoden (nur lesen)
Name Beschreibung Rückgabetyp
.Addr Adresse der Variable im Arbeitsspeicher word
.Ptr Adresse des zugewiesenen Speicherblocks im Arbeitsspeicher word
.Size3) Gesamtanzahl Bytes (Größe) des allozierten Speicherblocks. word
Methoden (lesen und schreiben)
Name Beschreibung Rückgabetyp
.ByteValue(offset) Byte lesen/schreiben byte
.WordValue(offset) Word lesen/schreiben word
.IntegerValue(offset) Integer lesen/schreiben integer
.Int24Value(offset)4) int24 lesen/schreiben int24
.Uint24Value(offset)5) uint24 lesen/schreiben uint24
.LongValue(offset) Long lesen/schreiben long
.LongIntValue(offset)6) LongInt lesen/schreiben longint
.SingleValue(offset) Single lesen/schreiben single
.StringValue(offset,bytes) String lesen/schreiben mit Längenvorgabe string
.PString(offset) Pascal-String lesen/schreiben (Start-Byte ist Länge) string
.CString(offset) C-String lesen/schreiben (Nullterminiert) string
  • offset: Byte-Position innerhalb der Struktur mit Basis Null.
  • bytes: Anzahl zu lesender Bytes.

Hinweis

  • Der Zugriff über die Objektgrenzen hinaus ist ohne deklarierte Exception möglich und wird nicht geprüft (schneller).

Siehe auch: Speicherverwaltung, Sram, Dump

dim a as byte
dim s as string
dim m as MemoryBlock
 
m = New MemoryBlock(100) ' MemoryBlock erzeugen und zuweisen, Ggf. vorhandener Block wird freigeben
if m <> nil then                     ' prüfen ob der Speicherblock alloziert wurde
  m.ByteValue(0)=7                   ' Byte schreiben
  m.CString(1)="Ich bin ein String"  ' String schreiben
 
  a=m.ByteValue(0) ' Byte lesen, Ergebnis: 7
  s=m.CString(1)   ' C-String lesen, Ergebnis: "Ich bin ein String"
 
  m=nil           ' Objekt und belegten Speicher freigeben
end if
procedure test(m as MemoryBlock)
  'm ist byVal und wird nach Verlassen zerstört
endproc
procedure test()
  dim m as MemoryBlock
  'm ist byVal und wird nach Verlassen zerstört
endproc
procedure test(byRef m as MemoryBlock)
  'm ist byRef und bleibt unangetastet
endproc
dim m as MemoryBlock
 
procedure test()
  'm gehört nicht der Methode und bleibt unangetastet
  'Grund:  
  'Sichtbarkeit von globalen Variablen in Methoden solange keine eigene
  'Variable gleichen Namens in der Methode erzeugt wurde
endproc
function test(byRef m as MemoryBlock) as MemoryBlock
  'm ist byRef und bleibt unangetastet
  return m 'es wird eine Instanz von m erzeugt
endfunc
function test() as MemoryBlock
  dim m as MemoryBlock  
  return m 'der Speicherblock wird von "m" dereferenziert (losgelöst) und zurückgegeben
endfunc
1) bis Version 2013.r5
2) bis Version 2014.r2.4, obsolet ab Version 2015.r1: Definiertes Freigeben durch Zuweisung von nil, Sonstige automatisch.
3) Ab Version 2013.r4
4) , 5) , 6) ab Version 2014.r1.8