你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32在KEIL下的工程,编译出来的MAP文件,关于RAM内存的分析

[复制链接]
iamchritian 提问时间:2015-12-24 10:08 /

  1. <P>主控CPU为STM32F207ZGT6,RAM 空间为128K,下图为MAP文件中,关于内存地址的分配(keil版本为4.72A)
  2. </P>
  3. <P> </P>
  4. <P>APBAHBPrescTable 0x20000000 Data 16 stm32f2xx_rcc.o(.data)
  5. .data 0x20000010 Section 16 stm32f2x7_eth.o(.data)
  6. .data 0x20000020 Section 4 dhcp.o(.data)
  7. xid 0x20000020 Data 4 dhcp.o(.data)
  8. .data 0x20000024 Section 13 mem.o(.data)
  9. ram 0x20000024 Data 4 mem.o(.data)
  10. ram_end 0x20000028 Data 4 mem.o(.data)
  11. lfree 0x2000002c Data 4 mem.o(.data)
  12. mem_sem 0x20000030 Data 1 mem.o(.data)
  13. .data 0x20000034 Section 12 netif.o(.data)
  14. netifnum 0x20000034 Data 1 netif.o(.data)
  15. .data 0x20000040 Section 4 raw.o(.data)
  16. raw_pcbs 0x20000040 Data 4 raw.o(.data)
  17. .data 0x20000044 Section 4 udp.o(.data)
  18. .data 0x20000048 Section 12 ip.o(.data)
  19. ip_id 0x20000048 Data 2 ip.o(.data)
  20. .data 0x20000054 Section 6 ip_frag.o(.data)
  21. reassdatagrams 0x20000054 Data 4 ip_frag.o(.data)
  22. ip_reass_pbufcount 0x20000058 Data 2 ip_frag.o(.data)
  23. .data 0x2000005a Section 1 etharp.o(.data)
  24. etharp_cached_entry 0x2000005a Data 1 etharp.o(.data)
  25. .data 0x2000005c Section 36 main.o(.data)
  26. .data 0x20000080 Section 12 netconf.o(.data)
  27. .data 0x2000008c Section 8 stm32f2xx_it.o(.data)
  28. .data 0x20000094 Section 44 app.o(.data)
  29. time 0x200000a4 Data 4 app.o(.data)
  30. LED_Flag 0x200000a8 Data 1 app.o(.data)
  31. s_sendcount 0x200000ac Data 4 app.o(.data)
  32. s_Net_Time 0x200000b0 Data 4 app.o(.data)
  33. s_h485tonet 0x200000b4 Data 4 app.o(.data)
  34. .data 0x200000c0 Section 14 h485.o(.data)
  35. Counter10ms 0x200000c3 Data 1 h485.o(.data)
  36. dev 0x200000c4 Data 1 h485.o(.data)
  37. .data 0x200000d0 Section 20 updata.o(.data)
  38. .data 0x200000e4 Section 4 systick.o(.data)
  39. Ticks 0x200000e4 Data 4 systick.o(.data)
  40. .data 0x200000e8 Section 8 udp_com.o(.data)
  41. drop_cnt 0x200000e8 Data 4 udp_com.o(.data)
  42. .data 0x200000f0 Section 4 stdout.o(.data)
  43. .bss 0x200000f4 Section 15572 stm32f2x7_eth.o(.bss)
  44. .bss 0x20003dc8 Section 4116 mem.o(.bss)
  45. ram_heap 0x20003dc8 Data 4116 mem.o(.bss)
  46. .bss 0x20004ddc Section 9947 memp.o(.bss)
  47. memp_tab 0x20004ddc Data 24 memp.o(.bss)
  48. memp_memory 0x20004df4 Data 9923 memp.o(.bss)
  49. .bss 0x200074b8 Section 200 etharp.o(.bss)
  50. arp_table 0x200074b8 Data 200 etharp.o(.bss)
  51. .bss 0x20007580 Section 52 netconf.o(.bss)
  52. .bss 0x200075b4 Section 4096 stm32f2xx_it.o(.bss)
  53. .bss 0x200085b4 Section 5904 app.o(.bss)
  54. .bss 0x20009cc4 Section 1024 crc32.o(.bss)
  55. .bss 0x2000a0c4 Section 5476 h485.o(.bss)
  56. .bss 0x2000b628 Section 2048 updata.o(.bss)
  57. read_data_buf 0x2000b628 Data 1024 updata.o(.bss)
  58. <FONT color=blue>write_data_buf 0x2000ba28</FONT> Data 1024 updata.o(.bss)
  59. <FONT color=red>STACK 0x2000be28 Section 16384 startup_stm32f2xx.o(STACK)</FONT></P>
复制代码
上面红色标记 STACK 的起始地址为 0x2000be28
在这里有几个疑问:
1、栈空间是向低字节地址方向生长的,我定义的栈空间为16K Bytes,那么栈空间从 0x2000be28 地址向下生长,怎么会跟全局变量的地址write_data_buf 0x2000ba28地址重合呢
2、还有个疑问,就是堆空间在起始地址在哪里体现?我定义的堆空间大小为512字节
收藏 1 评论16 发布时间:2015-12-24 10:08

举报

16个回答
iamchritian 回答时间:2015-12-24 13:32:42
Mandelbrot_Set 发表于 2015-12-24 12:00
AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem        SPACE   Stack_Size
---------------------- ...

栈空间的起始地址,虽然每次编译时,不一样,但是,一旦编译之后就应该确定。
1、上述map文件中,RAM地址 0x2000 be28 应该是栈的起始地址;
2、栈空间是 16384 字节;
3、栈是向地址生长,那么栈的结束地址应该是 0x2000 7E28;
问题:在栈空间:0x2000 7E28 -- 0x2000 be28 这两者的RAM空间中,怎么会有
  1.    .bss                                     0x200074b8   Section      200  etharp.o(.bss)
  2.     arp_table                                0x200074b8   Data         200  etharp.o(.bss)
  3.     .bss                                     0x20007580   Section       52  netconf.o(.bss)
  4.     .bss                                     0x200075b4   Section     4096  stm32f2xx_it.o(.bss)
  5.     .bss                                     0x200085b4   Section     5904  app.o(.bss)
  6.     .bss                                     0x20009cc4   Section     1024  crc32.o(.bss)
  7.     .bss                                     0x2000a0c4   Section     5476  h485.o(.bss)
  8.     .bss                                     0x2000b628   Section     2048  updata.o(.bss)
  9.     read_data_buf                            0x2000b628   Data        1024  updata.o(.bss)
  10.     write_data_buf                           0x2000ba28   Data        1024  updata.o(.bss)
复制代码

4、全局变量在编译后,就已经确实,在RAM空间的全局区。
Mandelbrot_Set 回答时间:2015-12-24 12:00:39
本帖最后由 Mandelbrot_Set 于 2015-12-24 12:25 编辑

AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem        SPACE   Stack_Size
--------------------------------------------------
In a source file, the AREA directive marks the start of a section. This directive names the section and sets its attributes. The attributes are placed after the name, separated by commas.---------------------------------------------------
这儿Stack_Mem    STACK 地址会相同

iamchritian 回答时间:2015-12-25 17:09:00

LWIP的内存,在内部做了内存池和内存堆两种内存的分配方式,在opt.h中有一个宏定义,如果MEM_LIBC_MALLOC定义为0和1,有不同的分配方式。
一、MEM_LIBC_MALLOC == 0
这种情况LWIP的内存池和内存堆都是在STM32的RAM空间的全局区,取的一块内存,LWIP协议栈给出了特殊的处理,以便接收和发送数据
二、MEM_LIBC_MALLOC == 1
这种情况下
1、LWIP的内存池是在STM32的全局区
2、LWIP的内存堆是在STM32的堆中
moyanming2013 回答时间:2015-12-24 10:36:13
看这个能了解程序各段的分布情况,栈的具体大小、起始位置要参考启动文件、分散加载文件及你的启动方式(boot0、boot1)。
Mandelbrot_Set 回答时间:2015-12-24 11:00:44
0x2000be28
0x2000ba28
只是长得像而已
iamchritian 回答时间:2015-12-24 11:26:25
moyanming2013 发表于 2015-12-24 10:36
看这个能了解程序各段的分布情况,栈的具体大小、起始位置要参考启动文件、分散加载文件及你的启动方式(bo ...

请问一下,栈指针的地址,堆指针的在RAM中的具体位置,编译过后,应该是确定的吧?
那么在内存地址 0x2000 0000--0x2001 FFFF中的哪个地址?
iamchritian 回答时间:2015-12-24 11:28:13
Mandelbrot_Set 发表于 2015-12-24 11:00
0x2000be28
0x2000ba28
只是长得像而已

不是太懂
我的理解:
>write_data_buf 0x2000ba28
这是全局变量write_data_buf的指针位置,大小为1024字节
>STACK 0x2000be28
这是栈指针的位置,大小为16384字节
Mandelbrot_Set 回答时间:2015-12-24 11:30:56
本帖最后由 Mandelbrot_Set 于 2015-12-24 12:26 编辑
iamchritian 发表于 2015-12-24 11:28
不是太懂
我的理解:
>write_data_buf 0x2000ba28

STACK是段地址吧(其实这个section里只有栈...)
wolfgang 回答时间:2015-12-24 13:25:03
栈址里存放的是栈空间的具体指针而已,压栈操作不是把栈的数据都压入栈内。
Mandelbrot_Set 回答时间:2015-12-24 14:00:52
startup.s的作做法大概是
定义1个section,叫STACK.
里面有一个数组(一块ram),叫Stack_Mem[SIZE].
栈的设置要代码实现.
map文件并不知道它是栈(STACK只是名字而已,跟代码对应)
Mandelbrot_Set 回答时间:2015-12-24 14:04:26
STACK 0x2000be28 Section 16384 startup_stm32f2xx.o
告诉你的是 startup_stm32f2xx.o( startup_stm32f2xx.s)
实现了一个段(section) 名字叫 STACK ,地址 0x2000be28 ,大小16384

这个section当然是[0x2000be28 ,0x2000be28 + 16384]



iamchritian 回答时间:2015-12-25 09:33:02
Mandelbrot_Set 发表于 2015-12-24 14:00
startup.s的作做法大概是
定义1个section,叫STACK.
里面有一个数组(一块ram),叫Stack_Mem.

谢谢你的耐心解释,现在彻底弄懂了,因为我用了LWIP的内存分配机制,所有STM32的堆被隐藏了,重新用C标准库,就能看到堆和栈的地址了
moyanming2013 回答时间:2015-12-25 10:57:11
iamchritian 发表于 2015-12-25 09:33
谢谢你的耐心解释,现在彻底弄懂了,因为我用了LWIP的内存分配机制,所有STM32的堆被隐藏了,重新用C标准 ...

能否解释下“LWIP的内存分配机制”?
米兰的无线电 回答时间:2015-12-25 11:24:04
本帖最后由 role_2099 于 2015-12-25 11:26 编辑

我是进来学习的
Mandelbrot_Set 回答时间:2015-12-25 12:00:21
moyanming2013 发表于 2015-12-25 10:57
能否解释下“LWIP的内存分配机制”?

这个还真没用过
12下一页

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版