zoukankan      html  css  js  c++  java
  • 【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("33[1;32;40m");                          //设置字体终端为绿色
        usart6.printf("
     Hello, I am iCore4!
    
    ");
        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.
    ",mem_info.OSNUsed);
                if(i >= 4){            
                    err = OSMemPut(Mem,(void *)msg);                 //释放内存块
                    if(err == OS_ERR_NONE){ 
                        usart6.printf("Release memory block success!
    
    "); 
                    }
                }
                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链接:

  • 相关阅读:
    kolla-ansible安装openstack(Ocata)
    OpenStack 虚机网卡的创建过程
    C语言 IPv6 十六进制 转 十进制
    python IPv6 十进制和十六进制互转
    ICMPv6 Packet Types and Codes
    scapy IPv6 NS NA报文构造
    最接近的数 牛客网 程序员面试金典 C++ Python
    最近公共祖先 牛客网 程序员面试金典 C++ Python
    有向路径检查 牛客网 程序员面试金典 C++ Python
    检查是否是BST 牛客网 程序员面试金典 C++ java Python
  • 原文地址:https://www.cnblogs.com/xiaomagee/p/8531987.html
Copyright © 2011-2022 走看看