uCOS III 14 記憶體管理

2021-10-04 10:23:42 字數 2664 閱讀 3981

記憶體釋放函式

在嵌入式系統設計中,一些可靠性要求非常高的系統應選擇使用靜態的,而普通的業務系統可以使用動態來提高記憶體使用效率。

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的頻率之間的中斷 實際上節拍中斷並非由定時器產生,而是由其他週期性時鐘源產生。當允許中斷...