1. 程式人生 > >uc/os-iii學習筆記---儲存管理(記憶體管理)

uc/os-iii學習筆記---儲存管理(記憶體管理)

記憶體管理

我本人覺得記憶體管理反而是最容易的管理函式。
作為一個RTOS作業系統,記憶體管理是必備的功能,因此UCOSIII也就記憶體管理能力。通常應用程式可以呼叫ANSI C編譯器的malloc()和free()函式來動態的分配和釋放記憶體,但是在嵌入式事實作業系統中最好不要這麼做,多次這樣的操作會把原來很大的一塊連續儲存區域逐漸地分割成許多非常小並且彼此不相鄰的儲存區域,這就是儲存碎片。
UCOSIII中提供了一種替代malloc()和free()函式的方法,UCOSIII中將儲存空間分成區和塊,每個儲存區有數量不等大小相同的儲存塊,在一個系統中可以有多個儲存區。

一般儲存區是固定的,在程式中可以用陣列來表示一個儲存區,比如u8 buffer[20][10],就表示一個擁有20個儲存塊,每個儲存塊10個位元組的儲存區。
這裡寫圖片描述

UCOSIII中用儲存控制塊來表示儲存區,儲存控制塊為OS_MEM。

struct os_mem {
OS_OBJ_TYPE          Type; 
void                *AddrPtr; 
CPU_CHAR            *NamePtr;
void                *FreeListPtr; 
OS_MEM_SIZE          BlkSize; 
OS_MEM_QTY           NbrMax; 
OS_MEM_QTY           NbrFree; 
#if OS_CFG_DBG_EN > 0u
    OS_MEM          *DbgPrevPtr;
    OS_MEM         *DbgNextPtr;
#endif
};

函式相關:
這裡寫圖片描述

舉個例子:

//定義一個儲存區
OS_MEM INTERNAL_MEM;    
//儲存區中儲存塊數量
#define INTERNAL_MEM_NUM        5
//每個儲存塊大小
#define INTERNAL_MEMBLOCK_SIZE  100  
//記憶體池使用內部RAM
CPU_INT08U Internal_RamMemp[INTERNAL_MEM_NUM][INTERNAL_MEMBLOCK_SIZE];


OSMemCreate((OS_MEM*    )&INTERNAL_MEM,//需要在程式碼最前面定義,指向儲存區
            (CPU_CHAR*  )"Internal Mem"
,//儲存區名字 (void* )&Internal_RamMemp[0][0],//儲存區基地址 (OS_MEM_QTY )INTERNAL_MEM_NUM,//有多少個儲存塊可用,建議巨集定義 (OS_MEM_SIZE)INTERNAL_MEMBLOCK_SIZE,//每個儲存塊大小,建議巨集定義 (OS_ERR* )&err);
//申請儲存塊
OSMemGet((OS_MEM*)&INTERNAL_MEM,
         (OS_ERR*)&err);
//釋放儲存塊
OSMemPut((OS_MEM*   )&INTERNAL_MEM,
        (void*      )internal_buf,
        (OS_ERR*    )&err);
需要注意的是,申請一次後,必須對應的釋放一次,而且必須連續成對,如果申請四次後再釋放四次,去檢視的話卻只能再申請一次。也就是說,申請一次後,下一個執行的記憶體函式必須是釋放。