[开发工具] 关于STM32的GCC下的启动文件

[复制链接]
 楼主| xixihahash 发表于 2014-6-16 17:39 | 显示全部楼层 |阅读模式
最近在看GCC下的STM32F103的启动文件,来源是YAGARTO官网提供的例程,
里面有一个初始化stack和heap的汇编,不理解其中的用意,能帮忙解释下吗:
    .section .stack
    .align 3
#ifdef __STACK_SIZE
    .equ    Stack_Size, __STACK_SIZE
#else
    .equ    Stack_Size, 0xc00
#endif
    .globl    __StackTop
    .globl    __StackLimit
__StackLimit:
    .space    Stack_Size
    .size __StackLimit, . - __StackLimit
__StackTop:
    .size __StackTop, . - __StackTop
/////////////////////////////////////////////
    .section .heap
    .align 3
#ifdef __HEAP_SIZE
    .equ    Heap_Size, __HEAP_SIZE
#else
    .equ    Heap_Size, 0x800
#endif
    .globl    __HeapBase
    .globl    __HeapLimit
__HeapBase:
    .space    Heap_Size
    .size __HeapBase, . - __HeapBase
__HeapLimit:
    .size __HeapLimit, . - __HeapLimit

主要是对__StackLimit,__StackTop,__HeapBase,__HeapLimit的定义是做什么用的呢?
先谢过了!
john_lee 发表于 2014-6-16 21:03 | 显示全部楼层
用汇编写启动文件呀?还有你应该不用keil的microlib吧?
 楼主| xixihahash 发表于 2014-6-17 09:19 | 显示全部楼层
john_lee 发表于 2014-6-16 21:03
用汇编写启动文件呀?还有你应该不用keil的microlib吧?

Keil和IAR不都是商业的么,想弄个免费的环境就用的Eclipse+GCC~~~
那一段是一个叫YAGARTO的工具链里面提供的例程,这段在最开始初始化了Heap和Stack,
主要是:
__HeapBase:
    .space    Heap_Size
    .size __HeapBase, . - __HeapBase
__HeapLimit:
    .size __HeapLimit, . - __HeapLimit
的作用没有理解...

有高手能帮忙解答下么
john_lee 发表于 2014-6-17 12:27 | 显示全部楼层
本帖最后由 john_lee 于 2014-6-17 12:40 编辑

IDE不建议用eclipse,用em::blocks。目前的版本是 2.0,里面自带GNU工具链,其中的 GCC 版本为 4.7.4。如果嫌 GCC 版本低了,可以自己安装配置 GNU 工具链,但不建议用yagarto(已死),用GNU Tools for ARM Embedded Processors,这个工具链也是 yagarto 主页上推荐的替代工具链。
yagarto主页上也推荐了一款 IDE,emIDE,也可以采用,但我觉得这个没有 em::blocks 的功能强。
em::blocks有stm32的工程向导,很好用,支持两款仿真器:stlink 和 jlink。
i55 发表于 2014-6-17 12:28 | 显示全部楼层
这个应该是跟ld文件相对应的,你看下ld文件的配置。
gcc的ld文件等同于iar的icf文件,rvct的scatter文件。
笑苍天 发表于 2014-6-17 23:50 来自手机 | 显示全部楼层
john_lee 发表于 2014-6-17 12:27
IDE不建议用eclipse,用em::blocks。目前的版本是 2.0,里面自带GNU工具链,其中的 GCC 版本为 4.7.4。如果 ...

这个em::blocks确实好用,我用eclipse+gnu编译器折腾了老久都没把我的一个工程编译成功,用em::blocks一个多小时就编译下载成功,而且运行看起来正常。
 楼主| xixihahash 发表于 2014-6-18 09:48 | 显示全部楼层
john_lee 发表于 2014-6-17 12:27
IDE不建议用eclipse,用em::blocks。目前的版本是 2.0,里面自带GNU工具链,其中的 GCC 版本为 4.7.4。如果 ...

感谢推荐了,eclipse的话一直有所耳闻,所以想尝试一下,我试一下那个GNU Tools for ARM Embedded Processors吧,YAGARTO的工具链到2012年就结束了,确实有些心虚。当时选他也是看网上评论说对GDB支持比较好。IDE的话,你觉得好与不好主要区别在哪里呢?另外工具链呢?
 楼主| xixihahash 发表于 2014-6-18 09:49 | 显示全部楼层
笑苍天 发表于 2014-6-17 23:50
这个em::blocks确实好用,我用eclipse+gnu编译器折腾了老久都没把我的一个工程编译成功,用em::blocks一 ...

eclipse的这套环境我编译调试倒是都成功了,就是觉得调试的时候跟IAR还是有不小差距,用起来极其不适应啊
 楼主| xixihahash 发表于 2014-6-18 09:59 | 显示全部楼层
i55 发表于 2014-6-17 12:28
这个应该是跟ld文件相对应的,你看下ld文件的配置。
gcc的ld文件等同于iar的icf文件,rvct的scatter文件。 ...

对比着生成的MAP文件比较了一下,又看了下GNU的Assemble的文档,感觉理解如下,望大家指教:
__HeapBase:                //在heap内声明了一个symbol(可理解为一个function)
    .space    Heap_Size    //为这个函数占有了Heap_Size大小的空间(也就为heap增加了同等的空间)
    .size __HeapBase, . - __HeapBase   //这个symbol占用的空间大小
但感觉最后.size那句没有什么实际意义,只是作者的习惯性定义
john_lee 发表于 2014-6-18 14:11 | 显示全部楼层
对于GNU工具链来说,在non-OS环境中自己去定义栈(stack)和堆(heap),是完全没有意义的。
栈,最自然的就是定义到RAM末尾处。
堆,最自然的就是定义到BSS末尾处。
john_lee 发表于 2014-6-18 14:21 | 显示全部楼层
我的启动代码:
  1. extern "C" {
  2. extern void (*__init_array_start) ();
  3. extern void (*__init_array_end) ();
  4. void main (void);

  5. void ResetHandler (void)
  6. {
  7.   void (**p) () = &__init_array_start;
  8.   void (**end) () = &__init_array_end;
  9.   while (p != end) {
  10.     (*p++) ();
  11.   }
  12.   main ();
  13. }
  14. }
 楼主| xixihahash 发表于 2014-6-19 13:09 | 显示全部楼层
john_lee 发表于 2014-6-18 14:21
我的启动代码:

感谢斑竹!!
江枫渔火 发表于 2014-6-19 23:42 | 显示全部楼层
回头我也试试blocks,那个elicpse让人又爱又恨~
kyozc 发表于 2014-8-21 14:20 | 显示全部楼层
学习一下,用eclipse还没配置好~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

17

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部