【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链接: