打印
[开发工具]

关于STM32的GCC下的启动文件

[复制链接]
5418|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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。

使用特权

评论回复
5
i55| | 2014-6-17 12:28 | 只看该作者
这个应该是跟ld文件相对应的,你看下ld文件的配置。
gcc的ld文件等同于iar的icf文件,rvct的scatter文件。

使用特权

评论回复
6
笑苍天| | 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一个多小时就编译下载成功,而且运行看起来正常。

使用特权

评论回复
7
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的话,你觉得好与不好主要区别在哪里呢?另外工具链呢?

使用特权

评论回复
8
xixihahash|  楼主 | 2014-6-18 09:49 | 只看该作者
笑苍天 发表于 2014-6-17 23:50
这个em::blocks确实好用,我用eclipse+gnu编译器折腾了老久都没把我的一个工程编译成功,用em::blocks一 ...

eclipse的这套环境我编译调试倒是都成功了,就是觉得调试的时候跟IAR还是有不小差距,用起来极其不适应啊

使用特权

评论回复
9
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那句没有什么实际意义,只是作者的习惯性定义

使用特权

评论回复
10
john_lee| | 2014-6-18 14:11 | 只看该作者
对于GNU工具链来说,在non-OS环境中自己去定义栈(stack)和堆(heap),是完全没有意义的。
栈,最自然的就是定义到RAM末尾处。
堆,最自然的就是定义到BSS末尾处。

使用特权

评论回复
11
john_lee| | 2014-6-18 14:21 | 只看该作者
我的启动代码:
extern "C" {
extern void (*__init_array_start) ();
extern void (*__init_array_end) ();
void main (void);

void ResetHandler (void)
{
  void (**p) () = &__init_array_start;
  void (**end) () = &__init_array_end;
  while (p != end) {
    (*p++) ();
  }
  main ();
}
}

使用特权

评论回复
12
xixihahash|  楼主 | 2014-6-19 13:09 | 只看该作者
john_lee 发表于 2014-6-18 14:21
我的启动代码:

感谢斑竹!!

使用特权

评论回复
13
江枫渔火| | 2014-6-19 23:42 | 只看该作者
回头我也试试blocks,那个elicpse让人又爱又恨~

使用特权

评论回复
14
kyozc| | 2014-8-21 14:20 | 只看该作者
学习一下,用eclipse还没配置好~

使用特权

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

本版积分规则

3

主题

17

帖子

0

粉丝