<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ucos-ii學(xué)習(xí)筆記——?jiǎng)討B(tài)內(nèi)存分配原理及使用

          ucos-ii學(xué)習(xí)筆記——?jiǎng)討B(tài)內(nèi)存分配原理及使用

          作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò) 收藏
          Createdon:2012-10-8

          Author:zhangbin

          本文引用地址:http://www.ex-cimer.com/article/201611/322853.htm

          學(xué)習(xí)筆記

          forucos-iiPC

          redesignedbyzhangbin

          2012-10-8

          versions:V-0.1

          AllRightsReserved

          #include"INCLUDES.h"

          #defineTASK_STK_SIZE512

          OS_STKStartTaskStk[TASK_STK_SIZE];

          OS_STKMyTaskStk[TASK_STK_SIZE];

          OS_MEM*IntBuffer;//定義內(nèi)存控制塊指針,也即是指向內(nèi)存分區(qū)的指針,創(chuàng)建一個(gè)

          //內(nèi)存分區(qū)時(shí),返回值就是它OS_MEM內(nèi)存控制塊類(lèi)型的指針

          INT8UIntPart[50][64];//劃分一個(gè)具有50個(gè)內(nèi)存塊,每個(gè)內(nèi)存塊長(zhǎng)度是64個(gè)字節(jié)的內(nèi)存分區(qū)

          INT8U*IntBlkPtr;//定義內(nèi)存塊指針無(wú)符號(hào)char型的

          char*s1="Mytaskisrunning";

          //char*s2="Youtaskisrunning";

          //char*s3="Hertaskisrunning";

          INT8Uerr;//存放錯(cuò)誤信息

          INT8Uy=0;//字符顯示位置

          voidStartTask(void*data);

          voidMyTask(void*data);

          voidmain(void)

          {

          OSInit();

          PC_DOSSaveReturn();

          PC_VectSet(uCOS,OSCtxSw);

          IntBuffer=OSMemCreate(IntPart,50,64,&err);//創(chuàng)建動(dòng)態(tài)內(nèi)存區(qū)函數(shù)參數(shù)為:IntPart為內(nèi)存分區(qū)的起始地址

          //前面已經(jīng)定義了INT8UIntPart[50][64];表示內(nèi)存分區(qū),用數(shù)組名表示起始地址

          //第二個(gè)參數(shù)50表示分區(qū)中內(nèi)存塊的數(shù)目,第三個(gè)參數(shù)64表示每個(gè)內(nèi)存塊的字節(jié)數(shù),最后&err為錯(cuò)誤信息

          //上面也定義了INT8Uerr;//存放錯(cuò)誤信息

          //函數(shù)的返回值為創(chuàng)建的內(nèi)存分區(qū)的指針,為OS_MEM內(nèi)存控制塊類(lèi)型的指針,上面定義了

          //OS_MEM*IntBuffer;//定義內(nèi)存控制塊指針

          OSTaskCreate(StartTask,(void*)0,&StartTaskStk[TASK_STK_SIZE-1],0);//創(chuàng)建起始任務(wù)

          OSStart();

          }

          voidStartTask(void*pdata)

          {

          #ifOS_CRITICAL_METHOD==3

          OS_CPU_SRcpu_sr;

          #endif

          INT16Skey;

          pdata=pdata;

          OS_ENTER_CRITICAL();

          PC_VectSet(0x08,OSTickISR);

          PC_SetTickRate(OS_TICKS_PER_SEC);

          OS_EXIT_CRITICAL();

          OSStatInit();

          OSTaskCreate(MyTask,(void*)0,&MyTaskStk[TASK_STK_SIZE-1],3);//創(chuàng)建任務(wù)MyTask

          for(;;)

          {

          //如果恩下ESC鍵,則退出UC/OS-II

          if(PC_GetKey(&key)==TRUE)

          {

          if(key==0x1B)

          {

          PC_DOSReturn();

          }

          }

          OSTimeDlyHMSM(0,0,3,0);

          }

          }

          voidMyTask(void*pdata)

          {

          #ifOS_CRITICAL_METHOD==3

          OS_CPU_SRcpu_sr;

          #endif

          pdata=pdata;

          for(;;)

          {

          IntBlkPtr=OSMemGet(IntBuffer,&err);//請(qǐng)求內(nèi)存塊從已經(jīng)建立的內(nèi)存分區(qū)中申請(qǐng)一個(gè)內(nèi)存塊

          //函數(shù)的參數(shù)為指向內(nèi)存分區(qū)的指針,上面已經(jīng)創(chuàng)建了內(nèi)存分區(qū)IntBuffer

          //函數(shù)的返回值為內(nèi)存塊指針,上面定義了INT8U*IntBlkPtr;//定義內(nèi)存塊指針無(wú)符號(hào)char型的

          *IntBlkPtr=1;//在申請(qǐng)到的內(nèi)存塊中存入1

          //注意,應(yīng)用程序在使用內(nèi)存塊時(shí),必須知道內(nèi)存塊的大小,并且在使用時(shí)不能超過(guò)該容量

          PC_DispStr(*IntBlkPtr*10,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);//顯示信息

          *++IntBlkPtr=2;//???

          PC_DispStr(*IntBlkPtr*10,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);

          IntBlkPtr--;//???

          OSMemPut(IntBuffer,IntBlkPtr);//釋放內(nèi)存塊當(dāng)應(yīng)用程序不再使用這個(gè)內(nèi)存塊后,必須及時(shí)把它釋放,

          //重新放入相應(yīng)的內(nèi)存分區(qū)中

          //函數(shù)中的第一個(gè)參數(shù)IntBuffer為內(nèi)存塊所屬的內(nèi)存分區(qū)的指針,IntBlkPtr為待釋放內(nèi)存塊指針

          //在使用函數(shù)OSMemPut()釋放內(nèi)存塊時(shí),一定要確保把該內(nèi)存塊釋放到它原來(lái)所屬的內(nèi)存分區(qū)中

          //否則會(huì)引起災(zāi)難性的后果

          OSTimeDlyHMSM(0,0,1,0);//等待1s

          }

          }

          //上面程序中*++IntBlkPtr=2;//???和IntBlkPtr--;//???的意思和作用還沒(méi)有搞清楚

          #include"INCLUDES.h"

          #defineTASK_STK_SIZE512

          OS_STKStartTaskStk[TASK_STK_SIZE];

          OS_STKMyTaskStk[TASK_STK_SIZE];

          OS_STKYouTaskStk[TASK_STK_SIZE];

          OS_STKHerTaskStk[TASK_STK_SIZE];

          char*s;

          char*s1="Mytask";

          char*s2="Youtask";

          char*s3="Hertask";

          INT8Uerr;//錯(cuò)誤信息

          INT8Uy=0;//字符顯示位置

          INT8UTimes=0;

          OS_MEM*IntBuffer;//定義內(nèi)存控制塊指針,創(chuàng)建一個(gè)內(nèi)存分區(qū)時(shí),返回值就是它

          INT8UIntPart[8][6];//劃分一個(gè)具有8個(gè)內(nèi)存塊,每個(gè)內(nèi)存塊長(zhǎng)度是6個(gè)字節(jié)的內(nèi)存分區(qū)

          INT8U*IntBlkPtr;//定義內(nèi)存塊指針INT8U型的

          OS_MEM_DATAMemInfo;//存放內(nèi)存分區(qū)的狀態(tài)信息該數(shù)據(jù)結(jié)構(gòu)存放查詢動(dòng)態(tài)內(nèi)存分區(qū)狀態(tài)函數(shù)OSMemQuery()

          //查詢到的動(dòng)態(tài)內(nèi)存分區(qū)狀態(tài)的信息是一個(gè)SO_MEM_DATA型的數(shù)據(jù)結(jié)構(gòu)OSMemQuery()函數(shù)查詢到的內(nèi)存分區(qū)

          //的有關(guān)信息就放在這個(gè)數(shù)據(jù)結(jié)構(gòu)中

          voidStartTask(void*data);

          voidMyTask(void*data);

          voidYouTask(void*data);

          voidHerTask(void*data);

          voidmain(void)

          {

          OSInit();

          PC_DOSSaveReturn();

          PC_VectSet(uCOS,OSCtxSw);

          IntBuffer=OSMemCreate(IntPart,8,6,&err);//創(chuàng)建動(dòng)態(tài)內(nèi)存區(qū)

          OSTaskCreate(StartTask,(void*)0,&StartTaskStk[TASK_STK_SIZE-1],0);//創(chuàng)建起始函數(shù)

          OSStart();

          }

          voidStartTask(void*pdata)

          {

          #ifOS_CRITICAL_METHOD==3

          OS_CPU_SRcpu_sr;

          #endif

          INT16Skey;

          pdata=pdata;

          OS_ENTER_CRITICAL();

          PC_VectSet(0x08,OSTickISR);

          PC_SetTickRate(OS_TICKS_PER_SEC);

          OS_EXIT_CRITICAL();

          OSStatInit();

          OSTaskCreate(MyTask,(void*)0,&MyTaskStk[TASK_STK_SIZE-1],3);//創(chuàng)建任務(wù)

          OSTaskCreate(YouTask,(void*)0,&YouTaskStk[TASK_STK_SIZE-1],4);

          OSTaskCreate(HerTask,(void*)0,&HerTaskStk[TASK_STK_SIZE-1],5);

          for(;;)

          {

          //如果恩下ESC鍵,則退出UC/OS-II

          if(PC_GetKey(&key)==TRUE)

          {

          if(key==0x1B)

          {

          PC_DOSReturn();

          }

          }

          OSTimeDlyHMSM(0,0,3,0);

          }

          }

          voidMyTask(void*pdata)

          {

          #ifOS_CRITICAL_METHOD==3

          OS_CPU_SRcpu_sr;

          #endif

          pdata=pdata;

          for(;;)

          {

          PC_DispStr(10,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);//顯示信息

          IntBlkPtr=OSMemGet(//請(qǐng)求內(nèi)存塊

          IntBuffer,//內(nèi)存分區(qū)的指針

          &err);//錯(cuò)誤信息

          OSMemQuery(//查詢內(nèi)存控制塊信息

          IntBuffer,//帶查詢內(nèi)存控制塊指針

          &MemInfo);

          sprintf(s,"%0x",MemInfo.OSFreeList);//顯示頭指針把得到的空閑內(nèi)存塊鏈表首地址的指針?lè)诺街羔榮所指的空間中

          PC_DispStr(30,y,s,DISP_BGND_BLACK+DISP_FGND_WHITE);//把空閑內(nèi)存塊鏈表首地址的指針顯示出來(lái)

          sprintf(s,"%d",MemInfo.OSNUsed);//顯示已用的內(nèi)存塊數(shù)目

          PC_DispStr(40,y,s,DISP_BGND_BLACK+DISP_FGND_WHITE);

          if(Times>=5)//運(yùn)行六次后

          {

          OSMemPut(//釋放內(nèi)存塊函數(shù)

          IntBuffer,//內(nèi)存塊所屬內(nèi)存分區(qū)的指針

          IntBlkPtr//待釋放內(nèi)存塊指針

          //此次釋放,只能釋放最后一次申請(qǐng)到的內(nèi)存塊,前面因?yàn)镮ntBlkPtr被后面的給覆蓋掉了,所以釋放

          //不了。

          );

          }

          Times++;//運(yùn)行次數(shù)加1

          OSTimeDlyHMSM(0,0,1,0);//等待1s

          }

          }

          voidYouTask(void*pdata)

          {

          #ifOS_CRITICAL_METHOD==3

          OS_CPU_SRcpu_sr;

          #endif

          pdata=pdata;

          for(;;)

          {

          PC_DispStr(10,++y,s2,DISP_BGND_BLACK+DISP_FGND_WHITE);

          IntBlkPtr=OSMemGet(//請(qǐng)求內(nèi)存塊

          IntBuffer,//內(nèi)存分區(qū)的指針

          &err);//錯(cuò)誤信息

          OSMemQuery(//查詢內(nèi)存控制塊信息

          IntBuffer,//待查詢內(nèi)存控制塊指針

          &MemInfo);

          sprintf(s,"%0x",MemInfo.OSFreeList);//顯示頭指針

          PC_DispStr(30,y,s,DISP_BGND_BLACK+DISP_FGND_WHITE);

          sprintf(s,"%d",MemInfo.OSNUsed);//顯示已用的內(nèi)存塊數(shù)目

          PC_DispStr(40,y,s,DISP_BGND_BLACK+DISP_FGND_WHITE);

          OSMemPut(//釋放內(nèi)存塊

          IntBuffer,//內(nèi)存塊所屬內(nèi)存分區(qū)的指針

          IntBlkPtr//待釋放內(nèi)存塊指針

          );

          OSTimeDlyHMSM(0,0,2,0);//等待2s

          }

          }

          voidHerTask(void*pdata)

          {

          #ifOS_CRITICAL_METHOD==3

          OS_CPU_SRcpu_sr;

          #endif

          pdata=pdata;

          for(;;)

          {

          PC_DispStr(10,++y,s3,DISP_BGND_BLACK+DISP_FGND_WHITE);

          IntBlkPtr=OSMemGet(//請(qǐng)求內(nèi)存塊

          IntBuffer,//內(nèi)存分區(qū)的指針

          &err);//錯(cuò)誤信息

          OSMemQuery(//查詢內(nèi)存控制塊信息

          IntBuffer,//待查詢內(nèi)存控制塊指針

          &MemInfo);

          sprintf(s,"%0x",MemInfo.OSFreeList);//顯示頭指針

          PC_DispStr(30,y,s,DISP_BGND_BLACK+DISP_FGND_WHITE);

          sprintf(s,"%d",MemInfo.OSNUsed);//顯示已用的內(nèi)存塊數(shù)目

          PC_DispStr(40,y,s,DISP_BGND_BLACK+DISP_FGND_WHITE);

          OSMemPut(

          IntBuffer,//內(nèi)存塊所屬內(nèi)存分區(qū)的指針

          IntBlkPtr//待釋放內(nèi)存塊指針

          );

          OSTimeDlyHMSM(0,0,1,0);//等待1s

          }

          }

          //根據(jù)上面的分析可以很容易分析運(yùn)行的現(xiàn)象了,從現(xiàn)象中可以看出,任務(wù)YouTask和HerTask申請(qǐng)了內(nèi)存塊使用完了

          //后就釋放了,而任務(wù)MyTask要一直到運(yùn)行了6次后才釋放所申請(qǐng)的內(nèi)存塊



          評(píng)論


          相關(guān)推薦

          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();