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 | Freigeben eines allokierten Speichers |
MEM_OVF | 121 | Pointer is not in the storage area or not allocated or no valid entry into this address |
MEM_ERR | 122 | error in the memory management |
allgemeines
MEM_Init
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.
Parameters
none |
Return Value
MEM_NO_ERR | erfolgreich initialisiert |
MEM_ERR | Fehler innerhalb der Speicherverwaltung |
MEM_INVALID | EE-IMAGE ungültig (nur bei Linux-HOST) |
Example
MEM_Flush
Nur bei Nutzung des Linux_HOSTs.
Sichert den EE-Heap als IMAGE in eine Linux-Datei.
Parameters
none |
Return Value
MEM_NO_ERR | erfolgreich initialisiert |
... | ... |
Example
MEM_Alloc
Allokiert den angegebenen Speicher im geforderten Speichertyp (RAM/EE) und gibt die Startadresse zurück.
Parameters
size | size of array in bytes |
type | type of Memory (0=RAM / 1=EE) |
Return Value
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 |
Example
MEM_Free
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)
Parameters
*ptr | pointer of array (from MEM_Alloc) |
Return Value
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 |
Example
MEM_CleanUp
Gibt allen allokierten Speicher des angegebenen Tasks der Priorität prio wieder frei. Die jeweiligen Speichertypen (RAM/EE) werden dabei selbst ermittelt.
Parameters
prio | priority of task to free |
Return Value
MEM_NO_ERR | Speicher freigegeben |
OS_PRIO_INVALID | die Priorität ist größer OS_MAX_TASK |
OS_TASK_SUSP_PRIO | unter dieser Priorität ist kein Task eingetragen |
MEM_ERR | Fehler innerhalb der Speicherverwaltung |
Example
MEM_Resize
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.
Parameters
*ptr | pointer of array (from MEM_Alloc) |
newsize | new size of array in bytes |
Return Value
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 |
Example
EE-Heap Access
Heap_Write_EE
Schreibt length Bytes von *source nach *dest ins EE-PROM unter Beachtung der HW-Spezifika.
Parameters
*source | source pointer (not in EE-PROM) |
*dest | destination pointer into EE-PROM |
length | bytes to write |
Return Value
MEM_NO_ERR | Speicher geschrieben |
MEM_WR_PTR | source-pointer zeigt ins EE-PROM |
MEM_ERR | Fehler innerhalb der Speicherverwaltung |
Example
Heap_Fill_EE
Füllt den angegebenen EE-PROM Bereich mit value unter Beachtung der HW-Spezifika.
Parameters
*dest | destination pointer into EE-PROM |
length | bytes to fill |
value | byte to fill with it |
Return Value
MEM_NO_ERR | Speicher geschrieben |
MEM_WR_PTR | dest-pointer zeigt nicht ins EE-PROM |
MEM_ERR | Fehler innerhalb der Speicherverwaltung |
Example