[讨论] 嵌入式程序的入口不是main而是——复位

haopijin   2017-12-27 14:39 楼主
      提问做嵌入式系统开发的同志们一个问题,程序开始执行的地方是main()函数吗?大学里我的老师都是这么说的,程序的入口就是main函数还有很多参考书也这么说,于是乎在这种main来main去的日子里写着代码——有一天突然停下啦思考了一下,豁然开朗,原来所有芯片的入口地址是PC指针在上电后的第一个值,也就是——复位!
       没想到这么多年被一些人和书给误导了,机器就是机器它总是有起始位置的,那个位置就是上电那一刻的复位。
      为了帮助大家理解,下边我举几个例子,比如MSP430系列的单片机,复位后的PC地址一般是0xFF这是8位地址的,还有16位地址的0xFFFE;
32位地址的0xFFFFFFFC,这些是与地址相关系的所以大家可以通过思考更清楚一下复位地址与地址位数的关系;
      通过复位后,要经过启动文件,启动文件一般使用汇编编写,通过一些设置堆栈和中断等最后引导至我们所说的main函数,NND绕了一大圈,害得他爷爷我思考了半个多世纪!MSP430F149的启动文件在IAR环境中可以看到lnk430f149.xcl引入到main函数的入口,philip的LPC21xx用的启动文件是Startup.s,stm32F10x系列的大家更熟悉了用到的是startup_stm32f10x_ld.s;startup_stm32f10x_md.s;startup_stm32f10x_hd.s中的一个。
      好了这次先写到这里,领导这里走来走去的,一会还要开会——妈了个巴子的——就是没时间呀,苦逼的嵌入式开发!时间、时间、时间,不是道什么时候才有呀……
      有前辈、高手或者嵌入式开发的爱好者可以加我的QQ:744148994,大家一起讨论,一起研究!
  • 复位

回复评论 (7)

广告做的挺好啊,我帮你修正一下:
嵌入式程序的入口不是main而是——复位中断向量

main只是C语言程序的入口,程序的入口肯定不是main,不管是不是嵌入式
点赞  2017-12-27 14:54
复位中断向量地址
点赞  2017-12-27 14:58
其实简单的8051在keil  c51环境下,加入的startup.a51也是类似的功能,初始化了一些堆栈等操作,最后调用了main。当然也可以不要startup.a51,但可能会出现某些异常的问题。

查看汇编代码,一步一步运行也能看到,并不是一开始就调用main的。
实践出真知
坐而言不如起而行
点赞  2017-12-27 15:06
如果是科普也沒有什麽,打廣告的話,需要把問題說清楚。

不管什麽程序都有入口地址的概念,這個才是程序的運行起點。
系統級的應用會被操作系統加載到入口地址處開始執行。
而沒有系統的MCU的軟件,入口地址受廠商的控制,ARM是從000H開始來執行的。

stm32的startup_stm32f10x_md.s文件寫的很清楚:
This module performs:
       - Set the initial SP
       - Set the initial PC == Reset_Handler  //你指的是這個位置?
       - Set the vector table entries with the exceptions ISR
       - Branches to __main in the C library
点赞  2017-12-27 18:05
main函数是c语言定义的入口。
它只是人为取名的,你在BootLoader中把它命名改为a,b都可以。反正要进入c语言编写的程序都要有一个入口地址,这地址叫main则是大家公认的
点赞  2017-12-28 08:47
我理解的main函数相当于应用层的入口
点赞  2017-12-28 10:27
main是程序入口都是谭浩强教的吧,入口应该是启动文件,那个用汇编写的东西,可能一般都不关心
training
点赞  2017-12-28 21:22
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复