(uC/OS-II学习笔记) 内存管理

原文来源:

http://www.cnblogs.com/hebaichuanyeah/

 

ANSI C中,malloc()和free()可以动态分配和释放内存,malloc和free会把内存分割成多个不相邻的的小内存碎片。因为malloc分配内存空间并不固定,执行时间也不确定。

uC/OS-II中OSMemGet()和OSMemPut()执行类似的内存分配工作。因为分配和释放固定且连续的内存空间,故时间确定且不会产生多个内存碎片。

 

在主函数中创建任务及定义相关变量。

OS_STK Task1_Stk[512];  

U8 MyMemory[100][64];

volatile OS_MEM * MyRoom;

void main()
{
    U8 err;
    OSInit();                                               //初始化uC/OS
    
    MyRoom = OSMemCreate(&MyMemory[0][0],100,64,&err);
    OSTaskCreate(Task_1,(void *)0,&Task1_Stk[STARTUP_TASK_STK_SIZE-1],5); 

    OSStart();                                              //启动多任务管理
}

任务

extern volatile OS_MEM * MyRoom;

void Task_1(void *pdata)
{
    U8 err,Count;
    U8 * Mem_Guide;
    char Str[] = "I receive a memory   ";

#if OS_CRITICAL_METHOD == 3   //关中断的方法为3
    OS_CPU_SR cpu_sr;
#endif
    
    OS_ENTER_CRITICAL();
    OS_CPU_SysTickInit(100000000/OS_TICKS_PER_SEC);
    OS_EXIT_CRITICAL();
    
    OSStatInit();   //统计任务 优先级最低
    pdata = pdata;
       

    
    UART4_Init(115200);
 
    
    
    Mem_Guide = OSMemGet((OS_MEM *)MyRoom,&err);
    
    while(1)
    {
        for(Count=0;Str[Count];Count++)
            Mem_Guide[Count] = Str[Count];
        
        for(Count=0;Mem_Guide[Count];Count++)
            Uart4_SendByte(Mem_Guide[Count]);

        //OSMemPut((OS_MEM *)MyRoom,&Mem_Guide[0]);
        
        OSTimeDly(1000);       
    }
    
}

运行结果

 

 

 

原文来源:

http://www.cnblogs.com/hebaichuanyeah/

posted @ 2013-08-14 00:45  默默地EEer  阅读(1076)  评论(0编辑  收藏  举报