Der Heap-Manager benötigt bei der Verwaltung von <=64kB 2(3)bytes und bis 4GB 4(5)bytes Overhead je Eintrag (je nachdem ob MEM_CleanUp eingebunden wurde).
Desweiteren kann er RAM und EE-PROM parallel verwalten und stellt für den EE-PROM Speicher über das Port HW-unabhängige Zugriffswerkzeuge zur Verfügung.
User-Functions:
Memory-Manager: | |
MEM_Init | Initialisierung des Heap-Managers |
MEM_Alloc | Allokieren von Speicher |
MEM_Free | Freigeben eines allokierten Speichers |
MEM_Resize | Größe von allokiertem Speicher ändern |
Heap_Write_EE | auf allokiertem EEPROM-Heap schreiben |
Heap_Fill_EE | allokierten EEPROM-Heap füllen |
optional |
|
MEM_CleanUp | Freigeben aller von einen Task allokiertem Speicherelemente |
Error-Codes:
|
Name |
Decimal_Value |
Description |
MEM_NO_ERR | 0 | no error |
MEM_WR_PTR | 120 | Pointer is not in the storage area or not allocated or no valid entry into this address |
MEM_OVF | 121 | memory pool fully |
MEM_ERR | 122 | error in the memory management |
Initialisiert den Heap-Manager. Sollte der EE-Heap als unformatiert erkannt werden, so wird dieses durchgeführt.
Diese Funktion muß vor allen anderen Heapdiensten bei der Systeminitialisierung einmal aufgerufen werden.
Bei Nutzung des Linux-HOSTs wird vor dem EE-Formattest versucht ein bestehendes Heap-IMAGE für die EE-Simulation aus einer Linux-Datei zu laden.
none
MEM_NO_ERR
erfolgreich initialisiert
MEM_ERR
Fehler innerhalb der Speicherverwaltung
MEM_INVALID
EE-IMAGE ungültig (nur bei Linux-HOST)
void main(void) { U08 returnOk; . returnOk=MEM_Init(); . . }
Nur bei Nutzung des Linux_HOSTs
Sichert den EE-Heap als IMAGE in eine Linux-Datei.
none
MEM_NO_ERR
erfolgreich gesichert
...
...
void main(void) { U08 returnOk; . returnOk=MEM_Init(); . . returnOk=MEM_Flush(); }
Allokiert den angegebenen Speicher im geforderten Speichertyp (RAM/EE) und gibt die Startadresse zurück.
size
size of array in bytes
type
type of Memory (0=RAM / 1=EE)
Ist die zurückgegebene Addresse gleich NULL, so kann mittels MEM_GetErrno() nachfolgend der FehlerCode abgeholt werden.
MEM_OVF
Speicher voll
MEM_ERR
Fehler innerhalb der Speicherverwaltung
void main(void) { U08 returnOk; U08 OS_HUGE *ptr; . returnOk=MEM_Init(); . ptr=MEM_Alloc(100, MEM_RAM); if(ptr==NULL) { returnOk=MEM_GetErrno(); } . . }
Gibt den allokierten Speicher wieder frei. Der Speichertyp (RAM/EE) wird dabei selbst ermittelt.
Zur Freigabe wird versucht diesen frei werdenen Speicherbereich an einen freien Speicher direkt dahinter und wenn vorhanden, an einen freien Speicher direkt davor, zu hängen. (Defragmentierung)
*ptr
pointer of array (from MEM_Alloc)
MEM_NO_ERR
Speicher freigegeben
MEM_WR_PTR
Zeiger nicht im Speicherbereich oder nicht allokiert oder kein gültiger Eintrag unter dieser Adresse
MEM_ERR
Fehler innerhalb der Speicherverwaltung
void main(void) { U08 returnOk; U08 OS_HUGE *ptr; . returnOk=MEM_Init(); . ptr=MEM_Alloc(100, 0); if(ptr==NULL) { returnOk=MEM_GetErrno(); } else { . . returnOk=MEM_Free(ptr); } . . }
Gibt allen allokierten Speicher des angegebenen Tasks der Priorität prio wieder frei. Die jeweiligen Speichertypen (RAM/EE) werden dabei selbst ermittelt.
prio
priority of task to free
MEM_NO_ERR
Speicher freigegeben
MEM_ERR
Fehler innerhalb der Speicherverwaltung
OS_PRIO_INVALID
die Priorität ist größer OS_MAX_TASK
OS_TASK_SUSP_PRIO
unter dieser Priorität ist kein Task eingetragen
void OS_TaskDelete(void) { U08 returnOk, prio; OS_Lock(); prio = OSTCBCur->OSTCBPrio; returnOk=MEM_CleanUp(prio); OS_ENTER_CRITICAL(); OS_Unlock(); . . }
Vergrößert oder Verkleinert den allokierten Speicher und gibt die neue Startadresse zurück.
Dabei wird beim Vergrößern versucht, einen möglichen freien Speicher direkt hinter diesem Eintrag, und wenn dieser noch nicht ausreicht, einen möglichen freien Speicher genau vor diesem Eintrag zu verwenden. (Defragmentierung)
Nur wenn dieses nicht ausreicht, wird mittels MEM_Alloc ein neuer Bereich allokiert und der alte nach erfolgtem Datenkopierens mittels MEM_Free freigegeben.
*ptr
pointer of array (from MEM_Alloc)
newsize
new size of array in bytes
Ist die zurückgegebene Addresse gleich NULL, so kann mittels MEM_GetErrno() nachfolgend der FehlerCode abgeholt werden.
MEM_OVF
Speicher voll
MEM_WR_PTR
Zeiger nicht im Speicherbereich oder nicht allokiert oder kein gültiger Eintrag unter dieser Adresse
MEM_ERR
Fehler innerhalb der Speicherverwaltung
void main(void) { U08 returnOk; U08 OS_HUGE *ptr; U08 OS_HUGE *ptr_new; . returnOk=MEM_Init(); . ptr=MEM_Alloc(100, 0); if(ptr==NULL) { returnOk=MEM_GetErrno(); } else { ptr_new=MEM_Resize(ptr, 150); if(ptr_new==NULL) { returnOk=MEM_GetErrno(); . returnOk=MEM_Free(ptr); } else { . . returnOk=MEM_Free(ptr_new); } } . . }
Schreibt length Bytes von *source nach *dest ins EE-PROM unter Beachtung der HW-Spezifika.
*source
source pointer (not in EE-PROM)
*dest
destination pointer into EE-PROM
length
bytes to write
MEM_NO_ERR
Speicher geschrieben
MEM_WR_PTR
source-pointer zeigt ins EE-PROM
MEM_ERR
Fehler innerhalb der Speicherverwaltung
void main(void) { U08 returnOk; U16 var1; U08 OS_HUGE *ptr; . returnOk=MEM_Init(); . ptr=MEM_Alloc(sizeof(U16), MEM_EE); // alloc EE-PROM if(ptr==NULL) { returnOk=MEM_GetErrno(); } else { var1 = 4125; returnOk=Heap_Write_EE(&var1, ptr, sizeof(U16)); } . . }
Füllt den angegebenen EE-PROM Bereich mit value unter Beachtung der HW-Spezifika.
*dest
destination pointer into EE-PROM
length
bytes to fill
value
byte to fill with it
MEM_NO_ERR
Speicher geschieben
MEM_WR_PTR
dest-pointer zeigt nicht ins EE-PROM
MEM_ERR
Fehler innerhalb der Speicherverwaltung
void main(void) { U08 returnOk; U08 OS_HUGE *ptr; . returnOk=MEM_Init(); . ptr=MEM_Alloc(20, MEM_EE); // alloc EE-PROM if(ptr==NULL) { returnOk=MEM_GetErrno(); } else { returnOk=Heap_Fill_EE(ptr, 20, 0x55); . . } . }