遇到一个项目情况比较特别,可能是一个嵌入式的系统吧,居然不支持动态分配,还只能用标准C,琢磨了好几天,最后还是自己写了套函数,模拟一下动态分配。
大致是这样想的,弄个全局的buffer,在buffer里做alloc和free操作,局限性当然是buffer的大小不宜太大,尤其是16bit的环境。
如果对buffer的大小有要求,可通过修改源代码中的预定义来实现。
MAX_ARRAY_SIZE 最多可分配的内存块数的量。
MAX_POOL_SIZE 最多可分配的字节数,也就是预留的buffer大小。
struct BM_ARRAY_NODE 描述未分配和已分配的区块。
源代码:bm_malloc.h (version 1.0)
#pragma
once
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
uimalloc_init(
void
);
void
*
ui_malloc(unsigned
short
size);
void
ui_mfree(
void
*
p);
源代码:bm_malloc.c (version 1.0)
#include
<
memory.h
>
#include
<
string
.h
>
#include
<
assert.h
>
#include
"
bm_malloc.h
"
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
#define
MAX_ARRAY_SIZE 256
#define
MAX_POOL_SIZE 0xFFFF
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
typedef
struct
BM_ARRAY_NODE
{
unsigned short index;
unsigned short len;
}
BM_ARRAY_NODE;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
static
BM_ARRAY_NODE g_BM_FreeBlockList[MAX_ARRAY_SIZE
+
1
]
=
{
0}
;
static
BM_ARRAY_NODE g_BM_UsedBlockList[MAX_ARRAY_SIZE
+
1
]
=
{
0}
;
static
unsigned
char
g_BM_Buffer[MAX_POOL_SIZE];
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
/*
* insert a new node into ary_list, order by BM_ARRAY_NODE.index
*
* return value: the index of new node in array. return -1 if error.
*/
int
bm_array_add(BM_ARRAY_NODE
*
ary_list,
const
BM_ARRAY_NODE node)
{
assert(ary_list);
unsigned short i; /*loop*/
unsigned short n = ary_list[MAX_ARRAY_SIZE].index; /*item count in the ary_list*/
unsigned short pos = n; /*insert position. assume insert at the end of array*/
unsigned mov_len; /*moved data length in byte*/
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
assert(n < MAX_ARRAY_SIZE);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
/*search the fixed position in order*/
for (i=0; i<n; i++)
大致是这样想的,弄个全局的buffer,在buffer里做alloc和free操作,局限性当然是buffer的大小不宜太大,尤其是16bit的环境。
如果对buffer的大小有要求,可通过修改源代码中的预定义来实现。
MAX_ARRAY_SIZE 最多可分配的内存块数的量。
MAX_POOL_SIZE 最多可分配的字节数,也就是预留的buffer大小。
struct BM_ARRAY_NODE 描述未分配和已分配的区块。
源代码:bm_malloc.h (version 1.0)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
源代码:bm_malloc.c (version 1.0)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)