garyv 发表于 2012-10-21 23:01:11

CORTEX-M3启动代码疑问,懂汇编的请进

正在使用STM32F103,在ST提供的startup代码:CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm\stm32f10x_md.s里面的Reset复位入口里面的语句如下:
Reset_Handler   PROC
                EXPORTReset_Handler            
                IMPORT__main
                IMPORTSystemInit
                LDR   R0, =SystemInit
                BLX   R0               
                LDR   R0, =__main
                BX      R0
                ENDP

疑问是:这里的跳转到用户main()函数为啥不使用函数标号main,而是使用__main,我测试过将IMPORT和LDR那2句都改为main标号,编译链接也都是正常的,但是编译出来的hex文件与改之前编译出的hex文件有点差异。

求高手指点一二,多谢。

laber_1912 发表于 2012-10-21 23:14:57

C环境建立之前还不直接运行到main,之前有代码搬移,建立RW、ZI段并初始化,设置堆栈等等。

garyv 发表于 2012-10-21 23:21:05

说的也是{:smile:}

alfred1 发表于 2012-10-21 23:28:18

__main是keil arm run-time的function,做初始化,然后跳到你的main()
你要是自己写初始化代码,可以直接跳main()

garyv 发表于 2012-10-21 23:35:07

alfred1 发表于 2012-10-21 23:28 static/image/common/back.gif
__main是keil arm run-time的function,做初始化,然后跳到你的main()
你要是自己写初始化代码,可以直接跳 ...

可是可以,问题是如果app里面用到了初始化了的全局变量之类的就有问题了,还有SP,因为这些处理是在__main()函数里面完成的,所以不能在RESET之后直接跑到用户的mian()里面

alfred1 发表于 2012-10-21 23:43:10

我的程序把在__main()的操作自己实现,就直接跳main()了

garyv 发表于 2012-10-21 23:52:53

alfred1 发表于 2012-10-21 23:43 static/image/common/back.gif
我的程序把在__main()的操作自己实现,就直接跳main()了

请问,能告诉我这段被Keil插入的__main汇编代码源码在哪里吗?我想修改一下

fshunj 发表于 2012-10-22 00:19:27

把全局变量复制到ram里并对其初始化.

lishutong 发表于 2012-10-23 13:47:06

garyv 发表于 2012-10-21 23:52 static/image/common/back.gif
请问,能告诉我这段被Keil插入的__main汇编代码源码在哪里吗?我想修改一下 ...

貌似没有源码

freefei 发表于 2012-10-23 18:59:32

标志一下,期待更详细的解答。

jknew2008 发表于 2012-10-23 19:34:10

建议楼主跟下反汇编的代码,这个_main应该是跳到了编译器定义的一初始化函数,楼上各位都有提到。。 最近我跟了下iar的这部分启动代码,能找到对应的部分的源码,不过keil就没研究过,楼主可以找下IAR的相关的启动看看,应该大同小异吧。

hejc06 发表于 2012-10-23 19:52:19

ls说得对,其实都大同小异的,以前用gcc工具链开发的时候都是自己在启动文件里做的

山外メ雲ジ 发表于 2012-10-23 20:02:47

可以去看看野火的《三天入门Cortex-M4——Kinetis系列 》,是飞思卡尔的M4单片机,用的是IAR,里面有启动代码的分析……

IAR是通过ICF文件来确定 段 的位置,然后启动代码获取 ICF文件 相关的参数配置后,初始化对应的段,例如 bbs段清0 ,把 中断服务函数向量表 搬到 RAM 等操作……

scfor 发表于 2012-10-24 10:47:56

编译后反汇编自己能查看到

gelf 发表于 2012-10-27 14:24:56

不会是c里面main,编译完就是__main了吧。
页: [1]
查看完整版本: CORTEX-M3启动代码疑问,懂汇编的请进