keil中StartUp.A51的重要性
; PPAGEENABLE EQU 0 ;使用PDATA類型變量時(shí)將其設(shè)置成1 PPAGE EQU 0 ;定義頁(yè)號(hào) ; ;------------------------------------------------ NAME ? C_STARTUP ;模塊名為 ? C_STARTUP ? C_51STARTUP SEGMENT CODE ;代碼段 ? STACK SEGMENT IDATA ;堆棧段 RSEG ? STACK ;堆棧 DS 1 EXTRN COE(? C_START) ;程序開始地址 PUBLIC ? C_STARTUP CSEG AT 0x8000 ;定義用戶程序的起始地址,用MON51仿真器時(shí)可能有用 ? C_STARTUP: LFMP STARTUP1 RSEG ? C_51STARTUP STARTUP1: ; ;初始化串口 MOV SCOM, #40H MOV TMOD, #20H MOV TH1, #0FDH SETB TR1 CLR T1 ;單片機(jī)上電IDATA內(nèi)存清零,如果不需要上電清零IDATA,可以注銷IF到IFEDN之間的 ;語(yǔ)句,或者修改IDTALEN的長(zhǎng)度,為了讓CPU具有掉電保護(hù)功能,需要確定IDTALEN的長(zhǎng)度 IF IDATALEN <> 0 MOV R0, # IDATALEN-1 CLR A IDATALOOP: MOV @R0,A DJNZ R0,IDATALOOP ENDIF ; ;單片機(jī)上電XDATA內(nèi)存清零,如果不需要上電清零XDATA,可以注銷IF到IFEDN之間的 ;語(yǔ)句,或者修改XDTALEN的長(zhǎng)度 IF XDATALEN <> 0 MOV DPTR, #XDATASTART MOV R7,#LOW (XDATALEN) IF (LOW(XDATALEN)) <> 0 MOV R6, #(HIGH(XDATALEN))+1 ELSE MOV R6, #HIGH (XDATALEN) ENDIF CLR A XDATALOOP: MOVX @DPTR, A
INC DPTR DJNZ R7, XDATALOOP DJNZ R6, XDATALOOP END IF ; ;送PDATA存儲(chǔ)器頁(yè)面高位地址 IF PPAGEENABLE <> 0 MOV P2, #PPAGE ENDIF ; ;單片機(jī)上電PDATA內(nèi)存清零,如果不需要上電清零XDATA,可注銷IF到IFEDN之 ;間的語(yǔ)句或者修改PDATALEN的長(zhǎng)度 IF PDATALEN <> 0 MOV R0, #PDATASTART MOV R7, #LOW (PDATALEN) CLR A PDATALOOP: MOV @R0, A INC R0 DJNZ R7,PDATALOOP ENDIF ; ;設(shè)置使用SMALL存儲(chǔ)器模式時(shí)再入函數(shù)的堆??臻g IF IBPSTACK <> 0 EXTRN DATA(? C_IBP) MOV ? C_IBP, #LOW IBPSTACKTOP ENDIF ; ;設(shè)置使用LARGE存儲(chǔ)器模式時(shí)再入函數(shù)的堆棧空間 IF XBPSTACK <> 0 EXTRN DATA (? C_XBP) MOV ? C_XBP, #HIGH XBPSTACKTOP MOV ? C_XBP +1, #LOW XBPSTACKTOP ENDIF ; ;設(shè)置使用COMPACT存儲(chǔ)器模式時(shí)再入函數(shù)的堆??臻g IF PBPSTACK <> 0 EXTRN DATA(? C_PBP) MOV ? C_PBP, #LOW PBPSTACKTOP END IF ; ;設(shè)置堆棧的起始地址 MOV SP, #? STACK-1 ;例如 MOV SP, #4FH ; ;如果程序超過(guò)64K,則使用程序分組技術(shù),啟動(dòng)下面的程序
;EXTRN CODE(? B_SWITCH0) ;CALL ? B_SWITCH0 ;程序從第一組bank 0 塊開始執(zhí)行 ;跳轉(zhuǎn)到用戶程序MAIN函數(shù) LJMP ? C_START END startup.a51的作用和匯編一樣,在C中定義的那些變量和數(shù)組的初始化就在startup.a51中進(jìn)行,如果你在定義全局變量時(shí)帶有數(shù)值,如unsigned char data xxx="100";,那startup.a51 中就會(huì)有相關(guān)的賦值。如果沒(méi)有=100,startup.a51就會(huì)把他清0。(startup.a51==變量的初始化)。 這些初始化完畢后,還會(huì)設(shè)置SP指針。對(duì)非變量區(qū)域,如堆棧區(qū),將不會(huì)有賦值或清零動(dòng)作。 有人喜歡改startup.a51,為了滿足自己一些想當(dāng)然的愛(ài)好,這是不必要的,有可能錯(cuò)誤的。比如掉電保護(hù)的時(shí)候想保存一些變量, 但改startup.a51來(lái)實(shí)現(xiàn)是很笨的方法,實(shí)際只要利用非變量區(qū)域的特性,定義一個(gè)指針變量指向堆棧低部:0xff處就可實(shí)現(xiàn)。, 為什么還要去改? 可以這么說(shuō):任何時(shí)候都可以不需要改startup.a51,如果你明白它的特性
評(píng)論