ucos内存管理笔记

http://www.jarson.asia/2011/04/23/ucos-ii%E7%9A%84%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/
参考以上信息
  INT8U     *pblk;
    void     **plink;
    .
    .
    plink = (void **)addr;                    /*Create linked list of free memory blocks */
    pblk  = (INT8U *)addr + blksize;
    for (i = 0; i < (nblks - 1); i++) {
        *plink = (void *)pblk;
        plink  = (void **)pblk;
        pblk   = pblk + blksize;
    }
    *plink              = (void *)0;    
   
 
红色的部分是 OsMemCreate(void * address int32u nblks …… )
 
使用创建内存分区之前要分配一部分内存给 ucos 让它来管理
OS_MEM *TxBuf;
INT8U TxPart[100][32];
 
void main(void) {
    INT8U err;
    OSInit();
    .
    .
    TxBuf = OSMemCreate(TxPart, 100, 32, &err);
    .
    .
    OSStart();
}
也就是建立一个内存分区
 
ucos 是怎样管理内存的呢
INT8U TxPart[100][32]; 是建立一个有100 个块,并且每个块石32Byte 的内存分区
作者将这个内存分区的各个块连接成一个链表来管理


其实就是将每一个块的首个存储空间存放先一个块的起始地址
 
那好了。我们看看 ucos OsMemCreate(void * address int32u nblks …… ) 是怎样做的
核心代码
  INT8U     *pblk;
    void     **plink;

    .
    .
    plink = (void **)addr;                    /*Create linked list of free memory blocks */
    pblk  = (INT8U *)addr + blksize;
    for (i = 0; i < (nblks - 1); i++) {
        *plink = (void *)pblk;
        plink  = (void **)pblk;
        pblk   = pblk + blksize;
    }
    *plink              = (void *)0;    
函数传递过来的是 address ,也就是内存分区首个块的第一个地址    
本人认为实现一个内存链表可以如下:
将内存块的指针强制转换成整型数据。放到前一个内存块的首个内存空间,这样,前一个内存块就保存了下一个内存块的地址了。
 
实现起来如下:
 
Void * p1=addr;
Void *p2 = addr+blksize;
For(i=0;i<(nblks-1);i++)
{
       *p1 = (uint32 ) p2;
       P1 = p2;
       P2=p2+blksize;
}
大家看到我创建链表用的是整型数据赋值,
但是ucos 没有这样做。作者用的是指针赋值,不知道是处于移植考虑还是我(菜鸟)考虑不周。或者其他原因。总之,作者的方法如下:
plink = (void **)addr;                    /*Create linked list of free memory blocks *
作者这里用一个强制转换,其实是为了把addr 所指向的内存空间当成一个指针来用
这句话以后,那么编译器就不再把第一个块的第一个内存空间看做一个变量了。而是成为了一个指针来处理。那么理所当然
* plink = (void *)pblk; 就是把第一个块的第一个地址的内存内容放入了下一个块的内存地址。哈哈
为什么作者用二级指针,目的何在?作者用二级指针不是为了改变指针的值,而是把块的第一个内存区当成指针来用以此赋值吧
作者可能有更远的考虑。移植问题吧。应为自始至终作者的都是调用void*型指针变量的。没有用到诸如int什么的类型。因为不同编译器对intuint等的理解是不一样的
 
 
 
 
到此为止吧。不知道我解释的是不是清楚!。大家最好看看ucos 内存管理部分的内容。因为我的讲解比较粗略。
 
 


你可能感兴趣的:(内存,default,v)