RTX5 | 内存池01 - 内存池的使用
文章目錄
- 一、前言
- 二、實驗目的
- 三、API
- 3.1、osMemoryPoolAttr_t
- 3.2、osMemoryPoolNew
- 3.3、osMemoryPoolAlloc
- 3.4、osMemoryPoolFree
- 四、代碼
- 4.1、main.h
- 4.2、main.c
- 五、Event Recorder調試
- 5.1、RTX RTOS
一、前言
內存池(Memory Pools)是線程安全的,固定大小的內存塊。它們比動態堆棧分配內存操作更加快,且沒有內存碎片化問題。因為線程安全,它們能夠被線程與ISR同樣地訪問。
一個內存池能看被作為有效的(未使用的)內存塊的鏈表,且它們有固定且相同的大小。從一個內存池里分配內存塊提供給用戶使用的話使用osMemoryPoolAlloc。使用osMemoryPoolFree將用戶的內存塊重新歸還給內存池(此時用戶不能再使用這塊內存)。
共享內存是線程間交換信息的一個基本模型。使用內存池交換數據,相比于消息隊列,內存池可以交換更為復雜的數據,且交換數據的效率更高。
什么是線程安全,網上有人總結得不錯。簡單來說,線程安全意味著一個方法或者一個實例(內存池,消息隊列,信號量,互斥量等)可以被多個線程同時使用且沒有問題發生。
STM32工程:
鏈接:https://pan.baidu.com/s/1jgNaS6A0CuId6_GiILg5hw
提取碼:gie0
二、實驗目的
1、建立一個內存池,并分配內存塊0給用戶使用。一段時間后,將內存塊0歸還給RTX5系統。
三、API
3.1、osMemoryPoolAttr_t
/* 使用案例1 */ const osMemoryPoolAttr_t memory_Poool_Attr = {.name = "memory pool 1", /* 內存池的名字 */ };3.2、osMemoryPoolNew
/* 使用案例1 *//* 定義內存塊的數據結構 */ typedef struct {uint8_t buf[32];uint8_t Idx;}MEM_BLOCK_t;/* 創建一個內存池 */ mpID_MemPool = osMemoryPoolNew(16, /* 內存池里內存塊的數量 */sizeof(MEM_BLOCK_t), /* 內存塊的大小 */&memory_Poool_Attr /* 內存塊的屬性 */); if(NULL == mpID_MemPool) {printf("Memory pool can't be created.\r\n"); } else {printf("Memory pool has been created.\r\n"); }3.3、osMemoryPoolAlloc
/* 使用案例1 */ pMem = (MEM_BLOCK_t *)osMemoryPoolAlloc(mpID_MemPool,0U); /* 從內存池里分配內存塊0給用戶使用*/ if(pMem != NULL) {/* 獲取內存塊0成功,并初始化內存塊0 */pMem->buf[0] = 100;pMem->Idx = 0; }/* 使用案例2 */ pMem = (MEM_BLOCK_t *)osMemoryPoolAlloc(mpID_MemPool,10U); /* 從內存池里分配內存塊10給用戶使用*/ if(pMem != NULL) {/* 獲取內存塊0成功,并初始化內存塊0 */pMem->buf[0] = 100;pMem->Idx = 10; }3.4、osMemoryPoolFree
/* 使用案例1 */ osStatus_t status; status = osMemoryPoolFree(mpID_MemPool,pMem); /* 將內存池的內存塊0歸還給RTX5,此時用戶不能再使用內存塊0 */ if(status == osOK)printf("Memory block 0 back to the System.\r\n"); /* 打印信息 */四、代碼
4.1、main.h
4.2、main.c
五、Event Recorder調試
5.1、RTX RTOS
程序初始化后,創建內存池memory pool 1,接著將內存池的內存塊0分配給用戶使用。從RTX RTOS窗口看到,此時的Used blocks為1。此外,還能了解到內存池的指針地址是0x200008C0。
一段時間后,將內存塊0歸還給RTX5系統(從printf信息看到)。此時,RTX RTOS的窗口看到,Used bloacks從1變成0了。
總結
以上是生活随笔為你收集整理的RTX5 | 内存池01 - 内存池的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js实现文字从右滚动到左边代码循环滚动实
- 下一篇: CAN总线技术 | 数据链路层03 -