打印

ST库的启动代码问题

[复制链接]
1631|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
eng588|  楼主 | 2012-9-18 15:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ST库的开始代码:        PUBWEAK Reset_Handler
        SECTION .text:CODE:REORDER(2)
Reset_Handler
        LDR     R0, =SystemInit
        BLX     R0
        LDR     R0, =__iar_program_start
        BX      R0


按我的理解__iar_program_start是用来初始化C语言运行环境的,但是在这之前的SystemInit代码就已经是用C语言写的了,这样做给人感觉别扭,也不怎么安全,ST为啥要这样写?
沙发
aozima| | 2012-9-18 16:01 | 只看该作者
先把PLL起来速度快,你也可以去掉,然后在main里面再调用。

至于不安全? 如何判定不安全?

使用特权

评论回复
板凳
eng588|  楼主 | 2012-9-18 16:18 | 只看该作者
先把PLL起来速度快,你也可以去掉,然后在main里面再调用。

至于不安全? 如何判定不安全?
aozima 发表于 2012-9-18 16:01
C语言运行环境还没有建立起来,就运行C语言程序,理论上来说是错的,你要是在SystemInit()中声明个全局变量可能就不会被初始化。

使用特权

评论回复
地板
aozima| | 2012-9-18 16:44 | 只看该作者
不用全局变量不就解决了。

使用特权

评论回复
5
eng588|  楼主 | 2012-9-18 16:51 | 只看该作者
4# aozima 但编译器建立这个C语言环境,同编译器和MCU都会有关联,应该没有一个统一的标准。
所以说它不安全。毕竟一旦猜错了,时间延误了,老板发火了

使用特权

评论回复
6
aozima| | 2012-9-18 17:15 | 只看该作者
SystemInit是CMSIS里面的,并不需要你来写,ARM公司这样写就这样用。
如果自己改了其中的内容,当然得由修改者自己来保证。

使用特权

评论回复
7
batsong| | 2012-9-19 08:50 | 只看该作者
C也没啥运行环境啊,就把栈指针sp复位一下吧

全局变量啥的我都是自己手动初始化的

使用特权

评论回复
8
qqlvjh| | 2012-9-19 15:08 | 只看该作者
一点也不别扭,都只是代码而已,互相调用再正常不过,只要调用前堆栈初始化好,至于全局变量,最好不用。

使用特权

评论回复
9
wforest68| | 2012-9-25 12:57 | 只看该作者
__iar_program_start 不是用来初始化C语言运行环境的,而是iar 链接的程序的入口地址,知道这点后你就不会感觉别扭了

使用特权

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

本版积分规则

个人签名:和平時期做牛馬,戰爭時期當炮灰

82

主题

179

帖子

0

粉丝