【转】OSAL内存管理0

来源:互联网 发布:虚拟机nat网络配置 编辑:程序博客网 时间:2024/05/29 15:31

【转】OSAL内存管理0

OSAL(operation system abstraction layer)内存管理相关

OSAL的内存分配是在一个堆栈中来实现的。

// Memory Allocation Heap.

#if defined( EXTERNAL_RAM )

static byte *theHeap = (byte *)EXT_RAM_BEG;

#else

static halDataAlign_t _theHeap[ MAXMEMHEAP / sizeof( halDataAlign_t ) ];

static byte *theHeap = (byte *)_theHeap;

#endif

如果用户没有定义内存分配使用的堆栈是外部了存储的单元,则用于内存分配的堆栈是一个系统内部固定长度的一个数组。 此堆栈是一个halDataAlign_t(typedef uint8 halDataAlign_t)结构的数组,它的长度是MAXMEMHEAP/sizeof(halDataAlign_t)。

对于MAXMEMHEAP的定义,它的长度是根据设备功能不同而分配不同长度的堆栈。对于ZIGBEE的协作设备它的长度相对要大一些,而结点设备和中转设备要相对的堆栈长度要小一些,因为协作设备处理的任务要相对繁重一些。

// Internal (MCU) heap size

#if !defined( INT_HEAP_LEN )

#if defined( ZDO_COORDINATOR )

#define INT_HEAP_LEN 4096

#elif defined( RTR_NWK )

#define INT_HEAP_LEN 3072

#else

#define INT_HEAP_LEN 1664

#endif

#endif

// Memory Allocation Heap

#define MAXMEMHEAP INT_HEAP_LEN // Typically, 0.70-1.50K

在进行内存分配的时候都需要使用一个内存分配控制头,在OSAL系统中,内存分配控制头的长度是16bit。它的前15位标示以它开头的内存块的长度, 它的最高位标识的是是否这一个内存块正处于使用状态。

内存分配返回的是一个指向分配区域的指针,指针的长度是内存控制头和内存对齐方式中较大的一个。并且这个长度也是最小分配单元的长度。在些OSAL中它的长度是16bit。

堆栈在开始分配的时候一定要先初使化堆栈, 初使化内存是为了避免内存被提前使用而产生错误。 堆栈的初使化首先把堆栈的最后一个可分配单元置为NULL,即堆栈数组的最后16个位全部置为0,这样做是为了避免分配内存产生溢出。

堆栈的初使化把堆栈初使化成两个不同的分配区域, 一个是固定长度的分配区域, 一个是不固定长度的分配区域。固定分配区域分配的大小是16个BIT。

因为根据程序的概要分析,最大的同时分配的大小是16x18, 如果不进行程序概要分析, 在定时分析系统的开销时,最坏情况里面的最好情况的内存分配大小是232(byte)的长度。所以我们把固定分配区域的长度定义为232(byte)。

在初使化固定长度分配区域的时候,把固定分配区域的长度值赋给固定长度分配区域的第一个可分配单元,即把固定分配区域的第一个分配单元初使化成一个内存分配控制头。它的最高位是0, 标识此内存分配控制头开始的区域还没有被使用。

对于不固定长度分配区域的初使化,从堆栈娄组开始的MAXMEMHEAP+HDRSZ(内存分配块头的长度)的地址到堆栈数据可分配区域的最后地址都是不固定长度分配区域。

static osalMemHdr_t *ff1; // First free block in the small-block bucket.

static osalMemHdr_t *ff2; // First free block after the small-block bucket.

在OSAL中ff1指向的并是像它注释说的是第一个可分配区域, 而是固定分配区域的开始处, 因为在它内存的分配函数中并没有调整这个指针。ff2 也是一样, 它指向的是可变长度分配区域的第一个单元,而并不是可变分配区域中的第一个空闲内存块, 因为它在内存分配函数和内存释放函数中都没有对ff2进行处理。

内存分配函数:void *osal_mem_alloc( uint16 size );它返回的是指向申请的内存块的指针,如果出错则返回NULL; size指示的是申请分配的大小。

在osal_mem_alloc函数中,如果申请分配的内存的长度小于或者等于

OSALMEM_SMALL_BLKSZ(固定分配的长度), 就在固定分配长度区域进行内存的分配, 如果大于则就在变长分配区域进行内存的分配。

OSAL内存管理1:http://blog.sina.com.cn/s/blog_4c8287230100d5hz.html

0 0
原创粉丝点击