干货分享!嵌入式裸机编程中使用malloc、free会怎样?
扫描二维码
随时随地手机看文章
Heap_Size EQU 0x00000800AREA HEAP, NOINIT, READWRITE, ALIGN=3__heap_baseHeap_Mem SPACE Heap_Size__heap_limit
# Heap_Size 0x00000800unsigned char Heap_Mem[Heap_Size] = {0};
__user_initial_stackheapLDR R0, = Heap_Mem ; 返回系统中堆内存起始地址LDR R1, =(Stack_Mem + Stack_Size)LDR R2, = (Heap_Mem + Heap_Size); 返回系统中堆内存的结束地址LDR R3, = Stack_MemBX 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; ilist_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获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!





