【iCore4 双核心板_uC/OS-II】例程十一:内存管理

一、实验说明:

  应用程序在运行中为了某种特殊需要,经常需要临时获得一些内存空间。而作为比较完善的操作系统uC/OS-II,也具有动态分配内存的能力。
  uC/OS-II对内存进行两级管理:把连续内存分成若 干个分区,每个分区又分成若干个大小相等的内存块 来进行管理。操作系统以分区为单位来管理动态内存,而任务以内存块为单位来获得和释放动态内存。内存分区及内存块的使用情况由内存控制块来记录。

二、实验截图:

三、源代码下载链接:

链接:https://pan.baidu.com/s/1DFRuRsmELQRGW7yKRIjhjA 密码:zqzc

四、核心代码:

/*
 * Name                : main
 * Description         : ---
 * Author              : liu.
 *
 * History
 * --------------------
 * Rev                 : 0.00
 * Date                : 07/12/2017
 * 
 * create.
 * --------------------
 */
/*实验现象:
  打开串口工具putty.exe,按下ARM.KEY按键,终端显示当前使用的内存块数量,当超过4时,释放内存块,
  占用的内存块数量不再增加。
  */
int main(void)
{
    system_clock.initialize();                               //系统时钟初始化
    led.initialize();                                        //LED初始化
    usart6.initialize(115200);                               //串口初始化
    key.initialize();

    usart6.printf("\x0c");                                   //清屏    
    usart6.printf("\033[1;32;40m");                          //设置字体终端为绿色
    usart6.printf("\r\n Hello, I am iCore4!\r\n\r\n");
    LED_RED_ON;

    OSInit(); 

    //UCOS初始化
    OSTaskCreate(start_task,                                 //创建开始任务
            (void*)0,                                   //任务参数
            (OS_STK*)&START_TASK_STK[START_STK_SIZE-1], //任务堆栈
            START_TASK_PRIO);                           //任务优先级

    OSStart();                                               //开启UCOS    
}
/*
 * Name                : start_task
 * Description         : ---
 * Author              : liu.
 *
 * History
 * --------------------
 * Rev                 : 0.00
 * Date                : 07/12/2017
 * 
 * create.
 * --------------------
 */
void start_task(void *pdata)
{
    INT8U err;
    OS_CPU_SR cpu_sr;

    OSStatInit();//初始化统计任务

    Mem = OSMemCreate(&buffer[0][0], 10, 10, &err);

    OS_ENTER_CRITICAL();//关中断

    OSTaskCreate(AppTask1_task,(void*)0,(OS_STK*)&AppTask1_TASK_STK[AppTask1_STK_SIZE-1],AppTask1_TASK_PRIO);//创建AppTask1任务
    OSTaskCreate(AppTask2_task,(void*)0,(OS_STK*)&AppTask2_TASK_STK[AppTask2_STK_SIZE-1],AppTask2_TASK_PRIO);//创建AppTask2任务
    OSTaskSuspend(OS_PRIO_SELF);//挂起start_task任务

    OS_EXIT_CRITICAL();//开中断
}
/*
 * Name                : AppTask1_task
 * Description         : ---
 * Author              : liu.
 *
 * History
 * --------------------
 * Rev                 : 0.00
 * Date                : 07/12/2017
 * 
 * create.
 * --------------------
 */
void AppTask1_task(void *pdata)
{
    u8 err;
    INT8U *msg;
    int i = 1;
    while(1){

        if(ARM_KEY_STATE == KEY_DOWN){                        //按键按下                    
            msg = OSMemGet(Mem,&err);                           //申请一个内存块   
            OSMemQuery(Mem,&mem_info);                          //查询内存区状态
            usart6.printf("The number of used memory blocks is %d.\r\n",mem_info.OSNUsed);
            if(i >= 4){            
                err = OSMemPut(Mem,(void *)msg);                 //释放内存块
                if(err == OS_ERR_NONE){ 
                    usart6.printf("Release memory block success!\r\n\r\n"); 
                }
            }
            i++;            
        }
        OSTimeDlyHMSM(0,0,0,500);                            //延时500ms        
    }
}
/*
 * Name                : AppTask2_task
 * Description         : ---
 * Author              : liu.
 *
 * History
 * --------------------
 * Rev                 : 0.00
 * Date                : 07/12/2017
 * 
 * create.
 * --------------------
 */
void AppTask2_task(void *pdata)
{

    while(1){
        LED_RED_ON;
        LED_GREEN_OFF;
        LED_BLUE_OFF;
        OSTimeDlyHMSM(0,0,0,500);//延时500ms        

        LED_RED_OFF;
        LED_GREEN_ON;
        LED_BLUE_OFF;
        OSTimeDlyHMSM(0,0,0,500);//延时500ms    

        LED_RED_OFF;
        LED_GREEN_OFF;
        LED_BLUE_ON;
        OSTimeDlyHMSM(0,0,0,500);//延时500ms    
    }
}

iCore4链接:

posted @ 2018-03-09 08:51  XiaomaGee  阅读(589)  评论(0编辑  收藏  举报