uC/OS-II内存管理之OSMemCreate()代码可读性的一点改进
来源:互联网 发布:it全称 编辑:程序博客网 时间:2024/05/16 11:20
个人感觉uC/OS-II内存管理之OSMemCreate(),在创建空余内存块链表时,可读性不好。
该函数源代码:
OS_MEM *OSMemCreate (void *addr, INT32U nblks, INT32U blksize, INT8U *err){#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */ OS_CPU_SR cpu_sr;#endif OS_MEM *pmem; INT8U *pblk; void **plink; INT32U i;#if OS_ARG_CHK_EN > 0 if (addr == (void *)0) { /* Must pass a valid address for the memory part. */ *err = OS_MEM_INVALID_ADDR; return ((OS_MEM *)0); } if (nblks < 2) { /* Must have at least 2 blocks per partition */ *err = OS_MEM_INVALID_BLKS; return ((OS_MEM *)0); } if (blksize < sizeof(void *)) { /* Must contain space for at least a pointer */ *err = OS_MEM_INVALID_SIZE; return ((OS_MEM *)0); }#endif OS_ENTER_CRITICAL(); pmem = OSMemFreeList; /* Get next free memory partition */ if (OSMemFreeList != (OS_MEM *)0) { /* See if pool of free partitions was empty */ OSMemFreeList = (OS_MEM *)OSMemFreeList->OSMemFreeList; } OS_EXIT_CRITICAL(); if (pmem == (OS_MEM *)0) { /* See if we have a memory partition */ *err = OS_MEM_INVALID_PART; return ((OS_MEM *)0); } 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; /* Last memory block points to NULL */ pmem->OSMemAddr = addr; /* Store start address of memory partition */ pmem->OSMemFreeList = addr; /* Initialize pointer to pool of free blocks */ pmem->OSMemNFree = nblks; /* Store number of free blocks in MCB */ pmem->OSMemNBlks = nblks; pmem->OSMemBlkSize = blksize; /* Store block size of each memory blocks */ *err = OS_NO_ERR; return (pmem);}
创建空余内存块链表时
原先是,pblk在循环开始前就指向第二个内存块,只需N-1次完成链表。
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; /* Last memory block points to NULL */
现修改成循环前plink和pblk都指首地址,也就是第一个内存块的地址,有N个内存块就循环N次。这样感觉比较好理解。
/* plink 和 pblk 进行循环前,都指向addr */ plink = (void **)addr; /* Create linked list of free memory blocks */ pblk = (INT8U *)addr; for (i = 0; i < nblks; i++) { /* N个内存块就循环N次 */ pblk = pblk + blksize; *plink = (void *)pblk; plink = (void **)pblk; } *plink = (void *)0; /* Last memory block points to NULL */
- uC/OS-II内存管理之OSMemCreate()代码可读性的一点改进
- UC/OS-II的内存管理OSMemCreate()分析
- uC/OS-II的内存管理
- UC/OS - II内存管理
- UC/OS II 内存管理
- uC/OS-II内存管理函数的二维指针
- uC/OS II内存管理 详细分析
- 改进uC/OS II,减少内存使用量
- 改进uC/OS II,减少内存使用量
- 改进uC/OS II,减少内存使用量
- μC/OS-II实时操作系统内存管理的改进
- uc/os-II的内存改进与实现TLSF算法的详解,移植实现(一)
- uc/os-II的内存改进与实现TLSF算法的详解,移植实现(二)
- uc/os-II的内存改进与实现TLSF算法的详解,移植实现(三)
- uc/os-II的内存改进与实现TLSF算法的详解,移植实现(四)
- uC/OS-II学习心得与改进(一) uC/OS-II的任务切换总结
- uC/OS-II就绪任务的管理
- uC/OS-II就绪任务的管理
- ntop安装
- mysql replication 配置方法
- Linux inotify功能及实现原理
- 在Myeclipse中开发WEB应用新建文件夹的必须放在WebRoot下
- Android开发之获取web服务器xml数据
- uC/OS-II内存管理之OSMemCreate()代码可读性的一点改进
- Linux 内核/sys 文件系统介绍3
- 利用editplus+jdk搭建java的编译环境
- Linux 内核/sys 文件系统介绍4
- Android开发之路十一-----SharePreferences进行数据存储和SQL数据库
- shell命令基础
- Linux 内核/sys 文件系统介绍5
- Linux 内核/sys 文件系统介绍6
- widows 脚本也能作算术计算