一、實驗說明:
應用程式在執行中為了某種特殊需要,經常需要臨時獲得一些記憶體空間。而作為比較完善的作業系統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連結: