ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

【2015-03-15】ARM学习随手笔记:最简单的内存分析

【2015-03-15】ARM学习随手笔记:最简单的内存分析 [历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2015-03-15 标题ARM学习随手笔记最简单的内存分析分类编程 / 操作系统 / ARM 标签ARMARM学习随手笔记简单的内存分析作者最近在学习keil和ARM哎只能感叹自己老了这里简单的记录下学习笔记吧。以【 ARM学习随手笔记使用ITM方式启用printf 】为基本工程,这里打开HEAP内存如下图然后修改mainfunc.c修改后如下#includestdio.h#includestdlib.h#defineITM_Port8(n)(*((volatileunsignedchar*)(0xE00000004*n)))#defineITM_Port16(n)(*((volatileunsignedshort*)(0xE00000004*n)))#defineITM_Port32(n)(*((volatileunsignedlong*)(0xE00000004*n)))#defineDEMCR(*((volatileunsignedlong*)(0xE000EDFC)))#defineTRCENA0x01000000struct__FILE{inthandle;/* Add whatever you need here */};FILE __stdout;FILE __stdin;intfputc(intch,FILE*f){if(DEMCRTRCENA){while(ITM_Port32(0)0);ITM_Port8(0)ch;}return(ch);}intg_int100;intmain(void){intlocal_int10;int*p_local_int(int*)malloc(sizeof(int));printf(g_int address:%x ,(unsignedint)(g_int));printf(local_int address:%x ,(unsignedint)(local_int));printf(p_local_int address:%x ,(unsignedint)(p_local_int));printf(main address:%x ,(unsignedint)(main));while(1);}使用模拟器编译执行结果如下g_int address: 20000008 local_int address: 20001068 p_local_int address: 20000088 main address: 18b查看map文件这里有两种方式可以在文件目录中查找【 HelloM3\Listings\HelloM3.map 】或者如下图右键快捷打开map部分内容如下Image Symbol Table Local Symbols Symbol Name Value Ov Type Size Object(Section) 。。。。。。。 。。。。。。。 HEAP 0x20000070 Section 3072 startup_armcm3.o(HEAP) Heap_Mem 0x20000070 Data 3072 startup_armcm3.o(HEAP) STACK 0x20000c70 Section 1024 startup_armcm3.o(STACK) Stack_Mem 0x20000c70 Data 1024 startup_armcm3.o(STACK) __initial_sp 0x20001070 Data 0 startup_armcm3.o(STACK) Global Symbols Symbol Name Value Ov Type Size Object(Section) 。。。。。。。 。。。。。。。 main 0x0000018b Thumb Code 52 mainfunc.o(.text) 。。。。。。。 g_int 0x20000008 Data 4 mainfunc.o(.data) 。。。。。。。 Memory Map of the image Execution Region RW_IRAM1 (Base: 0x20000000, Size: 0x00001070, Max: 0x00020000, ABSOLUTE) Base Addr Size Type Attr Idx E Section Name Object 0x20000000 0x0000000c Data RW 2 .data mainfunc.o 0x2000000c 0x00000004 Data RW 37 .data system_armcm3.o 0x20000010 0x00000060 Zero RW 281 .bss c_w.l(libspace.o) 0x20000070 0x00000c00 Zero RW 26 HEAP startup_armcm3.o 0x20000c70 0x00000400 Zero RW 25 STACK startup_armcm3.o这里最简单的分析下1 g_int是全局变量属于全局变量区。2 local_int是局部变量因此在栈上。3 p_local_int是malloc出来的因此在堆上。4 RAM上的内存分布简图如下由此可见栈的大小在实际工作中需要仔细计算以免内存越界不过在实际工作中一般不会使用堆内存也不会使用malloc等函数。
返回列表