ChronOS Memory Management
Inhaltsverzeichnis
Common Settings
Allocation Algorithm
You can choose between two allocation algorithms. System default is the static algorithm.
Const Os_malloc_policy = Os_malloc_policy_static
To use the dynamic TLSF algorithm:
Const Os_malloc_policy = Os_malloc_policy_tlsf
Free RAM start address
Because the start address cannot be calculated with some constants, you have to set this yourself. To do this, check "Show internal variables" in Options->Compiler->Output and look into the compiler report and search for the address of the first byte not occupied by a variable. Obviously this is a very important step, otherwise the values of global variables would be overwritten.
Const Free_ram_start = [address]
Optional: Free RAM End
It is also possible to set the end address of the free memory area yourself, system default is below the stack area.
Const Free_ram_end = [address]
Compiler Report Example
Here is a (shortened) example of a compiler report, and where the address could be found. In this example, the RAM start address should be set to at least 169 dec.
Report : chronos Date : 05-20-2013 Time : 01:54:06 Compiler : BASCOM-AVR LIBRARY V 2.0.7.6 Processor : M32 SRAM : 800 hex EEPROM : 400 hex ROMSIZE : 8000 hex ... -------------------------------------------------------------------------------- Variable Type Address(hex) Address(dec) -------------------------------------------------------------------------------- ... OS_CRITICAL_NESTING_LEVEL Byte 0060 96 OS_EVENT_TASK Word 0061 97 MALLOC_FREE_POINTER Word 0063 99 OS_SCHED_RUNNING_WEIGHT Byte 0065 101 OS_SCHED_LIST_HEAD Word 0066 102 OS_SCHED_PREEMPTED_TASK Word 0068 104 OS_TASK_ACTIVE Word 006A 106 OS_TASK_TEMPBYTE_ISR Byte 006C 108 OS_TASK_TEMPWORD_ISR Word 006D 109 OS_TASK_TEMPWORD2_ISR Word 006F 111 OS_TIMER_SYSTEMTIME Dword 0071 113 OS_TIMER_LISTHEAD Word 0075 117 OS_TIMER_NEXT_EVENT Word 0077 119 OS_TIMER_ELAPSED_TIME Word 0079 121 OS_TIMER_ENABLE_KERNEL Byte 007B 123 OS_INT_TABLE Word (20) 007C 124 TASKOBJECT Word 00A4 164 TASK_1_COUNTER Byte 00A6 166 TASK_2_COUNTER Byte 00A7 167 ___LCDCOUNTER Byte 00A8 168 <--- -------------------------------------------------------------------------------- Constant Value -------------------------------------------------------------------------------- SREG &H3F SPH &H3E SPL &H3D ...
Programming Interface
Request memory from free memory pool:
Dim Object As Word Object = Malloc(Byval Size As Word)
If there is a risk running out of memory (always be aware of that when using a dynamic allocation algorithm), a check if Malloc() returns 0 and a proper error handling is important.
Return memory to the pool:
Free Object