|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
链表的使用构成了UC/OS II的所有核心机制。 |
作者:mikezhong 栏目:嵌入式系统 |
各位好,在UC/OS II 中很多的链表,用这些链表的操作,从而完成事件控制块,信号量,队列,事件标志,任务等的多任务和信息传递机制,因此理解了链表的工作,那么将很容易地学习UC/OS II,这也是为什么很多大侠说UC/OS II 很简单的原故。我自已本身也正在学习UC/OS II,有较长的一段时间,但由于C语言的链表的内容始终不能悟透,造成进展有些困难,对于此,想请教各位大侠,给我这一类学习者一个正确引导,或者能否提供有助于学习这方面的资料,在下感激不尽! * - 本贴最后修改时间:2006-3-2 11:31:15 修改者:mikezhong |
2楼: | >>参与讨论 |
作者: eleven11 于 2006/3/4 10:09:00 发布:
例子 /****************************************COPYRIGHT (c)************************************************** ** ** Small IP ** ** **--------------文件信息-------------------------------------------------------------------------------- ** 文 件 名: Mem.c ** 最后修改日期: 2005.11.2 ** 当 前 版 本: V1.5.7 ** 文 件 描 述: Small IP - Mem.h ********************************************************************************************************/ /********************************************************************************************************** * 定义与编译器无关的数据类型 **********************************************************************************************************/ #define BYTE unsigned CHAR #define SBYTE signed CHAR #define WORD unsigned SHORT #define SWORD signed SHORT #define LONG unsigned LONG #define SLONG signed LONG #define BOOL unsigned CHAR /********************************************************************************************************** * 编译器关键字的宏定义 **********************************************************************************************************/ #define XDATA #define REENTRANT #define INTERRUPT #define X1 #define X2 #define VOLATILE volatile #define PACK_STRUCT_BEGIN __packed #define PACK_STRUCT_END #define CODE #define CONST const /********************************************************************************************************** * 定义编译器是小端模式还是大端模式 **********************************************************************************************************/ #define Little_End /********************************************************************************************************* 内存控制结构体定义 *********************************************************************************************************/ typedef struct mem_pcb { LONG MemBlkSize; /* 该内存块可用内存的大小 */ struct mem_pcb XDATA *pPrevPCB; /* 指向上一个内存控制结构体的指针,NULL为空 */ struct mem_pcb XDATA *pNextPCB; /* 指向下一个内存控制结构体的指针,NULL为空 */ BYTE *MemAddr; /* 指向可用内存的起始地址 */ WORD UsedSize; /* 用户已用内存的大小,可忽略 */ BYTE PARTNO; /* 该内存所在的分区号 */ unsigned Used:1; /* 置1标记已用 */ unsigned Locked:1; /* 置1标记该内存被锁,无法释放 &nbs |
3楼: | >>参与讨论 |
作者: eleven11 于 2006/3/4 10:09:00 发布:
1 /****************************************COPYRIGHT (c)************************************************** ** ** Small IP ** ** **--------------文件信息-------------------------------------------------------------------------------- ** 文 件 名: Mem.c ** 最后修改日期: 2005.11.2 ** 当 前 版 本: V1.5.7 ** 文 件 描 述: Small IP - Mem.c ********************************************************************************************************/ #ifndef IN_MEM #define IN_MEM #include "SmallIP.h" MEM_PART_FLAG_TYPE XDATA PartUsingFlag; LONG XDATA MemFreeSize; static BYTE XDATA MemRAM[MEM_PART_NUM][MEM_PART_SIZE]; static MEM_PCB XDATA * XDATA MemPCBLists[MEM_PART_NUM]; /********************************************************************************************************* ** 函数名称: MemInit ** 功能描述: 内存初始化函数 ** ** 输 入: 无 ** ** 输 出: 无 ** ** 全局变量: MemFreeSize, PartUsingFlag ** 调用模块: 无 ********************************************************************************************************/ void MemInit(void) REENTRANT { BYTE i; for (i=0; i<MEM_PART_NUM; i++) //内存控制结构体第一个控制结构体的参数初始化 { MemPCBLists[i] = (MEM_PCB XDATA * XDATA)(&MemRAM[i][0] + MEM_PART_SIZE - sizeof(MEM_PCB)); MemPCBLists[i]->MemBlkSize = MEM_PART_SIZE - sizeof(MEM_PCB); MemPCBLists[i]->pPrevPCB = NULL; MemPCBLists[i]->pNextPCB = NULL; MemPCBLists[i]->MemAddr = &MemRAM[i][0]; MemPCBLists[i]->Used = FALSE; MemPCBLists[i]->Locked = FALSE; MemPCBLists[i]->PARTNO = i; MemPCBLists[i]->Flag = 0; } MemFreeSize = (MEM_PART_SIZE - sizeof(MEM_PCB))*MEM_PART_NUM; //可用内存空间初始值 PartUsingFlag = 0; } /********************************************************************************************************* ** 函数名称: MemAlloc ** 功能描述: 内存分配函数 ** ** 输 入: Size :需要分配的内存大小, 大小不得大于64KB ** ** 输 出: 分配到的内存控制结构体 ** ** 全局变量: MemFreeSize, PartUsingFlag ** 调用模块: 无 ********************************************************************************************************/ MEM_PCB XDATA *MemAlloc(WORD Size) REENTRANT { MEM_PCB XDATA *pMem; MEM_PCB XDATA *pNewMem; WORD NewMemSize; BYTE MinSize = RAM_MIN_SIZE-1; BYTE i; Size = (Size + MinSize) & (~MinSize); //需要分配的内存大小进行字或字节取整 NewMemSize = Size + sizeof(MEM_PCB); //要分配的内存+控制结构体总共需要的内存大小 for (i=0; i<MEM_PART_NUM; i++) //内存分区循环检测 { if (MEM_PART_USING(i)) //若该内存分区已经标记正在使用,跳到下一个内存分区 { continue; } MEM_PART_SET_USING_FLAG(i); //内存分区标记正在使用 pMem = MemPCBLists[i]; //获取该内存分区第一个内存控制结构体的指针 while ( pMem != NULL ) //若已经没有内存控制结构体检测,则跳出 { if ( pMem->MemBlkSize >= Size ) //当前内存控制结构体的可用内存大小适合,同时是空闲内存 if ( pMem->Used == FALSE ) { if ( pMem->MemBlkSize >= (NewMemSize + RAM_MIN_SIZE) ) //若该内存控制结构体的可用内存至少还可以再分配一个控制结构体+最小内存 { pNewMem = (MEM_PCB XDATA *)(pMem->MemAddr + Size); //计算分配的控制结构体的指针 pNewMem->pPrevPCB = pMem->pPrevPCB; //分配的控制结构体的参数赋值 pNewMem->pNextPCB = pMem; pNewMem->MemAddr = pMem->MemAddr; pNewMem->MemBlkSize = Size; pMem->pPrevPCB = pNewMem; //当前控制结构体的参数改变 pMem->MemAddr += NewMemSize; pMem->MemBlkSize -= NewMemSize; if( pNewMem->pPrevPCB != NULL ) //若当前控制结构体的上一个内存控制结构体存在 { pNewMem->pPrevPCB->pNextPCB = pNewMem; //需要改变该内存控制结构体的下一个内存控制结构体的参数 } MemFreeSize -= NewMemSize; //空闲可用内存的值需要减去分配的内存+控制结构体总共需要的内存大小 } else //否则将该内存控制结构体整个分配出去 { pNewMem = pMem; &n |
4楼: | >>参与讨论 |
作者: eleven11 于 2006/3/4 10:11:00 发布:
配置 /********************************************************************************************************** * **********************************************************************************************************/ /* 内存所有分区大小总和不得大于0xFFFFFFFF */ #define MEM_PART_SIZE 0x4000 /* 内存分区的大小,必须4字节对齐,若是51,则可字对齐 */ #define MEM_PART_NUM 3 /* 内存分区的数目,最大支持分区数由内存分区标记的数据类型决定 */ #define MEM_PART_FLAG_TYPE BYTE /* 定义分区正在使用标记的数据类型 */ #define RAM_MIN_SIZE 4 /* 内存分配的最小单元:ARM为4,51为2 */ |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |