下面是附件代码生成的map图
==============================================================================
Memory Map of the image
Image Entry point : 0x08000131
Load Region LR_IROM1 (Base: 0x08000000, Size: 0x0000293c, Max: 0x00010000, ABSOLUTE)
Execution Region ER_IROM1 (Exec base: 0x08000000, Load base: 0x08000000, Size: 0x00002904, Max: 0x00010000, ABSOLUTE)
Exec Addr Load Addr Size Type Attr Idx E Section Name Object
0x08000000 0x08000000 0x00000130 Data RO 231 RESET startup_stm32f10x_hd.o
##RESET是startup_stm32f10x_hd.s文件中AREA 定义的一块名为RESET的中断向量表数据
##下面的Code RO 都是代码段,.text是启动文件中AREA定义代码,其它是库代码段
0x08000130 0x08000130 0x00000000 Code RO 3423 * .ARM.Collect$$$$00000000 mc_w.l(entry.o)
0x08000130 0x08000130 0x00000004 Code RO 3738 .ARM.Collect$$$$00000001 mc_w.l(entry2.o)
0x08000134 0x08000134 0x00000004 Code RO 3741 .ARM.Collect$$$$00000004 mc_w.l(entry5.o)
0x08000138 0x08000138 0x00000000 Code RO 3743 .ARM.Collect$$$$00000008 mc_w.l(entry7b.o)
0x08000138 0x08000138 0x00000000 Code RO 3745 .ARM.Collect$$$$0000000A mc_w.l(entry8b.o)
0x08000138 0x08000138 0x00000008 Code RO 3746 .ARM.Collect$$$$0000000B mc_w.l(entry9a.o)
0x08000140 0x08000140 0x00000000 Code RO 3748 .ARM.Collect$$$$0000000D mc_w.l(entry10a.o)
0x08000140 0x08000140 0x00000000 Code RO 3750 .ARM.Collect$$$$0000000F mc_w.l(entry11a.o)
0x08000140 0x08000140 0x00000004 Code RO 3739 .ARM.Collect$$$$00002712 mc_w.l(entry2.o)
0x08000144 0x08000144 0x00000024 Code RO 232 .text startup_stm32f10x_hd.o
0x08000168 0x08000168 0x00000062 Code RO 3426 .text mc_w.l(ldiv.o)
0x080001ca 0x080001ca 0x00000064 Code RO 3689 .text mf_w.l(fmul.o)
0x0800022e 0x0800022e 0x0000007c Code RO 3691 .text mf_w.l(fdiv.o)
0x080002aa 0x080002aa 0x0000014e Code RO 3693 .text mf_w.l(dadd.o)
0x080003f8 0x080003f8 0x000000e4 Code RO 3695 .text mf_w.l(dmul.o)
0x080004dc 0x080004dc 0x000000de Code RO 3697 .text mf_w.l(ddiv.o)
0x080005ba 0x080005ba 0x00000022 Code RO 3699 .text mf_w.l(dflti.o)
0x080005dc 0x080005dc 0x0000001a Code RO 3701 .text mf_w.l(dfltui.o)
0x080005f6 0x080005f6 0x00000028 Code RO 3703 .text mf_w.l(ffixui.o)
0x0800061e 0x0800061e 0x00000026 Code RO 3705 .text mf_w.l(f2d.o)
0x08000644 0x08000644 0x00000038 Code RO 3707 .text mf_w.l(d2f.o)
0x0800067c 0x0800067c 0x00000014 Code RO 3709 .text mf_w.l(cfrcmple.o)
0x08000690 0x08000690 0x00000062 Code RO 3755 .text mc_w.l(uldiv.o)
0x080006f2 0x080006f2 0x0000001e Code RO 3757 .text mc_w.l(llshl.o)
0x08000710 0x08000710 0x00000024 Code RO 3759 .text mc_w.l(llsshr.o)
0x08000734 0x08000734 0x00000000 Code RO 3768 .text mc_w.l(iusefp.o)
0x08000734 0x08000734 0x0000006e Code RO 3769 .text mf_w.l(fepilogue.o)
0x080007a2 0x080007a2 0x000000ba Code RO 3771 .text mf_w.l(depilogue.o)
0x0800085c 0x0800085c 0x0000002e Code RO 3773 .text mf_w.l(dscalb.o)
0x0800088a 0x0800088a 0x00000002 PAD
0x0800088c 0x0800088c 0x00000030 Code RO 3777 .text mf_w.l(cdrcmple.o)
0x080008bc 0x080008bc 0x00000024 Code RO 3779 .text mc_w.l(init.o)
0x080008e0 0x080008e0 0x00000020 Code RO 3781 .text mc_w.l(llushr.o)
0x08000900 0x08000900 0x000000a2 Code RO 3783 .text mf_w.l(dsqrt.o)
0x080009a2 0x080009a2 0x00000004 Code RO 144 i.BusFault_Handler stm32f10x_it.o
0x080009a6 0x080009a6 0x00000002 Code RO 145 i.DebugMon_Handler stm32f10x_it.o
0x080009a8 0x080009a8 0x00000116 Code RO 243 i.GPIO_Init stm32f10x_gpio.o
0x08000abe 0x08000abe 0x00000004 Code RO 251 i.GPIO_SetBits stm32f10x_gpio.o
0x08000ac2 0x08000ac2 0x00000004 Code RO 146 i.HardFault_Handler stm32f10x_it.o
0x08000ac6 0x08000ac6 0x00000002 PAD
0x08000ac8 0x08000ac8 0x00000038 Code RO 3164 i.IIC_Ack myiic.o
0x08000b00 0x08000b00 0x00000038 Code RO 3165 i.IIC_Init myiic.o
0x08000b38 0x08000b38 0x00000038 Code RO 3166 i.IIC_NAck myiic.o
0x08000b70 0x08000b70 0x00000058 Code RO 3167 i.IIC_Read_Byte myiic.o
0x08000bc8 0x08000bc8 0x00000060 Code RO 3168 i.IIC_Send_Byte myiic.o
0x08000c28 0x08000c28 0x00000038 Code RO 3169 i.IIC_Start myiic.o
0x08000c60 0x08000c60 0x00000034 Code RO 3170 i.IIC_Stop myiic.o
0x08000c94 0x08000c94 0x0000004c Code RO 3171 i.IIC_Wait_Ack myiic.o
0x08000ce0 0x08000ce0 0x00000050 Code RO 2906 i.LED_Init led.o
0x08000d30 0x08000d30 0x00000004 Code RO 147 i.MemManage_Handler stm32f10x_it.o
0x08000d34 0x08000d34 0x00000002 Code RO 148 i.NMI_Handler stm32f10x_it.o
0x08000d36 0x08000d36 0x00000002 PAD
0x08000d38 0x08000d38 0x00000070 Code RO 551 i.NVIC_Init misc.o
0x08000da8 0x08000da8 0x00000014 Code RO 552 i.NVIC_PriorityGroupConfig misc.o
0x08000dbc 0x08000dbc 0x00000002 Code RO 149 i.PendSV_Handler stm32f10x_it.o
0x08000dbe 0x08000dbe 0x00000002 PAD
0x08000dc0 0x08000dc0 0x00000020 Code RO 355 i.RCC_APB2PeriphClockCmd stm32f10x_rcc.o
0x08000de0 0x08000de0 0x000000d4 Code RO 363 i.RCC_GetClocksFreq stm32f10x_rcc.o
0x08000eb4 0x08000eb4 0x00000020 Code RO 3172 i.SDA_IN myiic.o
0x08000ed4 0x08000ed4 0x00000024 Code RO 3173 i.SDA_OUT myiic.o
0x08000ef8 0x08000ef8 0x00000002 Code RO 150 i.SVC_Handler stm32f10x_it.o
0x08000efa 0x08000efa 0x00000008 Code RO 2862 i.SetSysClock system_stm32f10x.o
0x08000f02 0x08000f02 0x00000002 PAD
0x08000f04 0x08000f04 0x000000e0 Code RO 2863 i.SetSysClockTo72 system_stm32f10x.o
0x08000fe4 0x08000fe4 0x00000028 Code RO 555 i.SysTick_CLKSourceConfig misc.o
0x0800100c 0x0800100c 0x00000002 Code RO 151 i.SysTick_Handler stm32f10x_it.o
0x0800100e 0x0800100e 0x00000002 PAD
0x08001010 0x08001010 0x0000003c Code RO 3320 i.SysTick_Init systick.o
0x0800104c 0x0800104c 0x00000060 Code RO 2865 i.SystemInit system_stm32f10x.o
0x080010ac 0x080010ac 0x0000003c Code RO 3349 i.USART1_IRQHandler usart.o
0x080010e8 0x080010e8 0x000000b0 Code RO 3350 i.USART1_Init usart.o
0x08001198 0x08001198 0x00000040 Code RO 3379 i.USART2_IRQHandler rs485.o
0x080011d8 0x080011d8 0x00000012 Code RO 1189 i.USART_ClearFlag stm32f10x_usart.o
0x080011ea 0x080011ea 0x00000018 Code RO 1193 i.USART_Cmd stm32f10x_usart.o
0x08001202 0x08001202 0x0000001a Code RO 1196 i.USART_GetFlagStatus stm32f10x_usart.o
0x0800121c 0x0800121c 0x00000054 Code RO 1197 i.USART_GetITStatus stm32f10x_usart.o
0x08001270 0x08001270 0x0000004a Code RO 1199 i.USART_ITConfig stm32f10x_usart.o
0x080012ba 0x080012ba 0x00000002 PAD
0x080012bc 0x080012bc 0x000000d8 Code RO 1200 i.USART_Init stm32f10x_usart.o
0x08001394 0x08001394 0x0000000a Code RO 1207 i.USART_ReceiveData stm32f10x_usart.o
0x0800139e 0x0800139e 0x00000008 Code RO 1210 i.USART_SendData stm32f10x_usart.o
0x080013a6 0x080013a6 0x00000004 Code RO 152 i.UsageFault_Handler stm32f10x_it.o
0x080013aa 0x080013aa 0x00000002 PAD
0x080013ac 0x080013ac 0x00000020 Code RO 3561 i.__0printf$5 mc_w.l(printf5.o)
0x080013cc 0x080013cc 0x00000028 Code RO 3725 i.__ARM_fpclassify m_ws.l(fpclassify.o)
0x080013f4 0x080013f4 0x000000aa Code RO 3727 i.__kernel_poly m_ws.l(poly.o)
0x0800149e 0x0800149e 0x00000002 PAD
0x080014a0 0x080014a0 0x00000010 Code RO 3711 i.__mathlib_dbl_divzero m_ws.l(dunder.o)
0x080014b0 0x080014b0 0x00000004 Code RO 3713 i.__mathlib_dbl_infnan2 m_ws.l(dunder.o)
0x080014b4 0x080014b4 0x0000000c Code RO 3714 i.__mathlib_dbl_invalid m_ws.l(dunder.o)
0x080014c0 0x080014c0 0x0000000e Code RO 3715 i.__mathlib_dbl_overflow m_ws.l(dunder.o)
0x080014ce 0x080014ce 0x00000002 PAD
0x080014d0 0x080014d0 0x00000010 Code RO 3717 i.__mathlib_dbl_underflow m_ws.l(dunder.o)
0x080014e0 0x080014e0 0x0000000e Code RO 3789 i.__scatterload_copy mc_w.l(handlers.o)
0x080014ee 0x080014ee 0x00000002 Code RO 3790 i.__scatterload_null mc_w.l(handlers.o)
0x080014f0 0x080014f0 0x0000000e Code RO 3791 i.__scatterload_zeroinit mc_w.l(handlers.o)
0x080014fe 0x080014fe 0x00000002 PAD
0x08001500 0x08001500 0x0000000c Code RO 3763 i.__set_errno mc_w.l(errno.o)
0x0800150c 0x0800150c 0x000002c0 Code RO 3568 i._printf_core mc_w.l(printf5.o)
0x080017cc 0x080017cc 0x000001b0 Code RO 3257 i.bmp280CompensateP bmp280.o
0x0800197c 0x0800197c 0x00000048 Code RO 3258 i.bmp280CompensateT bmp280.o
0x080019c4 0x080019c4 0x00000088 Code RO 3259 i.bmp280GetData bmp280.o
0x08001a4c 0x08001a4c 0x0000004c Code RO 3260 i.bmp280GetPressure bmp280.o
0x08001a98 0x08001a98 0x00000084 Code RO 3261 i.bmp280Init bmp280.o
0x08001b1c 0x08001b1c 0x0000007c Code RO 3262 i.bmp280PressureToAltitude bmp280.o
0x08001b98 0x08001b98 0x0000004c Code RO 3321 i.delay_ms systick.o
0x08001be4 0x08001be4 0x0000004c Code RO 3322 i.delay_us systick.o
0x08001c30 0x08001c30 0x00000024 Code RO 3351 i.fputc usart.o
0x08001c54 0x08001c54 0x00000060 Code RO 3174 i.iicDevRead myiic.o
0x08001cb4 0x08001cb4 0x00000040 Code RO 3175 i.iicDevReadByte myiic.o
0x08001cf4 0x08001cf4 0x00000030 Code RO 3177 i.iicDevWriteByte myiic.o
0x08001d24 0x08001d24 0x000000a0 Code RO 1 i.main main.o
0x08001dc4 0x08001dc4 0x000009d8 Code RO 3414 i.pow m_ws.l(pow.o)
0x0800279c 0x0800279c 0x00000006 Code RO 3263 i.presssureFilter bmp280.o
0x080027a2 0x080027a2 0x0000004c Code RO 3731 i.sqrt m_ws.l(sqrt.o)
0x080027ee 0x080027ee 0x00000002 PAD
0x080027f0 0x080027f0 0x00000088 Data RO 3415 .constdata m_ws.l(pow.o)
0x08002878 0x08002878 0x00000008 Data RO 3729 .constdata m_ws.l(qnan.o)
0x08002880 0x08002880 0x00000064 Data RO 2 .conststring main.o
0x080028e4 0x080028e4 0x00000020 Data RO 3787 Region$$Table anon$$obj.o
Execution Region RW_IRAM1 (Exec base: 0x20000000, Load base: 0x08002904, Size: 0x00000498, Max: 0x00005000, ABSOLUTE)
Exec Addr Load Addr Size Type Attr Idx E Section Name Object
0x20000000 0x08002904 0x00000014 Data RW 383 .data stm32f10x_rcc.o
0x20000014 0x08002918 0x00000014 Data RW 3265 .data bmp280.o
0x20000028 0x0800292c 0x00000004 Data RW 3323 .data systick.o
0x2000002c 0x08002930 0x00000001 Data RW 3381 .data rs485.o
0x2000002d 0x08002931 0x00000003 PAD
0x20000030 0x08002934 0x00000004 Data RW 3752 .data mc_w.l(stdout.o)
0x20000034 0x08002938 0x00000004 Data RW 3764 .data mc_w.l(errno.o)
0x20000038 - 0x0000001c Zero RW 3264 .bss bmp280.o
0x20000054 - 0x00000040 Zero RW 3380 .bss rs485.o
0x20000094 0x0800293c 0x00000004 PAD
0x20000098 - 0x00000400 Zero RW 229 STACK startup_stm32f10x_hd.o
==============================================================================
上面分为两个部分:
怎么看
1.Load Region 范围(0x08000000 – 0x0800293c)
可以称之为加载域,加载的指令在这里,初始化时将RW-data从flash中加载到SRAM中
2.Execution Region 范围(0x20000000 – 0x20000098)
可以称之为执行域,在代码运行过程中,生成的中间变量和全局变量的修改都是在这个区域进行的(SRAM)
在这一部分我们可以看到在最左边执行地址的后面又Load Addr,这个地址就是当前地址上的数据是从哪里加载过来的,可以看到RW-data是从第一部分RO-data后面加载过来的
第二部分最后有STACK这个section,它是从0x20000098地址开始,然后在startup_stm32f10x_hd启动文件里定义了0x00000400大小的栈,所以在编译完后栈指针sp就等于0x00000498
|