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

登錄 免費(fèi)注冊(cè) 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | 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

大家來討論一下動(dòng)態(tài)分配內(nèi)存問提

作者:db10 欄目:ARM技術(shù)
大家來討論一下動(dòng)態(tài)分配內(nèi)存問提
  先看看一些基本概念:一、為什么用動(dòng)態(tài)內(nèi)存分配

  但我們未學(xué)習(xí)鏈表的時(shí)候,如果要存儲(chǔ)數(shù)量比較多的同類型或同結(jié)構(gòu)的數(shù)據(jù)的時(shí)候,總是使用一個(gè)數(shù)組。比如說我們要存儲(chǔ)一個(gè)班級(jí)學(xué)生的某科分?jǐn)?shù),總是定義一個(gè)float型(存在0.5分)數(shù)組:

float score[30];

  但是,在使用數(shù)組的時(shí)候,總有一個(gè)問題困擾著我們:數(shù)組應(yīng)該有多大?

  在很多的情況下,你并不能確定要使用多大的數(shù)組,比如上例,你可能并不知道該班級(jí)的學(xué)生的人數(shù),那么你就要把數(shù)組定義得足夠大。這樣,你的程序在運(yùn)行時(shí)就申請(qǐng)了固定大小的你認(rèn)為足夠大的內(nèi)存空間。即使你知道該班級(jí)的學(xué)生數(shù),但是如果因?yàn)槟撤N特殊原因人數(shù)有增加或者減少,你又必須重新去修改程序,擴(kuò)大數(shù)組的存儲(chǔ)范圍。這種分配固定大小的內(nèi)存分配方法稱之為靜態(tài)內(nèi)存分配。但是這種內(nèi)存分配的方法存在比較嚴(yán)重的缺陷,特別是處理某些問題時(shí):在大多數(shù)情況下會(huì)浪費(fèi)大量的內(nèi)存空間,在少數(shù)情況下,當(dāng)你定義的數(shù)組不夠大時(shí),可能引起下標(biāo)越界錯(cuò)誤,甚至導(dǎo)致嚴(yán)重后果。

  那么有沒有其它的方法來解決這樣的外呢體呢?有,那就是動(dòng)態(tài)內(nèi)存分配。

  所謂動(dòng)態(tài)內(nèi)存分配就是指在程序執(zhí)行的過程中動(dòng)態(tài)地分配或者回收存儲(chǔ)空間的分配內(nèi)存的方法。動(dòng)態(tài)內(nèi)存分配不象數(shù)組等靜態(tài)內(nèi)存分配方法那樣需要預(yù)先分配存儲(chǔ)空間,而是由系統(tǒng)根據(jù)程序的需要即時(shí)分配,且分配的大小就是程序要求的大小。從以上動(dòng)、靜態(tài)內(nèi)存分配比較可以知道動(dòng)態(tài)內(nèi)存分配相對(duì)于景泰內(nèi)存分配的特點(diǎn):

  1、不需要預(yù)先分配存儲(chǔ)空間;

  2、分配的空間可以根據(jù)程序的需要擴(kuò)大或縮小。

  二、如何實(shí)現(xiàn)動(dòng)態(tài)內(nèi)存分配及其管理

  要實(shí)現(xiàn)根據(jù)程序的需要?jiǎng)討B(tài)分配存儲(chǔ)空間,就必須用到以下幾個(gè)函數(shù)

  1、malloc函數(shù)

  malloc函數(shù)的原型為:

void *malloc (unsigned int size)

  其作用是在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一個(gè)長度為size的連續(xù)空間。其參數(shù)是一個(gè)無符號(hào)整形數(shù),返回值是一個(gè)指向所分配的連續(xù)存儲(chǔ)域的起始地址的指針。還有一點(diǎn)必須注意的是,當(dāng)函數(shù)未能成功分配存儲(chǔ)空間(如內(nèi)存不足)就會(huì)返回一個(gè)NULL指針。所以在調(diào)用該函數(shù)時(shí)應(yīng)該檢測返回值是否為NULL并執(zhí)行相應(yīng)的操作。

  下例是一個(gè)動(dòng)態(tài)分配的程序:

#include
#include
main()
{
 int count,*array; /*count是一個(gè)計(jì)數(shù)器,array是一個(gè)整型指針,也可以理解為指向一個(gè)整型數(shù)組的首地址*/
 if((array(int *) malloc(10*sizeof(int)))==NULL)
 {
  printf("不能成功分配存儲(chǔ)空間。");
  exit(1);
 }
 for (count=0;count〈10;count++) /*給數(shù)組賦值*/
  array[count]=count;
 for(count=0;count〈10;count++) /*打印數(shù)組元素*/
  printf("%2d",array[count]);
}

  上例中動(dòng)態(tài)分配了10個(gè)整型存儲(chǔ)區(qū)域,然后進(jìn)行賦值并打印。例中if((array(int *) malloc(10*sizeof(int)))==NULL)語句可以分為以下幾步:

  1)分配10個(gè)整型的連續(xù)存儲(chǔ)空間,并返回一個(gè)指向其起始地址的整型指針

  2)把此整型指針地址賦給array

  3)檢測返回值是否為NULL

  2、free函數(shù)

  由于內(nèi)存區(qū)域總是有限的,不能不限制地分配下去,而且一個(gè)程序要盡量節(jié)省資源,所以當(dāng)所分配的內(nèi)存區(qū)域不用時(shí),就要釋放它,以便其它的變量或者程序使用。這時(shí)我們就要用到free函數(shù)。

  其函數(shù)原型是:

void free(void *p)

  作用是釋放指針p所指向的內(nèi)存區(qū)。

  其參數(shù)p必須是先前調(diào)用malloc函數(shù)或calloc函數(shù)(另一個(gè)動(dòng)態(tài)分配存儲(chǔ)區(qū)域的函數(shù))時(shí)返回的指針。給free函數(shù)傳遞其它的值很可能造成死機(jī)或其它災(zāi)難性的后果。

  注意:這里重要的是指針的值,而不是用來申請(qǐng)動(dòng)態(tài)內(nèi)存的指針本身。例:

int *p1,*p2;
p1=malloc(10*sizeof(int));
p2=p1;
……
free(p2) /*或者free(p2)*/

  malloc返回值賦給p1,又把p1的值賦給p2,所以此時(shí)p1,p2都可作為free函數(shù)的參數(shù)。

  malloc函數(shù)是對(duì)存儲(chǔ)區(qū)域進(jìn)行分配的。

  free函數(shù)是釋放已經(jīng)不用的內(nèi)存區(qū)域的。

  所以由這兩個(gè)函數(shù)就可以實(shí)現(xiàn)對(duì)內(nèi)存區(qū)域進(jìn)行動(dòng)態(tài)分配并進(jìn)行簡單的管理了。
另外一個(gè)規(guī)擇:malloc與free要成對(duì)出現(xiàn)
  它們是一對(duì)恩愛夫妻,malloc少了free就必然會(huì)慢慢地死掉。成對(duì)出現(xiàn)不僅體現(xiàn)在有多少個(gè)malloc就應(yīng)該有多少個(gè)free,還體現(xiàn)在它們應(yīng)盡量出現(xiàn)在同一函數(shù)里,“誰申請(qǐng),就由誰釋放”,看下面的程序:
CHAR * func(void)
{
CHAR *p;
p = (CHAR *)malloc(…);
if(p!=NULL)
…; /* 一系列針對(duì)p的操作 */
return p;
}
/*在某處調(diào)用func(),用完func中動(dòng)態(tài)申請(qǐng)的內(nèi)存后將其free*/
CHAR *q = func();

free(q);
上述代碼違反了malloc和free的“誰申請(qǐng),就由誰釋放”原則,代碼的耦合度大,用戶在調(diào)用func函數(shù)時(shí)需確切知道其內(nèi)部細(xì)節(jié)!正確的做法是:
/* 在調(diào)用處申請(qǐng)內(nèi)存,并傳入func函數(shù) */
CHAR *p=malloc(…);
if(p!=NULL)
{
func(p);

free(p);
p=NULL;
}
/* 函數(shù)func則接收參數(shù)p */
void func(CHAR *p)
{
… /* 一系列針對(duì)p的操作 */
}
free后一定要置指針為NULL,防止其成為“野”指針
我的使用:
在C51里(不帶操作系統(tǒng))我已經(jīng)是可以做動(dòng)態(tài)分配內(nèi)存的。但是在51實(shí)現(xiàn)動(dòng)態(tài)不像上面說的簡單,開始也是根據(jù)上面說的做的,但是發(fā)現(xiàn)在51里這樣做是不行的,后來終于實(shí)現(xiàn)了,那時(shí)必須在malloc之前調(diào)用一個(gè)init_mem(具體看KEIL庫函數(shù)就知道)的函數(shù)分配一個(gè)比較大的空間之后,再用malloc就在這個(gè)已經(jīng)分配的空間可以申請(qǐng)到內(nèi)存了,就可以用malloc和free成對(duì)無限的使用這塊大空間了。其實(shí)在51里說白了就是有限制的不是全自動(dòng)的動(dòng)態(tài)申請(qǐng)內(nèi)存。

問題:現(xiàn)在我在lpc3132里(不帶操作系統(tǒng))這樣用。當(dāng)然不用象我51里一樣init_mem
來先確定一個(gè)大范圍,直接用malloc就可以申請(qǐng)到,并且連續(xù)申請(qǐng)500個(gè)10個(gè)字節(jié)大小的內(nèi)存沒有問題,當(dāng)我用完他的一部分再釋放free一部分。但是現(xiàn)在有個(gè)問題:我做了實(shí)驗(yàn),當(dāng)我連續(xù)申請(qǐng)了5K大小的空間,每次申請(qǐng)的大小是10個(gè)字節(jié),即連續(xù)調(diào)用malloc達(dá)體是500次。我看到都是OK的,但是在然后的使用中,部分的用free 釋放掉,當(dāng)然其中可能又要使用到malloc,這時(shí)使用malloc就申請(qǐng)不到內(nèi)存,但是我用了一個(gè)全局變量,即運(yùn)行一次malloc是加一,運(yùn)行一次free就減一,當(dāng)不能申請(qǐng)時(shí)發(fā)現(xiàn)此時(shí)的這個(gè)全局變量值是才為2。但是為什么申請(qǐng)不到?這個(gè)全局變量值開始malloc次即是500可以的。而中間釋放運(yùn)行free,再malloc就不行,難道free不起作用,在51這樣用為什么可以?

2樓: >>參與討論
computer00
建議看看我的ARM_00_OS中的內(nèi)存管理函數(shù)~~~~~~~
http://bbs.21ic.com/club/bbs/list.asp?boardid=35&t=2089994&tp=%u770b%u770barm%u83dc%u9e1f%u5728arm7%u4e0a%u5199%u7684%u64cd%u4f5c%u7cfb%u7edf%u2014%u2014arm%u5708%u5708%u64cd%u4f5c%u7cfb%u7edf





/**********************************************************************************************
本程序只供學(xué)習(xí)使用,不得用于其它任何用途,否則后果自負(fù)。

  ARM_00_OS_Core.c file
   
  作者:Computer-lov
  建立日期:2006-5-1
  修改日期:2006-5-15
  版本:V1.0
  版權(quán)所有,盜版必究。
  任何技術(shù)問題可到我的博客上留言:    http://computer00.21ic.org
  COPYRIGHT(C) Computer-lov 2006-2016
  All rights reserved
**********************************************************************************************/

#include <ADuC7027.H>

#include "interrupt.h"
#include "LED.H"
#include "ARM_00_OS_TaskSwitch.H"
#include "my_type.h"
#include "ARM_00_OS_Core.H"
#include "UART.H"
#include "KEYS.H"
#include "Task.h"


#define OSMemoryLack       0x0000000100000000  /*錯(cuò)誤號(hào):內(nèi)存資源不足*/

/**********************************************************************************************
功能:內(nèi)存管理。
入口參數(shù)1:Operation。操作方式?梢栽O(shè)置為MEMORY_ALLOCATION(分配)、MEMORY_FREE(釋放)、統(tǒng)計(jì)使用量(MEMORY_STATISTIC)
入口參數(shù)2:StartAddr。起始地址,釋放內(nèi)存時(shí)使用。
入口參數(shù)3:Length。申請(qǐng)內(nèi)存或釋放內(nèi)存時(shí)的長度,單位為字節(jié)。但實(shí)際分配時(shí),是按塊分配的,所以分配時(shí),
           實(shí)際分配到的數(shù)量可能會(huì)比指定的多,所以分配時(shí),最好按塊的整數(shù)倍大小來指定分配長度。
           
返回:32無符號(hào)型整數(shù)。
      當(dāng)操作為分配內(nèi)存時(shí),返回32位的內(nèi)存首地址,返回0表示無足夠多的可以用內(nèi)存。
      當(dāng)操作為釋放內(nèi)存時(shí),返回1表示釋放成功。返回0表示釋放出錯(cuò)。
      當(dāng)操作為統(tǒng)計(jì)內(nèi)存使用量時(shí),返回的是內(nèi)存被使用的字節(jié)數(shù)。
      當(dāng)操作為獲取緩沖池大小時(shí),返回的是內(nèi)存緩沖池大小。

備注:緩沖池大小由OSSizeOfMemoryPool指定。每塊的大小由OSSizePerBlock指定             
**********************************************************************************************/
uint32 OSMemoryManage(uint32 Operation,uint32 StartAddr,uint32 Length)
{
  //內(nèi)存分配表
  //內(nèi)存分配表是32位整數(shù)的一維數(shù)組。用每一位來表示一塊是否被使用。當(dāng)某位設(shè)置為1時(shí),表示那一塊被使用。
  //當(dāng)某位為0時(shí),表示那一塊可用。
static uint32  OSMemoryTable[OSSizeOfMemoryPool/OSSizePerBlock/32];
                                                                      
static uint32 OSMemoryPool[OSSizeOfMemoryPool/4]; //內(nèi)存緩沖池。內(nèi)存緩沖池為一個(gè)大是數(shù)組

uint32 BlankCount;    //統(tǒng)計(jì)空塊的計(jì)數(shù)器
uint32 Mask;          //分配內(nèi)存時(shí)用的掩碼
volatile uint32 i,j;  //循環(huán)用的變量

OSEnterCritical();   //進(jìn)入臨界段

SWITCH(Operation)     //根據(jù)操作碼,選擇不同的操作
  {
   case MEMORY_INIT:   //如果是內(nèi)存初始化
    {
     for(i=0;i<OSSizeOfMemoryPool/OSSizePerBlock/32;i++)
      {
       OSMemoryTable[i]=0;  //則將整張內(nèi)存分配表清0
      }
     OSExitCritical();  //退出臨界段
     return 1;   //返回1
    }

   case MEMORY_ALLOCATION:  //如果是內(nèi)存分配,則
    {
     BlankCount=0;   //先將內(nèi)存空塊的數(shù)量清0
     for(i=0;i<(OSSizeOfMemoryPool/OSSizePerBlock/32);i++)  //掃描整個(gè)內(nèi)存分配表
      {
       Mask=1;   //掩碼被設(shè)置為1,即最低位為1,其它位為0。
       if(OSMemoryTable[i]==0xFFFFFFFF)  //如果該字中的所以位都為1,表示該字節(jié)對(duì)應(yīng)的所有塊都被占用
        {
         BlankCount=0;  //空塊計(jì)數(shù)器置0
         continue;      //退出本次循環(huán),查找下一個(gè)字
        }
       for(j=0;j<32;j++)  //掃描一個(gè)字的32個(gè)bit是否有空閑的RAM
        {
         if((Mask & OSMemoryTable[i])==0)  //如果該位為0,表示該塊空閑
          {
           BlankCount++;   //空塊計(jì)數(shù)器加1。
          }
         else
          {
           BlankCount=0;  //如果遇到非空塊,則空塊計(jì)數(shù)器置0。
          }
         if((BlankCount*OSSizePerBlock)>=Length)  //如果空閑的RAM,大于或者等于需要的長度,那么分配成功
          {
           //計(jì)算被分配到的內(nèi)存的起始地址,并將其保存在StartAddr中。
           StartAddr=((uint32)OSMemoryPool)+(i*32+j+1)*OSSizePerBlock-OSSizePerBlock*BlankCount;
           while(1)  //設(shè)置被使用的塊為1
            {
             OSMemoryTable[i] |=Mask;  //將已經(jīng)被分配的標(biāo)志為1
             Mask>>=1;   //調(diào)整掩碼的值
             if(j==0)   //如果已到最低位
              {
               Mask=0x80000000; //則掩碼調(diào)整為第31位為1
               j=32;
         &nbs
3樓: >>參與討論
lpc2000
在嵌入式環(huán)境里,malloc和free要自己寫
不要去用現(xiàn)成的。

有的時(shí)候,malloc(0)回答1,還有free什么也不回,你怎么知道是不是free了呢?最好的是,寫自己的malloc和free,自己定malloc的范圍,自己來回挪指針。這樣你就不用擔(dān)心是malloc不對(duì),還是free不對(duì)了。

例子的話,網(wǎng)上都有。比如,

#define NULL 0
#define ALLOCSIZE 100

static CHAR allocbuf[ALLOCSIZE];
static CHAR *allocptr = allocbuf;

CHAR *alloc(n)
{
    if ( allocptr + n <= allocbuf + ALLOCSIZE)
    {
      allocptr += n;
      return( allocptr - n );
    }
    else
    {
      return ( NULL );
    }
}

free( p )
{
    if ( p >= allocbuf && p < allocbuf + BUFSIZE )
    {
       allocptr = p;
    }
}


4樓: >>參與討論
twentyone
RE
樓上的說的對(duì).大伙習(xí)慣用MALLOC和FREE是在WINDOWS/LINUX平臺(tái)下養(yǎng)成的習(xí)慣.在WINDOWS/LINUX平臺(tái)下,MALLOC和FREE是由操作系統(tǒng)提供支持的.如果你直接在板子上做開發(fā),又要用MALLOC和FREE的話,需要自己實(shí)現(xiàn),而且要注意分配好存儲(chǔ).



5樓: >>參與討論
slump
ecos有完整c庫支持
不用費(fèi)心自己寫了:)

6樓: >>參與討論
db10
研究了你寫的內(nèi)存管理程序 感覺不錯(cuò)
  準(zhǔn)備在項(xiàng)目中用一用,感覺用自幾寫要放心點(diǎn)。

7樓: >>參與討論
computer00
當(dāng)時(shí)寫得太匆忙,剛看了一下,前面部分又做了一點(diǎn)點(diǎn)改動(dòng):
/**********************************************************************************************
功能:內(nèi)存管理。
入口參數(shù)1:Operation。操作方式。
           可以設(shè)置為MEMORY_ALLOCATION(分配)、MEMORY_FREE(釋放)、MEMORY_STATISTIC(統(tǒng)計(jì)使用量)
           MEMORY_INIT(初始化)、MEMORY_TEST(內(nèi)存檢測)、GET_MEMORY_POOL_SIZE(獲取緩沖池大。
入口參數(shù)2:StartAddr。起始地址,釋放內(nèi)存時(shí)使用。
入口參數(shù)3:Length。申請(qǐng)內(nèi)存或釋放內(nèi)存時(shí)的長度,單位為字節(jié)。但實(shí)際分配時(shí),是按塊分配的,所以分配時(shí),
           實(shí)際分配到的數(shù)量可能會(huì)比指定的多,所以分配時(shí),最好按塊的整數(shù)倍大小來指定分配長度。
           
返回:32無符號(hào)型整數(shù)。
      當(dāng)操作為分配內(nèi)存時(shí),返回32位的內(nèi)存首地址,返回0表示無足夠多的可以用內(nèi)存。
      當(dāng)操作為釋放內(nèi)存時(shí),返回1表示釋放成功。返回0表示釋放出錯(cuò)。
      當(dāng)操作為統(tǒng)計(jì)內(nèi)存使用量時(shí),返回的是內(nèi)存被使用的字節(jié)數(shù)。
      當(dāng)操作為獲取緩沖池大小時(shí),返回的是內(nèi)存緩沖池大小。

備注:緩沖池大小由OSSizeOfMemoryPool指定。每塊的大小由OSSizePerBlock指定             
**********************************************************************************************/
uint32 OSMemoryManage(uint32 Operation,uint32 StartAddr,uint32 Length)
{
  //內(nèi)存分配表
  //內(nèi)存分配表是32位整數(shù)的一維數(shù)組。用每一位來表示一塊是否被使用。當(dāng)某位設(shè)置為1時(shí),表示那一塊被使用。
  //當(dāng)某位為0時(shí),表示那一塊可用。
static uint32  OSMemoryTable[OSSizeOfMemoryPool/OSSizePerBlock/32];
                                                                      
static uint32 OSMemoryPool[OSSizeOfMemoryPool/4]; //內(nèi)存緩沖池。內(nèi)存緩沖池為一個(gè)大是數(shù)組

uint32 BlankCount;    //統(tǒng)計(jì)空塊的計(jì)數(shù)器
uint32 Mask;          //分配內(nèi)存時(shí)用的掩碼
volatile uint32 i,j;  //循環(huán)用的變量

OSEnterCritical();   //進(jìn)入臨界段

SWITCH(Operation)     //根據(jù)操作碼,選擇不同的操作
  {
   case MEMORY_INIT:   //如果是內(nèi)存初始化
    {
     for(i=0;i<OSSizeOfMemoryPool/OSSizePerBlock/32;i++)
      {
       OSMemoryTable[i]=0;  //則將整張內(nèi)存分配表清0
      }
     for(i=0;i<OSSizeOfMemoryPool/4;i++)   //內(nèi)存緩沖池全部清0
      {
       OSMemoryPool[i]=0;
      }
     OSExitCritical();  //退出臨界段
     return 1;   //返回1
    }

   case MEMORY_ALLOCATION:  //如果是內(nèi)存分配,則
    {
     BlankCount=0;   //先將內(nèi)存空塊的數(shù)量清0
     for(i=0;i<(OSSizeOfMemoryPool/OSSizePerBlock/32);i++)  //掃描整個(gè)內(nèi)存分配表
      {
       if(OSMemoryTable[i]==0xFFFFFFFF)  //如果該字中的所以位都為1,表示該字節(jié)對(duì)應(yīng)的所有塊都被占用
        {
         BlankCount=0;  //空塊計(jì)數(shù)器置0
         continue;      //退出本次循環(huán),查找下一個(gè)字
        }
       Mask=1;   //掩碼被設(shè)置為1,即最低位為1,其它位為0。
       for(j=0;j<32;j++)  //掃描一個(gè)字的32個(gè)bit是否有空閑的RAM
        {
         if((Mask & OSMemoryTable[i])==0)  //如果該位為0,表示該塊空閑
          {
           BlankCount++;   //空塊計(jì)數(shù)器加1。
          }
         else
          {
           BlankCount=0;  //如果遇到非空塊,則空塊計(jì)數(shù)器置0。
          }
         if((BlankCount*OSSizePerBlock)>=Length)  //如果空閑的RAM,大于或者等于需要的長度,那么分配成功
          {
           //計(jì)算被分配到的內(nèi)存的起始地址,并將其保存在StartAddr中。
           StartAddr=((uint32)OSMemoryPool)+(i*32+j+1)*OSSizePerBlock-OSSizePerBlock*BlankCount;
           while(1)  //設(shè)置被使用的塊為1
            {
             OSMemoryTable[i] |=Mask;  //將已經(jīng)被分配的標(biāo)志為1
             Mask>>=1;   //調(diào)整掩碼的值
             if(j==0)   //如果已到最低位
              {
               Mask=0x80000000; //則掩碼調(diào)整為第31位為1
               j=32;
               i--;  //移到下一位
              }
             BlankCount--;  //空塊計(jì)數(shù)減1
             j--;   //移到下一個(gè)字
             if(BlankCount==0)  //如果空塊計(jì)數(shù)器減到0,則標(biāo)志完畢
              {
               OSExitCritical();
               return StartAddr;   //將啟始地址StartAddr返回
              }
            }
   &n
8樓: >>參與討論
db10
剛才用了以下感覺還可以
 你又改了?跟以前的比是拿部分改動(dòng)了?

9樓: >>參與討論
computer00
改了一點(diǎn)點(diǎn)^_^
添加了緩沖池清0

     for(i=0;i<OSSizeOfMemoryPool/4;i++)   //內(nèi)存緩沖池全部清0
      {
       OSMemoryPool[i]=0;
      }



       if(OSMemoryTable[i]==0xFFFFFFFF)  //如果該字中的所以位都為1,表示該字節(jié)對(duì)應(yīng)的所有塊都被占用
        {
         BlankCount=0;  //空塊計(jì)數(shù)器置0
         continue;      //退出本次循環(huán),查找下一個(gè)字
        }
       Mask=1;   //掩碼被設(shè)置為1,即最低位為1,其它位為0。


以及把mask=1放到下面。

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
ADS中的程序如何修改才符合keil for arm編譯器
請(qǐng)問有多少人用keil.
JTAG裝載調(diào)試程序的超級(jí)GUG!!
我有一塊2214的板子,尋一和我共同開發(fā)的能人,有錢拿哦!
請(qǐng)教I2C的器件從地址問題
免費(fèi)注冊(cè)為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào)