干货分享!嵌入式裸机编程中使用malloc、free会怎样?
扫描二维码
随时随地手机看文章
Heap_Size EQU 0x00000800
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
# Heap_Size 0x00000800
unsigned char Heap_Mem[Heap_Size] = {0};
__user_initial_stackheap
LDR R0, = Heap_Mem ; 返回系统中堆内存起始地址
LDR R1, =(Stack_Mem + Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size); 返回系统中堆内存的结束地址
LDR R3, = Stack_Mem
BX LR
unsigned char mem_buffer[512];
unsigned char *mem_offset = & mem_buffer;
void *malloc(int size)
{
unsigned char *tmp = mem_offset;
mem_offset += size;
return (void *)tmp;
}
void free(void *mem)
{
mem_offset = mem;
}
#//内存块的数量 MEM_BUFFER_LEN 5
#//每块内存的大小 MEM_BUFFER_SIZE 256
//内存池的描述,使用联合体,体现穷人的智慧。就如,我一同学说的:一个字节,恨不得掰成8个字节来用。
typedef union mem {
struct list_head list;
unsigned char buffer[MEM_BUFFER_SIZE];
}mem_t;
static union mem gmem[MEM_BUFFER_LEN];
LIST_HEAD(mem_pool);
//分配内存
void *mem_pop()
{
union mem *ret = NULL;
psr_t psr;
psr = ENTER_CRITICAL();
if(!list_empty(&mem_pool)) { //有可用的内存池
ret = list_first_entry(&mem_pool, union mem, list);
//printf("mem_pool = 0x%p ret = 0x%p\n", &mem_pool, &ret->list);
list_del(&ret->list);
}
EXIT_CRITICAL(psr);
return ret;//->buffer;
}
//回收内存
void mem_push(void *mem)
{
union mem *tmp = NULL;
psr_t psr;
tmp = (void *)mem;//container_of(mem, struct mem, buffer);
psr = ENTER_CRITICAL();
list_add(&tmp->list, &mem_pool);
//printf("free = 0x%p\n", &tmp->list);
EXIT_CRITICAL(psr);
}
//初始化内存池
void mem_pool_init()
{
int i;
psr_t psr;
psr = ENTER_CRITICAL();
for(i=0; i
list_add(&(gmem[i].list), &mem_pool);
//printf("add mem 0x%p\n", &(gmem[i].list));
}
EXIT_CRITICAL(psr);
}
免责声明:本文内容来源于网络,文章版权归原作者所有,意在传播相关技术知识&行业趋势,供大家学习交流,若涉及作品版权问题,请联系删除或授权事宜。
End
华清远见武汉中心位于武汉市洪山区武汉工程大学(武昌校区)科技孵化器11 楼,学生的食宿与活动十分便捷,实验设备、师资力量、教学管理等方面全国一流。武汉中心拥有专业级讲师及资深工程师, 师资力量雄厚;拥有国内最先进的人工智能、云/大数据等开发硬件专业实验设备,其中85%以上的实验设备由华清远见自主研发;拥有以人为本的高级班主任老师,科学的教学管理制度。主要课程有嵌入式人工智能、Java大数据开发、Html5全栈开发、Python+人工智能等,并为每一位学员提供专业的就业指导,高薪就业的学员不计其数,做良心教育,做专业教育,做受人尊敬的职业教育。
免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!