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 } }
|