内存分配5 (原文件名:内存分配5.JPG)
for(i=0;i<nblks-1;i++)
{
plink=(void **)(link); //将二维指针定位到框的首位
*plink=(void *)(link+blksize); //该内存块的地址存放的
//是第二片内存区的首地址
link+=blksize; //一维指针重新定位
}
//最后一个二维指针指向一个空指针
获取内存块的核心代码:OSMemGet(......)
tcb=(*ptr).OSMemFreeList;
if((*ptr).OSMemFreeNBlks==0){return (void *)0;}//如果空白内存块的数量为 //返回,若正确返回,收到的数据应该是0
(*ptr).OSMemFreeNBlks--; //空白内存块块数量减一
//空白内存块指针指向下一个内存区
//tcb指向的是内存块节点指针,不能直接使用,加上偏移值4个字节
index=(u8 *)tcb;
index+=4;
//返回内存块指针
return index;
释放内存块的核心代码:OSMemDelete(......)
(void **)tcb=(*ptr).OSMemFreeList; //将OSMemFreeList重新指向这个已经变成空白了的指针
(*ptr).OSMemFreeList=tcb; //将这个空白的指针的下个指针指向原先的空白区指针
(*ptr).OSMemFreeNBlks++; //空白内存块数量加1
值得说明的是,工程文件中的OSQMem.h文件中
OS_MEM_MAX //最多允许的内存块管理区
OS_MEM_USART1_MAX 1024 //发送缓冲区的内存大小
OS_MEM_USART1_BLK 32 //每一个块的长度
而 USART.h文件中
DMA_MODE //定义是采用DMA模式,还是普通的中断模式
推荐是用DMA模式 |