日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RTX5 | 内存池01 - 内存池的使用

發布時間:2025/3/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 - 内存池的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。