上课需要利用Z-STACK协议栈做一些小应用,于是昨天晚上在网上找了几篇关于zigbee编程的基础程序架构。
一些zigbee的链接:
<a target=_blank href="http://wenku.baidu.com/link?url=epyK5pIRh6PwwHsX2jEW4FUlLzFzFIITtlSZws-JBT1y7MTLveG2GGU6Sv-C-1fxktQzXd_w7QyZhHr4-Qn_3QUfXUj1cDMOlzXN3taSV0S">zigbee的操作系统的运行</a>
<a target=_blank href="http://blog.chinaunix.net/uid-20788636-id-1841377.html">zigbee的osal层api函数</a>
今天下午想了解osal层的一些函数,加上以前了解过malloc的基本实现,于是选取了osal_mem_alloc函数作为例子看了一下,
以下是加详细注释的源代码,我想所有的malloc函数大体思想应该是一样的,希望对malloc感兴趣的又没有例子的同学有所帮助
typedef struct {
unsigned len : 15; //本块的长度最大是2^16-1个字节,且申请空间的最小粒度是2个字节,因为inuse标志位是1个bit
unsigned inUse : 1; //标志位表示本块是否已经被使用
} osalMemHdrHdr_t;
typedef union {
halDataAlign_t alignDummy; //还没明白什么意思
uint16 val; //存储上一个块长度,inuse信息
osalMemHdrHdr_t hdr; //块头指针
} osalMemHdr_t;
/* ------------------------------------------------------------------------------------------------
* Local Variables
* ------------------------------------------------------------------------------------------------
*/
static __no_init osalMemHdr_t theHeap[MAXMEMHEAP / OSALMEM_HDRSZ];
static __no_init osalMemHdr_t *ff1; // First free block in the small-block bucket.
static uint8 osalMemStat; // Discrete status flags: 0x01 = kicked.
static uint16 blkMax; // Max cnt of all blocks ever seen at once.
static uint16 blkCnt; // Current cnt of all blocks.
static uint16 blkFree; // Current cnt of fr