音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁(yè) | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(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)
鏈表的使用構(gòu)成了UC/OS II的所有核心機(jī)制。
各位好,在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
例子
/****************************************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
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
配置
/**********************************************************************************************************
*                                       
**********************************************************************************************************/
                                   /* 內(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                                   */

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
SD卡的初始化不成功,做過(guò)的朋友可指點(diǎn)一下?
我該咋辦?
使用uC/OS-II時(shí)出現(xiàn)的問(wèn)題
EasyARM2131與12864J
[求助]調(diào)試UC/OS 2遇到的奇怪問(wèn)題
免費(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)