MS-RTOS 内存池
本章将介绍 MS-RTOS 内存池的使用。
内存池相关数据类型
类型 | 描述 |
---|---|
ms_mempool_stat_t | 内存池的状态信息结构类型 |
ms_mempool_stat_t
内存池的状态信息结构类型:
typedef struct {
ms_size_t free_count;
} ms_mempool_stat_t;
参数 | 说明 |
---|---|
free_count | 空闲内存块数目 |
内存池相关 API
下表展示了内存池相关的 API 在两个权限空间下是否可用:
API | 用户空间 | 内核空间 |
---|---|---|
ms_mempool_create | ● | ● |
ms_mempool_destroy | ● | ● |
ms_mempool_alloc | ● | ● |
ms_mempool_tryalloc | ● | ● |
ms_mempool_free | ● | ● |
ms_mempool_stat | ● | ● |
ms_mempool_create()
描述 创建一个内存池
函数原型
ms_err_t ms_mempool_create(const char *name, ms_ptr_t mem_base, ms_uint16_t n_blk,
ms_size_t blk_size, ms_ipc_opt_t opt,
ms_handle_t *mpoolid);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | name | 内存池的名字,不能为空指针 |
[in] | mem_base | 内存基地址 |
[in] | n_blk | 有多少个内存块 |
[in] | blk_size | 每个内存块的大小 |
[in] | opt | 内存池的选项 |
[out] | mpoolid | 内存池的 ID,不能为空指针 |
opt 参数可以取如下的值:
宏 | 含义 |
---|---|
MS_WAIT_TYPE_PRIO | 按优先级高低规则等待 |
MS_WAIT_TYPE_FIFO | 按先来先服务规则等待 |
返回值 MS-RTOS 内核错误码
注意事项 不能在中断中调用
示例
static ms_handle_t mempool_id;
static ms_uint8_t mempool[10U * 1024U];
int main(int argc, char *argv[])
{
ms_mempool_create("mempool", mempool, 10U, 1024U, MS_WAIT_TYPE_PRIO, &mempool_id);
return 0;
}
ms_mempool_destroy()
描述 销毁一个内存池
函数原型
ms_err_t ms_mempool_destroy(ms_handle_t mpoolid);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | mpoolid | 内存池的 ID |
返回值 MS-RTOS 内核错误码
注意事项 不能在中断中调用
示例
static ms_handle_t mempool_id;
static ms_uint8_t mempool[10U * 1024U];
int main(int argc, char *argv[])
{
ms_mempool_create("mempool", mempool, 10U, 1024U, MS_WAIT_TYPE_PRIO, &mempool_id);
// do some thing
ms_mempool_destroy(mempool_id);
return 0;
}
ms_mempool_alloc()
描述 从内存池中分配一个内存块
函数原型
ms_ptr_t ms_mempool_alloc(ms_handle_t mpoolid, ms_tick_t timeout, ms_err_t *perr);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | mpoolid | 内存池的 ID |
[in] | timeout | 等待的超时时间 |
[out] | perr | MS-RTOS 内核错误码,不关心时可以为 MS_NULL |
返回值 内存块指针,失败时返回 MS_NULL
注意事项 中断中、内核锁定期间或内核启动前调用,timeout 必须为
MS_TIMEOUT_NO_WAIT
示例
static ms_handle_t mempool_id;
static ms_uint8_t mempool[10U * 1024U];
int main(int argc, char *argv[])
{
ms_ptr_t ptr;
ms_mempool_create("mempool", mempool, 10U, 1024U, MS_WAIT_TYPE_PRIO, &mempool_id);
ptr = ms_mempool_alloc(mempool_id, 1000U, MS_NULL);
// do some thing
ms_mempool_destroy(mempool_id);
return 0;
}
ms_mempool_tryalloc()
描述 从内存池中尝试分配一个内存块
函数原型
ms_ptr_t ms_mempool_tryalloc(ms_handle_t mpoolid, ms_err_t *perr);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | mpoolid | 内存池的 ID |
[out] | perr | MS-RTOS 内核错误码,不关心时可以为 MS_NULL |
返回值 内存块指针,失败时返回 MS_NULL
注意事项 无
示例 无
ms_mempool_free()
描述 释放一个内存块到内存池
函数原型
ms_err_t ms_mempool_free(ms_handle_t mpoolid, ms_ptr_t ptr);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | mpoolid | 内存池的 ID |
[in] | ptr | 内存块指针 |
返回值 MS-RTOS 内核错误码
注意事项 无
示例
static ms_handle_t mempool_id;
static ms_uint8_t mempool[10U * 1024U];
int main(int argc, char *argv[])
{
ms_ptr_t ptr;
ms_mempool_create("mempool", mempool, 10U, 1024U, MS_WAIT_TYPE_PRIO, &mempool_id);
ptr = ms_mempool_alloc(mempool_id, 1000U, MS_NULL);
// do some thing
ms_mempool_free(mempool_id, ptr);
ms_mempool_destroy(mempool_id);
return 0;
}
ms_mempool_stat()
描述 获得内存池的状态信息
函数原型
ms_err_t ms_mempool_stat(ms_handle_t mpoolid, ms_mempool_stat_t *stat);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | mpoolid | 内存池的 ID |
[out] | stat | 内存池的状态信息 |
返回值 MS-RTOS 内核错误码
注意事项 无
示例
static ms_handle_t mempool_id;
static ms_uint8_t mempool[10U * 1024U];
int main(int argc, char *argv[])
{
ms_mempool_stat_t stat;
ms_mempool_create("mempool", mempool, 10U, 1024U, MS_WAIT_TYPE_PRIO, &mempool_id);
// do some thing
ms_mempool_stat(mempool_id, &stat);
ms_mempool_destroy(mempool_id);
return 0;
}