|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
鏈表的使用構(gòu)成了UC/OS II的所有核心機(jī)制。 |
| 作者:mikezhong 欄目:嵌入式系統(tǒng) |
各位好,在UC/OS II 中很多的鏈表,用這些鏈表的操作,從而完成事件控制塊,信號(hào)量,隊(duì)列,事件標(biāo)志,任務(wù)等的多任務(wù)和信息傳遞機(jī)制,因此理解了鏈表的工作,那么將很容易地學(xué)習(xí)UC/OS II,這也是為什么很多大俠說(shuō)UC/OS II 很簡(jiǎn)單的原故。我自已本身也正在學(xué)習(xí)UC/OS II,有較長(zhǎng)的一段時(shí)間,但由于C語(yǔ)言的鏈表的內(nèi)容始終不能悟透,造成進(jìn)展有些困難,對(duì)于此,想請(qǐng)教各位大俠,給我這一類學(xué)習(xí)者一個(gè)正確引導(dǎo),或者能否提供有助于學(xué)習(xí)這方面的資料,在下感激不盡! * - 本貼最后修改時(shí)間:2006-3-2 11:31:15 修改者:mikezhong |
| 2樓: | >>參與討論 |
| 作者: eleven11 于 2006/3/4 10:09:00 發(fā)布:
例子 /****************************************COPYRIGHT (c)************************************************** ** ** Small IP ** ** **--------------文件信息-------------------------------------------------------------------------------- ** 文 件 名: Mem.c ** 最后修改日期: 2005.11.2 ** 當(dāng) 前 版 本: V1.5.7 ** 文 件 描 述: Small IP - Mem.h ********************************************************************************************************/ /********************************************************************************************************** * 定義與編譯器無(wú)關(guān)的數(shù)據(jù)類型 **********************************************************************************************************/ #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 /********************************************************************************************************** * 編譯器關(guān)鍵字的宏定義 **********************************************************************************************************/ #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 /********************************************************************************************************* 內(nèi)存控制結(jié)構(gòu)體定義 *********************************************************************************************************/ typedef struct mem_pcb { LONG MemBlkSize; /* 該內(nèi)存塊可用內(nèi)存的大小 */ struct mem_pcb XDATA *pPrevPCB; /* 指向上一個(gè)內(nèi)存控制結(jié)構(gòu)體的指針,NULL為空 */ struct mem_pcb XDATA *pNextPCB; /* 指向下一個(gè)內(nèi)存控制結(jié)構(gòu)體的指針,NULL為空 */ BYTE *MemAddr; /* 指向可用內(nèi)存的起始地址 */ WORD UsedSize; /* 用戶已用內(nèi)存的大小,可忽略 */ BYTE PARTNO; /* 該內(nèi)存所在的分區(qū)號(hào) */ unsigned Used:1; /* 置1標(biāo)記已用 */ unsigned Locked:1; /* 置1標(biāo)記該內(nèi)存被鎖,無(wú)法釋放 &nbs |
|
| 3樓: | >>參與討論 |
| 作者: eleven11 于 2006/3/4 10:09:00 發(fā)布:
1 /****************************************COPYRIGHT (c)************************************************** ** ** Small IP ** ** **--------------文件信息-------------------------------------------------------------------------------- ** 文 件 名: Mem.c ** 最后修改日期: 2005.11.2 ** 當(dāng) 前 版 本: 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]; /********************************************************************************************************* ** 函數(shù)名稱: MemInit ** 功能描述: 內(nèi)存初始化函數(shù) ** ** 輸 入: 無(wú) ** ** 輸 出: 無(wú) ** ** 全局變量: MemFreeSize, PartUsingFlag ** 調(diào)用模塊: 無(wú) ********************************************************************************************************/ void MemInit(void) REENTRANT { BYTE i; for (i=0; i<MEM_PART_NUM; i++) //內(nèi)存控制結(jié)構(gòu)體第一個(gè)控制結(jié)構(gòu)體的參數(shù)初始化 { 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; //可用內(nèi)存空間初始值 PartUsingFlag = 0; } /********************************************************************************************************* ** 函數(shù)名稱: MemAlloc ** 功能描述: 內(nèi)存分配函數(shù) ** ** 輸 入: Size :需要分配的內(nèi)存大小, 大小不得大于64KB ** ** 輸 出: 分配到的內(nèi)存控制結(jié)構(gòu)體 ** ** 全局變量: MemFreeSize, PartUsingFlag ** 調(diào)用模塊: 無(wú) ********************************************************************************************************/ 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); //需要分配的內(nèi)存大小進(jìn)行字或字節(jié)取整 NewMemSize = Size + sizeof(MEM_PCB); //要分配的內(nèi)存+控制結(jié)構(gòu)體總共需要的內(nèi)存大小 for (i=0; i<MEM_PART_NUM; i++) //內(nèi)存分區(qū)循環(huán)檢測(cè) { if (MEM_PART_USING(i)) //若該內(nèi)存分區(qū)已經(jīng)標(biāo)記正在使用,跳到下一個(gè)內(nèi)存分區(qū) { continue; } MEM_PART_SET_USING_FLAG(i); //內(nèi)存分區(qū)標(biāo)記正在使用 pMem = MemPCBLists[i]; //獲取該內(nèi)存分區(qū)第一個(gè)內(nèi)存控制結(jié)構(gòu)體的指針 while ( pMem != NULL ) //若已經(jīng)沒(méi)有內(nèi)存控制結(jié)構(gòu)體檢測(cè),則跳出 { if ( pMem->MemBlkSize >= Size ) //當(dāng)前內(nèi)存控制結(jié)構(gòu)體的可用內(nèi)存大小適合,同時(shí)是空閑內(nèi)存 if ( pMem->Used == FALSE ) { if ( pMem->MemBlkSize >= (NewMemSize + RAM_MIN_SIZE) ) //若該內(nèi)存控制結(jié)構(gòu)體的可用內(nèi)存至少還可以再分配一個(gè)控制結(jié)構(gòu)體+最小內(nèi)存 { pNewMem = (MEM_PCB XDATA *)(pMem->MemAddr + Size); //計(jì)算分配的控制結(jié)構(gòu)體的指針 pNewMem->pPrevPCB = pMem->pPrevPCB; //分配的控制結(jié)構(gòu)體的參數(shù)賦值 pNewMem->pNextPCB = pMem; pNewMem->MemAddr = pMem->MemAddr; pNewMem->MemBlkSize = Size; pMem->pPrevPCB = pNewMem; //當(dāng)前控制結(jié)構(gòu)體的參數(shù)改變 pMem->MemAddr += NewMemSize; pMem->MemBlkSize -= NewMemSize; if( pNewMem->pPrevPCB != NULL ) //若當(dāng)前控制結(jié)構(gòu)體的上一個(gè)內(nèi)存控制結(jié)構(gòu)體存在 { pNewMem->pPrevPCB->pNextPCB = pNewMem; //需要改變?cè)搩?nèi)存控制結(jié)構(gòu)體的下一個(gè)內(nèi)存控制結(jié)構(gòu)體的參數(shù) } MemFreeSize -= NewMemSize; //空閑可用內(nèi)存的值需要減去分配的內(nèi)存+控制結(jié)構(gòu)體總共需要的內(nèi)存大小 } else //否則將該內(nèi)存控制結(jié)構(gòu)體整個(gè)分配出去 { pNewMem = pMem; &n |
|
| 4樓: | >>參與討論 |
| 作者: eleven11 于 2006/3/4 10:11:00 發(fā)布:
配置 /********************************************************************************************************** * **********************************************************************************************************/ /* 內(nèi)存所有分區(qū)大小總和不得大于0xFFFFFFFF */ #define MEM_PART_SIZE 0x4000 /* 內(nèi)存分區(qū)的大小,必須4字節(jié)對(duì)齊,若是51,則可字對(duì)齊 */ #define MEM_PART_NUM 3 /* 內(nèi)存分區(qū)的數(shù)目,最大支持分區(qū)數(shù)由內(nèi)存分區(qū)標(biāo)記的數(shù)據(jù)類型決定 */ #define MEM_PART_FLAG_TYPE BYTE /* 定義分區(qū)正在使用標(biāo)記的數(shù)據(jù)類型 */ #define RAM_MIN_SIZE 4 /* 內(nèi)存分配的最小單元:ARM為4,51為2 */ |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |