|
首先,单片机上电后不会去找神马main,在单片机的世界里,没有main,那是C的东东,单片机只有PC寄存器
其次,main作为C的关键字,编译后都是C程序的开始,如果在链接脚本明确指定程序开始地址,那么main的地址就可以知道了,而非你所说的神马不定
1、单片机上电后不会去找神马main,在单片机的世界里,没有main,那是C的东东,单片机只有PC寄存器……
我的原话是:如此一来main函数似乎成为了理所当然的起点——因为C程序往往从main函数开始执行。但一个
经常会被忽略的问题是:微控制器(单片机)上电后,是如何寻找到并执行main函数的呢?
这只是个引子,提出一个疑问:单片机从上电开始,到执行main函数之前,经历了什么样的一个过程。如果你认为你说的话我不懂,那显然你没有看完整篇文章,
文章的最后一句话是这样说的:
当STM32遇到复位信号后,则从0x80000004处取出复位中断服务入口地址,继而执行复位中断服务程序,然后跳转__main函数,最后进入mian函数,来到C的世界。
这句话里面,能看出来我表达的是“单片机上电后会去找main么”?
2、其次,main作为C的关键字,编译后都是C程序的开始……
main是c程序的开始,这是你说的。STM32的启动文件里面有这样一段汇编代码:
IMPORT __main
LDR R0, =__main
BX R0
这段代码的意思是跳转到__main入口,文章中提到:
__main标号表示C/C++标准实时库函数里的一个初始化子程序__main的入口地址。
该程序的一个主要作用是初始化堆栈(对于程序清单一来说则是跳转__user_initial_stackheap标号
进行初始化堆栈的),并初始化映像文件,最后跳转C程序中的main函数。这就解释了为何所有的C程
序必须有一个main函数作为程序的起点——因为这是由C/C++标准实时库所规定的——并且不能更改,
因为C/C++标准实时库并不对外界开发源代码。因此,实际上在用户可见的前提下,程序在第204行后
就跳转至.c文件中的main函数,开始执行C程序了。
我请你求证这段话的准确性,然后请你告诉我C/C++标准实时库__main函数属不属于C程序的一部分,再请
你告诉我main是不是C程序最初开始的地方。
3、如果在链接脚本明确指定程序开始地址,那么main的地址就可以知道了,而非你所说的神马不定……
脚本确实可以定位函数和变量的位置。但如果你没指定呢?你写C代码会亲自定义mian函数的入口地址,然后自己写汇编代码来跳转么?
对于STM32来说,通常的情况是,调用__main函数来达到跳转main函数的结果。
和你争论一点意义都没有,我要牛逼,我还有空来码字?还能看得见你这种技术民工?
[ 本帖最后由 losingamong 于 2011-6-16 16:54 编辑 ] |
|