記憶體釋放函式
在嵌入式系統設計中,一些可靠性要求非常高的系統應選擇使用靜態的,而普通的業務系統可以使用動態來提高記憶體使用效率。
ucos 的記憶體管理是建立乙個記憶體池,靜態劃分一大塊連續空間作為記憶體管理的空間,裡面劃分為很多個記憶體塊。在使用的時候就從這個記憶體池中獲取乙個記憶體塊,使用完畢的時候使用者可以將其放回記憶體池中。
嵌入式系統中,所有的記憶體都需要使用者參與分配,直接操作物理記憶體,所分配的記憶體不能超過系統的物理記憶體,所有的系統堆疊的管理,都由使用者自己管理。同時,對記憶體的分配時間要求更為苛刻,分配記憶體的時間必須是確定的。
記憶體的大小分配怎麼確定?有沒有像oled顯示屏那樣的多種顯示(分配)模式?分割完記憶體是通過乙個陣列給每一塊記憶體乙個編號索引嗎?
記憶體池中的記憶體塊是通過鍊錶連線
void osmemcreate (os_mem *p_mem,
//記憶體分割槽控制塊
cpu_char *p_name,
//命名記憶體分割槽
void
*p_addr,
//記憶體分割槽首位址
os_mem_qty n_blks,
//記憶體塊數目
os_mem_size blk_size,
//記憶體塊大小(單位:位元組)
os_err *p_err)
//返回錯誤型別
*p_link =
(void*)
0;//最後乙個記憶體塊指向空
os_critical_enter()
;//進入臨界段
p_mem->type = os_obj_type_mem;
//設定物件的型別
p_mem->nameptr = p_name;
//儲存記憶體分割槽的命名
p_mem->addrptr = p_addr;
//儲存記憶體分割槽的首位址
p_mem->freelistptr = p_addr;
//初始化空閒記憶體塊池的首位址
p_mem->nbrfree = n_blks;
//儲存空閒記憶體塊的數目
p_mem->nbrmax = n_blks;
//儲存記憶體塊的總數目
p_mem->blksize = blk_size;
//儲存記憶體塊的空間大小
#if os_cfg_dbg_en > 0u
//如果使能了除錯**和變數
os_memdbglistadd
(p_mem)
;//將記憶體管理物件插入記憶體管理雙向除錯列表
#endif
osmemqty++
;//記憶體管理物件數目加1
os_critical_exit_no_sched()
;//退出臨界段(無排程)
*p_err = os_err_none;
//錯誤型別為「無錯誤」
}
void
*osmemget (os_mem *p_mem,
//記憶體管理物件
os_err *p_err)
//返回錯誤型別
#endif
#if os_cfg_arg_chk_en > 0u
//如果使能了引數檢測
if(p_mem ==
(os_mem *)0
)#endif
cpu_critical_enter()
;//關中斷
if(p_mem->nbrfree ==
(os_mem_qty)0)
p_blk = p_mem->freelistptr;
//如果還有空閒記憶體塊,就獲取它
p_mem->freelistptr =*(
void**
)p_blk;
//調整空閒記憶體塊指標
p_mem->nbrfree--
;//空閒記憶體塊數目減1
cpu_critical_exit()
;//開中斷
*p_err = os_err_none;
//錯誤型別為「無錯誤」
return
(p_blk)
;//返回獲取到的記憶體塊
}
void osmemput (os_mem *p_mem,
//記憶體管理物件
void
*p_blk,
//要退回的記憶體塊
os_err *p_err)
//返回錯誤型別*(
void**
)p_blk = p_mem->freelistptr;
//把記憶體塊插入空閒記憶體塊鍊錶
p_mem->freelistptr = p_blk;
//記憶體塊退回到鍊錶的最前端
p_mem->nbrfree++
;//空閒記憶體塊數目加1
cpu_critical_exit()
;//開中斷
*p_err = os_err_none;
//錯誤型別為「無錯誤」
}
UCOSIII作業系統 記憶體管理篇
ucosiii其他內容導航不迷路 ucosiii作業系統 簡介 ucosiii作業系統 任務篇 1 建立任務 ucosiii作業系統 任務篇 2 相關api函式 ucosiii作業系統 系統初始化篇 1 系統初始化 ucosiii作業系統 系統初始化篇 2 cpu,systick,記憶體初始化 uc...
ucosIII任務管理(一)
任務 執行緒和任務其實是一樣的,只是名字不同。任務有點像c函式,但是不一樣。任務一般是死迴圈,而且沒有返回值。在任務當中可呼叫函式。當任務開始執行時,系統會給任務傳遞乙個引數 p arg,這個引數是void型指標。這個指標是乙個通用型指標,可以向任務傳遞變數位址 資料結構 函式入口等等。有了這個指標...
ucosIII任務管理(三)
系統內部任務 系統有5個內部任務,空閒任務 時鐘節拍任務 統計任務 定時任務 中斷服務管理任務,前兩個任務是初始化系統時必須建立的,後三個根據需求建立。為了產生時鐘節拍,要配置硬體定時器使其產生10 1000hz的頻率之間的中斷 實際上節拍中斷並非由定時器產生,而是由其他週期性時鐘源產生。當允許中斷...