中科因仑“3+1”工程特种兵精英论坛

标题: ucos-ii学习笔记——动态内存分配原理及使用 [打印本页]

作者: leixiaofeng    时间: 2015-4-13 21:08
标题: ucos-ii学习笔记——动态内存分配原理及使用
ucos-ii学习笔记——动态内存分配原理及使用
Created on: 2012-10-8
      Author: zhang bin
学习笔记
for ucos-ii  PC
redesigned by zhang bin
2012-10-8
versions:V-0.1
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
}
}







欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) Powered by Discuz! X3.4