STM32学习手记4 地址映射及MAP文件

在STM32中,RAM、CODE、寄存器等都共用一个32位的地址总线

32位线性地址空间总容量为4GB,数据字节以小端形式存放在存储器中。一个字里的最低字节被认为是该字的最低有效字节。​

以0x4000 0000起始的地址,主要分配给了各种外设的控制寄存器。这段地址空间可以执行读写操作。

以​0x2000 0000起始的地址,分配给了静态SRAM。内部SRAM共64K,其中有两个位段去,将每一位(bit)都映射到了一个地址上。这段地址空间步进可以通过系统总线进行读写操作,有些地址甚至可以执行位操作。

 

​以0x8000 0000起始的地址,分配给了FLASH模块的存储块。片上闪存最大可达1024K。闪存被分为主存储块和信息块。在大容量产品中,主存储块分为256个2K字节的页,每一页即内部可擦除的最小单位。主存储块除了可以通过本身的地址访问,还被映射到了0x0000 0000地址。当BOOT引脚规定系统从主存储块启动时,系统从0x0000 0000读取堆栈地址,并跳转到0x0000 0004所指示的地址开始执行代码

以0x1FFF F000起始的地址,被分配给了信息块。​信息块带有一块启动程序代码,长度大约2K字节,用来存储出厂自带的自举程序;还有16个字节的选择字节,用来存储看门狗的状态和FLASH的读写保护选项。当BOOT引脚规定系统从信息块启动的时候,会先运行出厂自带的自举程序,在其中可以通过串口向片内烧写程序。

以上FLASH空间只能通过挂在在AHB总线上的系统自带的FLASH读写设备来读取和写入。​相关操作需要配置寄存器(位于寄存器空间)。

 

STM32实现了一种特殊的机制,可以通过BOOT引脚的设置,让系统从SRAM读取指令运行。

主存储块的保护

可以对主存储块中的数据进行读保护、写保护。

读保护用于保护数据不被非法读出。防止程序泄密。

写保护用于保护数据不被非法改写,增强程序的健壮性。

读保护

主存储块启动读保护后,简单的说具有以下特性:

1.从主存储块启动的程序,可以对整个主存储块执行读操作,不允许对主存储块的前4KB进行擦除编程操作,可以对4KB之后的区域进行擦除编程操作。

2.从SRAM启动的程序,不能对主存储块进行读、页擦除、编程操作,但可以进行主存储块整片擦除操作。

3.使用调试接口不能访问主存储块。

这些特性足以阻止主存储器数据的非法读出,又能保证程序的正常运行。

只有当RDP选项字节的值为RDPRT键值时,读保护才被关闭,否则,读保护就是启动的。因此,擦除选项字节的操作,将启动主存储块的读保护。如果要关闭读保护,必须将RDP选项字节编程为RDPRT键值。并且,如果编程选项字节,使RDP由非键值变为键值(即由保护变为非保护)时,STM32将会先擦除整个主存储块,再编程RDP。

芯片出厂时,RDP会事先写入RDPRT键值,关闭写保护功能。

 

写保护

STM32主存储块可以分域进行写保护。如果试图对写保护的域进行擦除或编程操作,在闪存状态寄存器(FLASH_SR)中会返回一个写保护错误标志。

STM32主存储块每个域4KB,WRP0-WRP3选项字节中的每一位对应一个域,位为0时,写保护有效。对于超过128KB的产品,WRP3.15保护了域31及之后的所有域。

显然,擦除选项字节将导致解除主存储块的写保护。

 

选项字节与它的寄存器映象

我们知道,FPEC有两个寄存器存储了选项字节的映象。那么,选项字节本体(在FLASH中)与映象(在寄存器中)究竟有什么区别呢?

选项字节的本体只是个FLASH,它的作用只是掉电存储选项字节内容而以,真正起作用的是寄存器中的映象。即,一个配置是否有效,不是看本体,而是看映象。而映象是在复位后,用本体的值加载的,此后,除非复位,映象将不再改变。所以,更改本体的数据后,不会立即生效,只有复位加载到映象中后,才会生效。

有一点要注意的是,当更改本体的值,使主存储块读保护变为不保护时,会先擦除整片主存储块,然后再改变本体。这是唯一一个改变本体会引发的动作。但即使这样,读保护依然要等到复位后,加载到映象后,才会解除。

 

关于MAP文件:

1、第一部分:Section Cross References

 

主要是各个源文件生成的模块之间相互引用的关系。 

stm32f10x.o(STACK) refers (Special) to stkheap2.o(.text) for __use_two_region_memory

比如上面这句话,stm32f10x.o是stm32f10x.s生成的目标文件模块,(STACK)是文件内定义的一个段,链接器把它视为一个Section,输入节。它引用了模块stkheap2.o输入节(.text)里面的一个全局符号__use_two_region_memory(可能是一个函数或变量)。这个(Special)不知道是什么含义。

剩下的基本都是这用的意思。

 

2、第二部分:Removing Unused input sections from the image.

 

就是将库中没有用到的函数从可执行映像中删除掉,减小程序的体积。

 Removing os_mbox.o(.text), (1094 bytes).

 Removing os_mutex.o(.text), (1744 bytes).

R​emoving os_sem.o(.text), (1016 bytes).

 

3、第三部分:Image Symbol Table

Local Symbols

符号表里的局部符号。

 

../../angel/boardlib.s  0x00000000   Number         0  boardinit1.o ABSOLUTE

 

../../angel/handlers.s  0x00000000   Number     0  __scatter_copy.o ABSOLUTE

 

../../angel/kernel.s     0x00000000   Number       0  kernel.o ABSOLUTE

 

../../angel/rt.s    0x00000000   Number         0  rt_raise.o ABSOLUTE

 

../../angel/scatter.s   0x00000000   Number         0  __scatter.o ABSOLUTE

 

../../angel/startup.s   0x00000000   Number         0  __main.o ABSOLUTE

 

../../angel/sys.s    0x00000000   Number         0  sys_exit.o ABSOLUTE

 

../../angel/sysapp.c    0x00000000   Number         0  sys_wrch.o ABSOLUTE

 

../../armsys.c       0x00000000   Number         0  _get_argv.o ABSOLUTE

 

   以上是一些系统内部的局部符号,还有用户的一些局部符号

 

 

4、第四部分:Global Symbols

 

全局符号

 

    _terminate_user_alloc                      - Undefined Weak Reference

 

    _terminateio                              - Undefined Weak Reference

 

    __Vectors       0x08000000   Data           4  stm32f10x_vector.o(RESET)

 

    __main         0x08000131   Thumb Code     8  __main.o(!!!main)

 

    __scatterload    0x08000139   Thumb Code     0  __scatter.o(!!!scatter)

 

   __scatterload_rt2  0x08000139   Thumb Code    44  __scatter.o(!!!scatter)

 

这些是一些系统的全局符号

 

    Font8x16   0x08001a82   Data        2048  tft018.o(.constdata)

 

    Font8x8    0x08002282   Data        2056  tft018.o(.constdata)

 

    codeGB_16  0x08002a8a   Data         770  tft018.o(.constdata)

 

 

5、第五部分:

 

Memory Map of the image

 

//映像的内存分布

 

  Image Entry point : 0x080000ed

 

//程序的入口点:这里应该是RESET_Handler的地址

 

Load Region LR_IROM1 (Base: 0x08000000, Size: 0x00002e00, Max: 0x00020000, ABSOLUTE)

 

//程序的加载映像地址和长度,2e00=2dc0(代码和常数)+0x20(Region Table是RW的加载和执行地址、ZI与HEAPSTACK的执行地址)+0x20(已经初始化的数据)。

 

    Execution Region ER_IROM1 (Base: 0x08000000, Size: 0x00002de0, Max: 0x00020000, ABSOLUTE) //这段RO区域的加载映像和执行映像一致。

     Base Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x08000000 0x000000ec   Data   RO      3    RESET               stm32f10x.o

    0x080000ec 0x00000008  Code   RO  191  * !!!main             __main.o(c_w.l)

 

  Execution Region RW_IRAM1 (Base: 0x20000000, Size: 0x000004a0, Max: 0x00005000, ABSOLUTE) //RW数据区 ZI数据区 Heap和Stack数据区。 

    Base Addr    Size         Type   Attr      Idx    E Section Name        Object

 

    0x20000000   0x00000001   Data   RW   100    .data              tft018.o

 

    x20000040   0x00000060   Zero   RW  212  .bss                libspace.o(c_w.l)

 

    0x200000a0   0x00000000   Zero   RW  2    HEAP          stm32f10x.o

 

    0x200000a0   0x00000400   Zero   RW    1  STACK               stm32f10x.o

 

6、第六部分:Image component sizes

 

这是指出各个模块的输入节的大小

 

      Code (inc. data)   RO Data    RW Data    ZI Data      Debug   Object Name

 

       972         58          0         10         32       2416   can.o

 

       824        168          0         15          0       1791   candemo.o

 

       928         88          0          0          0       4529   stm32_init.o

 

        52         18        236          0       1024       2700   stm32f10x.o

 

      1836         32       4874          1          0       8076   tft018.o

 

最后给出总长度:这个11744应该=0x2dc0,1184应该0x4a0。11776应该是=0x2e00。

Total RO  Size (Code + RO Data)                11744 (  11.47kB)

Total RW  Size (RW Data + ZI Data)              1184 (   1.16kB)

Total ROM Size (Code + RO Data + RW Data)      11776 (  11.50kB)

 

 从MAP中,可以看出整个程序在FLASH中的分布情况。搞清楚那些FLASH页被占用了,哪些还可以作为闪存使用!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值