前言
这个问题如果是学生问,回答是肯定的(因为你们考试的打答案是:C语言总是从main函数开始执行) 但是当我初学汇编发现好像C语言执行的第一个函数是任意的一、程序是怎么执行的?
环境:stm32103、KEIL5
二、使用步骤
1.引入库
首先从上电开始,CPU是先执行一段汇编(机器语言),设置程序要执行的堆栈大小,初始化中断向量表;
C语言执行过程中要用到栈,所以设置好栈以后就可以跳转到C语言程序了
设置C语言的入口函数为my_main
__Vectors_End
__Vectors_Size EQU __Vectors_End - __Vectors
AREA |.text|, CODE, READONLY
;
Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT my_main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =my_main
BX R0
ENDP
2.C语言函数my_main实现
int my_main(void)
{
delay_init(); //ÑÓʱº¯Êý³õʼ»¯
LED_Init(); //³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú
while(1)
{
LED0=0;
LED1=1;
delay_ms(300); //ÑÓʱ300ms
LED0=1;
LED1=0;
delay_ms(300); //ÑÓʱ300ms
}
}
3.编译链接通过
assembling startup_stm32f10x_hd.s...
compiling misc.c...
compiling stm32f10x_gpio.c...
compiling stm32f10x_dbgmcu.c...
compiling stm32f10x_rcc.c...
compiling stm32f10x_usart.c...
linking...
Program Size: Code=1304 RO-data=304 RW-data=32 ZI-data=1736
FromELF: creating hex file...
"..\OBJ\LED.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed: 00:00:06
4.看一下执行情况
可以看到单步调试时候程序执行到155行后跳转到main()函数内
总结
所以C语言是不是一定从main开始,至少单片机不是,所以其他编译环境应该也可以修改入口函数