MS-RTOS 内存堆
本章将介绍 MS-RTOS 内存堆的使用。
内存堆相关 API
下表展示了内存堆相关的 API 在两个权限空间下是否可用:
API | 用户空间 | 内核空间 |
---|---|---|
ms_kheap_sbrk | ● | |
ms_kmalloc | ● | |
ms_kzalloc | ● | |
ms_kmalloc_align | ● | |
ms_kfree | ● | |
ms_krealloc | ● | |
ms_kcalloc | ● | |
ms_malloc | ● | ● |
ms_zalloc | ● | ● |
ms_malloc_align | ● | ● |
ms_free | ● | ● |
ms_realloc | ● | ● |
ms_calloc | ● | ● |
ms_kheap_sbrk()
描述 给内核内存堆增加内存
函数原型
ms_err_t ms_kheap_sbrk(ms_ptr_t base, ms_size_t size);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | base | 内存基地址,不能为空指针 |
[in] | size | 内存大小,必须 >= 2048 |
返回值 MS-RTOS 内核错误码
注意事项 不能在中断中调用,不能在内核锁定期间调用,最多增加一个区域
示例
static ms_uint8_t mem[4096U];
int xxx(void)
{
ms_kheap_sbrk(mem, sizeof(mem));
return 0;
}
ms_kmalloc()
描述 从内核内存堆中分配指定大小的内存
函数原型
ms_ptr_t ms_kmalloc(ms_size_t size);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | size | 需要分配的内存大小,必须 > 0 |
返回值 内存指针,失败时返回 MS_NULL
注意事项 不能在中断中调用,不能在内核锁定期间调用
示例
int xxx(void)
{
ms_ptr_t ptr = ms_kmalloc(100U);
// do some thing
return 0;
}
ms_kzalloc()
描述 从内核内存堆中分配指定大小的内存并清零
函数原型
ms_ptr_t ms_kzalloc(ms_size_t size);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | size | 需要分配的内存大小,必须 > 0 |
返回值 内存指针,失败时返回 MS_NULL
注意事项 不能在中断中调用,不能在内核锁定期间调用
示例
int xxx(void)
{
ms_ptr_t ptr = ms_kzalloc(100U);
// do some thing
return 0;
}
ms_kfree()
描述 释放内存到内核内存堆
函数原型
ms_ptr_t ms_kfree(ms_ptr_t ptr);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | ptr | 内存指针,不能为空指针 |
返回值 成功返回 MS_NULL,失败返回 ptr
注意事项 不能在中断中调用,不能在内核锁定期间调用
示例
int xxx(void)
{
ms_ptr_t ptr = ms_kmalloc(100U);
// do some thing
ms_kfree(ptr);
return 0;
}
ms_kmalloc_align()
描述 从内核内存堆中分配指定大小指定对齐要求的内存
函数原型
ms_ptr_t ms_kmalloc_align(ms_size_t size, ms_size_t align);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | size | 需要分配的内存大小,必须 > 0 |
[in] | align | 需要对齐到多少个字节,必须 > 0 |
返回值 成功返回内存指针,失败时返回 MS_NULL
注意事项 不能在中断中调用,不能在内核锁定期间调用
示例
int xxx(void)
{
ms_ptr_t ptr = ms_kmalloc_align(100U, 32U);
// do some thing
ms_kfree(ptr);
return 0;
}
ms_krealloc()
描述 从内核内存堆中重新分配指定大小的内存
函数原型
ms_ptr_t ms_krealloc(ms_ptr_t ptr, ms_size_t size);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | ptr | 内存指针,空指针时未分配 |
[in] | size | 需要分配的内存大小,必须 > 0 |
返回值 成功返回内存指针,失败时返回 MS_NULL
注意事项 不能在中断中调用,不能在内核锁定期间调用
示例
int xxx(void)
{
ms_ptr_t ptr = ms_kmalloc(100U);
// do some thing
ptr = ms_krealloc(ptr, 200U);
// do some thing
ms_kfree(ptr);
return 0;
}
ms_kcalloc()
描述 从内核内存堆中分配 N 个指定大小的内存块,并清零
函数原型
ms_ptr_t ms_kcalloc(ms_size_t n_blk, ms_size_t blk_size);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | n_blk | N 个内存块,必须 > 0 |
[in] | blk_size | 每个内存块的大小,必须 > 0 |
返回值 成功返回内存指针,失败时返回 MS_NULL
注意事项 不能在中断中调用,不能在内核锁定期间调用
示例
int xxx(void)
{
ms_ptr_t ptr = ms_kcalloc(10U, 100U);
// do some thing
ms_kfree(ptr);
return 0;
}
ms_malloc()
描述 从内存堆中分配指定大小的内存
函数原型
ms_ptr_t ms_malloc(ms_size_t size);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | size | 需要分配的内存大小,必须 > 0 |
返回值 成功返回内存指针,失败时返回 MS_NULL
注意事项 不能在中断中调用,不能在内核锁定期间调用
示例
int main(int argc, char *argv[])
{
ms_ptr_t ptr = ms_malloc(100U);
// do some thing
return 0;
}
ms_zalloc()
描述 从内存堆中分配指定大小的内存并清零
函数原型
ms_ptr_t ms_zalloc(ms_size_t size);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | size | 需要分配的内存大小,必须 > 0 |
返回值 成功返回内存指针,失败时返回 MS_NULL
注意事项 不能在中断中调用,不能在内核锁定期间调用
示例
int main(int argc, char *argv[])
{
ms_ptr_t ptr = ms_zalloc(100U);
// do some thing
return 0;
}
ms_free()
描述 释放内存到内存堆
函数原型
ms_ptr_t ms_free(ms_ptr_t ptr);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | ptr | 内存指针,必须不为空指针 |
返回值 成功返回 MS_NULL,失败返回 ptr
注意事项 不能在中断中调用,不能在内核锁定期间调用
示例
int main(int argc, char *argv[])
{
ms_ptr_t ptr = ms_malloc(100U);
// do some thing
ms_free(ptr);
return 0;
}
ms_malloc_align()
描述 从内存堆中分配指定大小指定对齐要求的内存
函数原型
ms_ptr_t ms_malloc_align(ms_size_t size, ms_size_t align);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | size | 需要分配的内存大小,必须 > 0 |
[in] | align | 需要对齐到多少个字节,必须 > 0 |
返回值 成功返回内存指针,失败时返回 MS_NULL
注意事项 不能在中断中调用,不能在内核锁定期间调用
示例
int main(int argc, char *argv[])
{
ms_ptr_t ptr = ms_malloc_align(100U, 32U);
// do some thing
ms_free(ptr);
return 0;
}
ms_realloc()
描述 从内存堆中重新分配指定大小的内存
函数原型
ms_ptr_t ms_realloc(ms_ptr_t ptr, ms_size_t size);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | ptr | 内存指针,空指针时未分配 |
[in] | size | 需要分配的内存大小,必须 > 0 |
返回值 成功返回内存指针,失败时返回 MS_NULL
注意事项 不能在中断中调用,不能在内核锁定期间调用
示例
int main(int argc, char *argv[])
{
ms_ptr_t ptr = ms_malloc(100U);
// do some thing
ptr = ms_realloc(ptr, 200U);
// do some thing
ms_free(ptr);
return 0;
}
ms_calloc()
描述 从内存堆中分配 N 个指定大小的内存块,并清零
函数原型
ms_ptr_t ms_calloc(ms_size_t n_blk, ms_size_t blk_size);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | n_blk | N 个内存块,必须 > 0 |
[in] | blk_size | 每个内存块的大小,必须 > 0 |
返回值 成功返回内存指针,失败时返回 MS_NULL
注意事项 不能在中断中调用,不能在内核锁定期间调用
示例
int main(int argc, char *argv[])
{
ms_ptr_t ptr = ms_calloc(10U, 100U);
// do some thing
ms_free(ptr);
return 0;
}