2022年uCOS-II实时操作系统内核源代码注释 .pdf
《2022年uCOS-II实时操作系统内核源代码注释 .pdf》由会员分享,可在线阅读,更多相关《2022年uCOS-II实时操作系统内核源代码注释 .pdf(15页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、/* * * uC/OS-II * 实时操作内核* 内存管理* * (c) 版权 1992-2002, Jean J. Labrosse, Weston, FL * All Rights Reserved * * 文件名 : OS_MEM.C * 作者 : Jean J. Labrosse * 注释 : 彭森 2007/9/2 * */ #ifndef OS_MASTER_FILE #include includes.h #endif #if (OS_MEM_EN 0) & (OS_MAX_MEM_PART 0) /* * * 创建一个内存分区* * 说明 : 创建一个固定大小的内存分区, 这
2、个内存分区通过uC/OS-II管理。* * 参数 : addr 内存分区的起始地址* * nblks 来自分区的内存块的数目. * * blksize 每个内存分区中的内存块的大小. * * err 指向一个变量包含错误的信息,这个信息通过这个函数或其他来设置:* * OS_NO_ERR 内存分区创建正确返回值. * OS_MEM_INVALID_ADDR 指定的是无效地址作为分区的内存存储空间* OS_MEM_INVALID_PART 没有未使用的有用的分区* OS_MEM_INVALID_BLKS 使用者指定一个无效的内名师资料总结 - - -精品资料欢迎下载 - - - - - - -
3、- - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 15 页 - - - - - - - - - 存块(必须 = 2) * OS_MEM_INVALID_SIZE 使用者指定一个无效的内存空间值* (必须大于指针的空间大小) * 返回值 : != (OS_MEM *)0 分区被创建* = (OS_MEM *)0 分区没有被创建由于无效的参数 , 没有未使用的分区可用* */ OS_MEM *OSMemCreate (void *addr, INT32U nblks, INT32U blksize, INT8U *err) #if OS_CRIT
4、ICAL_METHOD = 3 /* Allocate storage for CPU status register 为 CPU 状态寄存器分配存储空间 */ 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 (O
5、S_MEM *)0); if (nblks 2) /* Must have at least 2 blocks per partition 每个分区至少有两个分区*/ *err = OS_MEM_INVALID_BLKS; return (OS_MEM *)0); if (blksize OSMemFreeList; OS_EXIT_CRITICAL(); if (pmem = (OS_MEM *)0) /* See if we have a memory partition 查看是否我们有一个内存分区*/ *err = OS_MEM_INVALID_PART; return (OS_MEM
6、*)0); plink = (void *)addr; /* Create linked list of free memory blocks 创建未使用的内存块的可连接的列表*/ pblk = (INT8U *)addr + blksize; for (i = 0; i OSMemAddr = addr; /* Store start address of memory partition 保存内存分区的起始地址 */ pmem-OSMemFreeList = addr; /* Initialize pointer to pool of free blocks 为未使用的内存块初始化指针*/
7、 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); /*$PAGE*/ /* * * 得到一个内存控制块* * 说明 : 从分区中得到一个内存块* * 参数 : pmem 指针 指向一个内存分区
8、控制块* 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 15 页 - - - - - - - - - * err 指向一个变量包含一个错误信息, 这个错误信息通过这个函数或其他来设计* * OS_NO_ERR 假如内存分区被正确的创建. * OS_MEM_NO_FREE_BLKS 假如没有更多的内存块被分配给调用者* OS_MEM_INVALID_PMEM 假如已经为 pmem通过一个空指针* * 返回值 : 一个指针指向一个内存控制块,假如没有察觉错误* 一个指针指向
9、空指针,假如有错误被察觉到* */ void *OSMemGet (OS_MEM *pmem, INT8U *err) #if OS_CRITICAL_METHOD = 3 /* Allocate storage for CPU status register 为 CPU 状态寄存器分配存储空间 */ OS_CPU_SR cpu_sr; #endif void *pblk; #if OS_ARG_CHK_EN 0 if (pmem = (OS_MEM *)0) /* Must point to a valid memory partition 必须指向一个有效的内存分区 */ *err = O
10、S_MEM_INVALID_PMEM; return (OS_MEM *)0); #endif OS_ENTER_CRITICAL(); if (pmem-OSMemNFree 0) /* See if there are any free memory blocks 查看是否有其他未使用的内存块*/ pblk = pmem-OSMemFreeList; /* Yes, point to next free memory block 是的,指针指向下一个未使用的内存块*/ pmem-OSMemFreeList = *(void *)pblk; /* Adjust pointer to new
11、free list 调整指针指向一个新的未使用的空间列表*/ pmem-OSMemNFree-; /* One less memory block in this partition 在这个分区中减少一个内存块*/ OS_EXIT_CRITICAL(); *err = OS_NO_ERR; /* No error 没有错误 */ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 15 页 - - - - - - - - - return (pblk); /* Return
12、memory block to caller 返回内存控制块给调用者*/ OS_EXIT_CRITICAL(); *err = OS_MEM_NO_FREE_BLKS; /* No, Notify caller of empty memory partition 告知调用者是空的内存分区*/ return (void *)0); /* Return NULL pointer to caller 返回 NULL个调用者 */ /*$PAGE*/ /* * * 释放一个内存块* * 说明 : 返回一个内存块给分区* * 参数 : pmem 指针指向内存分区控制块* * pblk 指针指向被保留的内
13、存块 . * * 返回值 : OS_NO_ERR 假如内存块是被插入的分区* OS_MEM_FULL 假如返回一个已经全部内存分区的内存块* (你释放了更多你分配的内存块!) * OS_MEM_INVALID_PMEM 假如指针 pmem指向 NULL 。* OS_MEM_INVALID_PBLK 假如指向释放的内存块为空. * */ INT8U OSMemPut (OS_MEM *pmem, void *pblk) #if OS_CRITICAL_METHOD = 3 /* Allocate storage for CPU status register 为 CPU 状态寄存器分配存储空间
14、*/ OS_CPU_SR cpu_sr; #endif #if OS_ARG_CHK_EN 0 if (pmem = (OS_MEM *)0) /* Must point to a valid memory partition 必须指向一个有效的内存分区 */ return (OS_MEM_INVALID_PMEM); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 15 页 - - - - - - - - - if (pblk = (void *)0) /* Must
15、release a valid block 必须保留一个有效的内存块 */ return (OS_MEM_INVALID_PBLK); #endif OS_ENTER_CRITICAL(); if (pmem-OSMemNFree = pmem-OSMemNBlks) /* Make sure all blocks not already returned 确认所有的内存块没有已经返回 */ OS_EXIT_CRITICAL(); return (OS_MEM_FULL); *(void *)pblk = pmem-OSMemFreeList; /* Insert released block
16、 into free block list 将释放的内存块插入未使用的内存块表 */ pmem-OSMemFreeList = pblk; pmem-OSMemNFree+; /* One more memory block in this partition 在分区中增加一个内存块 */ OS_EXIT_CRITICAL(); return (OS_NO_ERR); /* Notify caller that memory block was released 告知调用者内存块被释放 */ /*$PAGE*/ /* * * 查询内存分区* * 说明 : 这个函数被使用来查询在内存分区中已经使
17、用的内存块数及尚未使用的内存数* * * 参数 : pmem 指针指向一个内存分区控制块* * pdata 指针指向一个结构体,该结构体包含关于内存分区的信息* * 返回值 : OS_NO_ERR 假如没有错误发生 . * OS_MEM_INVALID_PMEM 假如指针 pmem指向 NULL 。* OS_MEM_INVALID_PDATA 假如指向释放的内存块为空. * */ #if OS_MEM_QUERY_EN 0 INT8U OSMemQuery (OS_MEM *pmem, OS_MEM_DATA *pdata) 名师资料总结 - - -精品资料欢迎下载 - - - - - - -
18、 - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 15 页 - - - - - - - - - #if OS_CRITICAL_METHOD = 3 /* Allocate storage for CPU status register 为 CPU 状态寄存器分配存储空间 */ OS_CPU_SR cpu_sr; #endif #if OS_ARG_CHK_EN 0 if (pmem = (OS_MEM *)0) /* Must point to a valid memory partition 必须指向一个有效的内存分区 */ retur
19、n (OS_MEM_INVALID_PMEM); if (pdata = (OS_MEM_DATA *)0) /* Must release a valid storage area for the data 为这些数据必须释放一个有效的存储区域 */ return (OS_MEM_INVALID_PDATA); #endif OS_ENTER_CRITICAL(); pdata-OSAddr = pmem-OSMemAddr; pdata-OSFreeList = pmem-OSMemFreeList; pdata-OSBlkSize = pmem-OSMemBlkSize; pdata-O
20、SNBlks = pmem-OSMemNBlks; pdata-OSNFree = pmem-OSMemNFree; OS_EXIT_CRITICAL(); pdata-OSNUsed = pdata-OSNBlks - pdata-OSNFree; return (OS_NO_ERR); #endif /* OS_MEM_QUERY_EN */ /*$PAGE*/ /* * * 内存分区管理初始化* * 说明 : 这个函数是 uC/OS-II 的内部函数,你的函数务必不要调用它. * * 参数 : 无* * 返回值 : 无* * 备注 : 这个函数是 uC/OS-II 的内部函数,你的函数务
21、必不要调用它. 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 15 页 - - - - - - - - - * */ void OS_MemInit (void) #if OS_MAX_MEM_PART = 1 OSMemFreeList = (OS_MEM *)&OSMemTbl0; /* Point to beginning of free list 指向释放列表的起始地址 */ OSMemFreeList-OSMemFreeList = (void *)0; /*
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年uCOS-II实时操作系统内核源代码注释 2022 uCOS II 实时 操作系统 内核 源代码 注释
限制150内