打印
[其他ST产品]

指令和数据在stm32中存放的结构、堆栈大小及位置

[复制链接]
77|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
这一节应该和**从存储器映射来看stm32架构(内存与外设)**这一节结合来看




上面的代码区(Block0)又细分为以下:




下面左边是物理区分,右边常规字体是以st公司专有划分,右边粗体是以代码角度来区分

Flash =Code + RO-Data + RW-Data(.data);

SRAM = RW-data+ZI-data(.bss+heap+stack);

.bss:未初始化的全局变量
heap:申请的动态内存(如果代码中没有动态申请内存map文件中是没有heap定义的)
stack:局部变量都是放在栈中







使用特权

评论回复
沙发
实际测量不符|  楼主 | 2024-2-28 14:24 | 只看该作者
下面是附件代码生成的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

使用特权

评论回复
板凳
实际测量不符|  楼主 | 2024-2-28 14:25 | 只看该作者
同样可以在map文件 全局符号那块看到,如下图

使用特权

评论回复
地板
实际测量不符|  楼主 | 2024-2-28 14:25 | 只看该作者
下面为局部符号STACK,为栈底指针

使用特权

评论回复
5
实际测量不符|  楼主 | 2024-2-28 14:25 | 只看该作者
      Code (inc. data)   RO Data    RW Data    ZI Data      Debug   

      9920        616        580         56       1120     272362   Grand Totals
      9920        616        580         56       1120     272362   ELF Image Totals
      9920        616        580         56          0          0   ROM Totals
      ==============================================================================

    Total RO  Size (Code + RO Data)                10500 (  10.25kB)
    Total RW  Size (RW Data + ZI Data)              1176 (   1.15kB)
    Total ROM Size (Code + RO Data + RW Data)      10556 (  10.31kB)

==============================================================================

可以看到上述RW Data + ZI Data其实就是编译后加载到SRAM内的数据,转换为16进制就是0x00000498
ZI Data 在map文件中就是type为zero attr为RW的数据,也就是(.bss+heap+stack)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

560

帖子

0

粉丝