單片機C程序main函數(shù)之前做了什么
在測試c語言單片機程序的時候,發(fā)現(xiàn)在main函數(shù)的執(zhí)行之前,有很長的一段時間的延時,單片機在這段時間在做什么?進行了一下分析,得到結(jié)論如下:
C程序
#include
sbit p1_7=P1^7;
void interrupt0() interrupt 0 using 2
{
p1_7=!p1_7;
}
void main()
{
EA=1;
IT0=1;
EX0=1;
p1_7=0;
do{}while(1);
}
生成的機器碼:
:03000300020006F2 中斷入口
:03000600B297327C 中斷程序
:0B000900D2AFD288D2A8C29780FE229E main函數(shù)
:03000000020014E7 程序的起始
:0C001400787FE4F6D8FD75810702000932
:00000001FF
下面分析一下,機器碼:0B000900D2AFD288D2A8C29780FE229E這一段就是main()內(nèi)部的內(nèi)容,我們發(fā)現(xiàn)還有一段代碼,這段代碼的執(zhí)行是在main函數(shù)的前面,而在main函數(shù)執(zhí)行之前,又執(zhí)行了什么操作呢?
對:0C001400787FE4F6D8FD75810702000932這段代碼進行反匯編
MOV R0,7FH
CLR A
LOOP: MOV @R0,A
DJNZ R0,LOOP
MOV 81H,07H
LJMP 0009H
就會發(fā)現(xiàn)這段代碼的作用實際上在main()函數(shù)執(zhí)行前,把256B的ram區(qū)全清空,根據(jù)這個可以判斷單片機是硬起動還是軟件復位。