ucos-ii学习笔记——动态内存分配原理及使用

发布者:WanderlustHeart最新更新时间:2015-08-18 来源: eefocus关键字: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 ==    

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

    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

}

}

 

//上面程序中*++IntBlkPtr=2;  //??? 和IntBlkPtr--;   //???的意思和作用还没有搞清楚

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

#include "INCLUDES.h"

 

#define  TASK_STK_SIZE        512                    

 

OS_STK        StartTaskStk[TASK_STK_SIZE];    

OS_STK        MyTaskStk[TASK_STK_SIZE];

OS_STK        YouTaskStk[TASK_STK_SIZE];

OS_STK        HerTaskStk[TASK_STK_SIZE];

 

char *s;

char *s1= "Mytask  ";

char *s2= "Youtask ";

char *s3= "Hertask ";

INT8U  err;  //错误信息

INT8U  y=0;   //字符显示位置  

INT8U  Times=0;

 

OS_MEM        *IntBuffer;      //定义内存控制块指针,创建一个内存分区时,返回值就是它

 

INT8U         IntPart[8][6];  //划分一个具有8个内存块,每个内存块长度是6个字节的内存分区

INT8U         *IntBlkPtr;      //定义内存块指针  INT8U型的

 

OS_MEM_DATA MemInfo;   //存放内存分区的状态信息  该数据结构存放查询动态内存分区状态函数OSMemQuery()

//查询到的动态内存分区状态的信息 是一个SO_MEM_DATA型的数据结构  OSMemQuery()函数查询到的内存分区

//的有关信息就放在这个数据结构中

 

void  StartTask(void *data);               

void  MyTask(void *data);                  

void  YouTask(void *data);                 

void  HerTask(void *data);                 

 

 

 

void  main (void)

{

    OSInit();                                              

    PC_DOSSaveReturn();                                    

    PC_VectSet(uCOS, OSCtxSw);                             

    

    IntBuffer=OSMemCreate(IntPart,8,6,&err);    //创建动态内存区

    

    OSTaskCreate(StartTask, (void *)0, &StartTaskStk[TASK_STK_SIZE 1], 0); //创建起始函数

    

    OSStart();                                             

}

 

 

 

void  StartTask(void *pdata)

{

#if OS_CRITICAL_METHOD ==                                

    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); //创建任务

    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);                         

    }

}

 

 

void MyTask(void *pdata)

{

#if OS_CRITICAL_METHOD ==                                

    OS_CPU_SR  cpu_sr;

#endif

pdata=pdata;

for( )

{

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

 

IntBlkPtr=OSMemGet(            //请求内存块

                  IntBuffer,   //内存分区的指针

                  &err);       //错误信息

                  

    OSMemQuery(        //查询内存控制块信息

     IntBuffer,     //带查询内存控制块指针

&MemInfo);

 

sprintf(s,"%0x",MemInfo.OSFreeList);  //显示头指针 把得到的空闲内存块链表首地址的指针放到指针s所指的空间中

 

PC_DispStr(30,y,s,DISP_BGND_BLACK+DISP_FGND_WHITE);  //把空闲内存块链表首地址的指针显示出来

 

sprintf(s,"%d",MemInfo.OSNUsed);  //显示已用的内存块数目

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

 

if(Times>=5)  //运行六次后

{

OSMemPut(  //释放内存块函数

IntBuffer,  //内存块所属内存分区的指针

IntBlkPtr  //待释放内存块指针

//此次释放,只能释放最后一次申请到的内存块,前面因为IntBlkPtr被后面的给覆盖掉了,所以释放

//不了。

);

}

 

Times++;  //运行次数加1

 

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

}

}

 

 

void YouTask(void *pdata)

{

#if OS_CRITICAL_METHOD ==                                

    OS_CPU_SR  cpu_sr;

#endif

pdata=pdata;

for( )

{

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

 

IntBlkPtr=OSMemGet(            //请求内存块

                  IntBuffer,   //内存分区的指针

                  &err);       //错误信息

                  

    OSMemQuery(        //查询内存控制块信息

     IntBuffer,     //待查询内存控制块指针

&MemInfo);

 

sprintf(s,"%0x",MemInfo.OSFreeList);  //显示头指针

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

 

sprintf(s,"%d",MemInfo.OSNUsed);  //显示已用的内存块数目

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

 

OSMemPut(    //释放内存块

IntBuffer,   //内存块所属内存分区的指针

IntBlkPtr    //待释放内存块指针

);

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

}

}

 

void HerTask(void *pdata)

{

#if OS_CRITICAL_METHOD ==                                

    OS_CPU_SR  cpu_sr;

#endif

pdata=pdata;

for( )

{

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

IntBlkPtr=OSMemGet(            //请求内存块

                  IntBuffer,   //内存分区的指针

                  &err);       //错误信息

    OSMemQuery(        //查询内存控制块信息

     IntBuffer,     //待查询内存控制块指针

&MemInfo);

sprintf(s,"%0x",MemInfo.OSFreeList);  //显示头指针

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

sprintf(s,"%d",MemInfo.OSNUsed);  //显示已用的内存块数目

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

OSMemPut(

IntBuffer,   //内存块所属内存分区的指针

IntBlkPtr    //待释放内存块指针

);

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

}

}

 

//根据上面的分析可以很容易分析运行的现象了,从现象中可以看出,任务YouTask和HerTask申请了内存块使用完了

//后就释放了,而任务MyTask要一直到运行了6次后才释放所申请的内存块

关键字:ucos-ii  动态内存  分配原理 引用地址:ucos-ii学习笔记——动态内存分配原理及使用

上一篇:ucos-ii学习笔记——s12移植成功main函数
下一篇:ucos-ii学习笔记——信号量集(事件标志组)的原理及使用

推荐阅读最新更新时间:2024-03-16 14:29

ucos-ii应用在嵌入式智能视觉监控系统中
1 系统硬件平台设计   系统使用的主芯片是ADI公司Blackfin系列DSP中的BF533,这是一款专门面向视频应用的DSP,拥有丰富的外设接口和较好的系统扩展性。本系统利用BF533的PPI接口采集数字图像,利用芯片的EBIU总线,扩展SDRAM和网络芯片。BF533工作在600MHz频率,单个芯片即可完成对运动目标跟踪和网络传输等功能。基于BF533的嵌入式系统的外围电路主要可分为三个部分:图像采集部分,网络传输部分,存储器部分。系统硬件框图如图1: 图1 系统硬件框图   图像采集电路部分采用了TI公司的TVP5150A型视频解码芯片,它将NTSC/PAL/SECAM制式的视频信号转换成8bits的ITU-
[嵌入式]
在51系列单片机上移植uCOS-II
引言:随着各种应用电子系统的复杂化和系统实时性需求的提高,并伴随应用软件朝着系统化方向发展的加速,在16位/32位单片机中广泛使用了嵌入式实时操作系统。然而实际使用中却存在着大量8位单片机,从经济性考虑,对某些应用场合,在8位MCU上使用操作系统是可行的。从学习操作系统角度,uC/OS- II for 51即简单又全面,学习成本低廉,值得推广。 结语:μC/OS-II具有免费、简单、可靠性高、实时性好等优点,但也有缺乏便利开发环境等缺点,尤其不像商用嵌入式系统那样得到广泛使用和持续的研究更新。但开放性又使得开发人员可以自行裁减和添加所需的功能,在许多应用领域发挥着独特的作用。当然,是否在单片机系统中嵌入μC/OS-II应视所开发的项
[单片机]
uC/OS-II在51单片机上的移植1
引言:随着各种应用电子系统的复杂化和系统实时性需求的提高,并伴随应用软件朝着系统化方向发展的加速,在16位/32位单片机中广泛使用了嵌入式实时操作系统。然而实际使用中却存在着大量8位单片机,从经济性考虑,对某些应用场合,在8位MCU上使用操作系统是可行的。从学习操作系统角度,uC/OS-II for 51即简单又全面,学习成本低廉,值得推广。 结语: C/OS-II具有免费、简单、可靠性高、实时性好等优点,但也有缺乏便利开发环境等缺点,尤其不像商用嵌入式系统那样得到广泛使用和持续的研究更新。但开放性又使得开发人员可以自行裁减和添加所需的功能,在许多应用领域发挥着独特的作用。当然,是否在单片机系统中嵌入 C/OS-II应视所开发的项目
[单片机]
UCOS-II在MC9S12XS128上的移植
操作系统是一种与硬件为基础的系统软件,硬件系统不一样,那在其上面运行的操作系统也会不一样。一般来说,操作系统是与芯片相关联的。要在某型号的芯片上运行操作系统,那得在操作系统内核的基础上编写一些与芯片相关的驱动程序,并对内核的配置文件做相应的改动,然后在编译器上编译,链接,然后下载到芯片上。这个过程就是所谓的操作系统的移植了。 UCOS-II是个开源的也就是原代码公开的内核,可以免费用于非商业的各种运用中。其原代码可以在 http://micrium.com/page/products/rtos/os-ii 上找到。上面有好多在某些芯片上移植成功的实例,如果芯片型号对应,则可以下载下来直接用。这样就可以省去好多移植的工作,而直接
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved