| 
 ucos-ii学习笔记——动态内存分配原理及使用   Created on: 2012-10-8       Author: zhang bin   学习笔记 for ucos-ii  PC redesigned by zhang bin 2012-10-8 All Rights Reserved           #include "INCLUDES.h"   #define  TASK_STK_SIZE        512                       OS_STK        StartTaskStk[TASK_STK_SIZE];     OS_STK        MyTaskStk[TASK_STK_SIZE];   OS_MEM        *IntBuffer;      //定义内存控制块指针,也即是指向内存分区的指针,创建一个 //内存分区时,返回值就是它  OS_MEM 内存控制块类型的指针 INT8U         IntPart[50][64];  //划分一个具有50个内存块,每个内存块长度是64个字节的内存分区 INT8U         *IntBlkPtr;      //定义内存块指针  无符号char型的     char *s1= "Mytask is running"; //char *s2= "Youtask is running"; //char *s3= "Hertask is running";   INT8U  err;  //存放错误信息 INT8U  y=0;   //字符显示位置     void  StartTask(void *data);                void  MyTask(void *data);                           void  main (void) {     OSInit();                                                   PC_DOSSaveReturn();                                         PC_VectSet(uCOS, OSCtxSw);                                       IntBuffer=OSMemCreate(IntPart,50,64,&err);    //创建动态内存区 函数参数为:IntPart为内存分区的起始地址     //前面已经定义了INT8U  IntPart[50][64];表示内存分区,用数组名表示起始地址     //第二个参数50表示分区中内存块的数目,第三个参数64表示每个内存块的字节数,最后&err为错误信息     //上面也定义了INT8U  err; //存放错误信息     //函数的返回值为创建的内存分区的指针,为OS_MEM 内存控制块类型的指针,上面定义了     //OS_MEM  *IntBuffer; //定义内存控制块指针          OSTaskCreate(StartTask, (void *)0, &StartTaskStk[TASK_STK_SIZE - 1], 0); //创建起始任务          OSStart();            }       void  StartTask(void *pdata) { #if OS_CRITICAL_METHOD == 3         OS_CPU_SR  cpu_sr; #endif     INT16S        key;                  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); //创建任务MyTask          for (;;)      {      //如果恩下ESC键,则退出UC/OS-II         if (PC_GetKey(&key) == TRUE)          {                                  if (key == 0x1B)              {                                              PC_DOSReturn();                                         }         }         OSTimeDlyHMSM(0, 0, 3, 0);                              } }         void MyTask(void *pdata) { #if OS_CRITICAL_METHOD == 3          OS_CPU_SR  cpu_sr; #endif pdata=pdata; for( ; ; ) { IntBlkPtr=OSMemGet(IntBuffer,&err);  //请求内存块 从已经建立的内存分区中申请一个内存块 //函数的参数为指向内存分区的指针,上面已经创建了内存分区IntBuffer //函数的返回值为内存块指针,上面定义了 INT8U    *IntBlkPtr;      //定义内存块指针  无符号char型的   *IntBlkPtr=1;  //在申请到的内存块中存入1  //注意,应用程序在使用内存块时,必须知道内存块的大小,并且在使用时不能超过该容量 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);  //释放内存块 当应用程序不再使用这个内存块后,必须及时把它释放, //重新放入相应的内存分区中 //函数中的第一个参数IntBuffer为内存块所属的内存分区的指针,IntBlkPtr为待释放内存块指针 //在使用函数OSMemPut()释放内存块时,一定要确保把该内存块释放到它原来所属的内存分区中 //否则会引起灾难性的后果   OSTimeDlyHMSM(0,0,1,0);  //等待1s } }    
 
 |