|
當(dāng)在kiel C中新建項(xiàng)目時(shí),會(huì)問:
Copy standard 8051 Starup Code to Project Forder and add file to Project?
翻譯為:復(fù)制8051啟動(dòng)代碼到項(xiàng)目并和添加文件到項(xiàng)目?
其實(shí)無論您選是還是否,您的代碼中都將包含該文件。
該文件的作用是 初始化 內(nèi)外部 RAM使其清零,另外還初始化SP等。
如果上述提示框您選否,對哪些RAM清零將采用默認(rèn)的方式。
如果您想改變RAM清零區(qū)域(假如希望復(fù)位時(shí)某些RAM不被清零時(shí)會(huì)很有用。),您可以選是,這樣該文件的一個(gè)副本將添加到您的項(xiàng)目,您可以根據(jù)需要改寫此文件。
其他SP,SAMLL/COMPACT、LARGE模式的重入函數(shù)的堆棧和指針的初始化等和RAM的道理是一樣的。
關(guān)于51單片機(jī)啟動(dòng)文件STARTUP.A51的詳細(xì)說明
;STARTUP.A51:用戶上電初始化程序
;------------------------------------------------------------------------------
;
; 用戶定義需上電初始化的內(nèi)存空間
;
; 使用以下EQU命令可定義在CPU復(fù)位時(shí)需用0進(jìn)行初始化的內(nèi)存空間
;
; ;IDATA 存儲器的空間的絕對起始地址總是0.
IDATALENEQU 80H ; 需用0進(jìn)行初始化的IDATA存儲器空間的字節(jié)數(shù)
;
XDATASTARTEQU 0H ; XDATA存儲器空間的絕對起始地址
XDATALENEQU 0H ; 需用0進(jìn)行初始化的XDATA存儲器的空間字節(jié)數(shù).
;
PDATASTARTEQU 0H ; PDATA存儲器的空間的絕對起始地址
PDATALENEQU 0H ; 需用0進(jìn)行初始化的PDATA存儲器的空間字節(jié)數(shù).
;
; 注意: IDATA 存儲器的空間在物理上包括了8051單片機(jī)的DATA和BIT存儲器空間.
; 聽說至少要保證與C51編譯器運(yùn)行庫有關(guān)的存儲器的空間進(jìn)行0初始化不知是否
;------------------------------------------------------------------------------
;
; 再入函數(shù)模擬初始化
;
; 以下用EQU指令定義了再入函數(shù)模擬堆棧指針的初始化
;
; 使用SMALL存儲器模式時(shí)再入函數(shù)的堆�?臻g.
IBPSTACKEQU 0 ; 使用SMALL存儲器模式再入函數(shù)時(shí)將其設(shè)置成1.
IBPSTACKTOPEQU 0FFH+1 ; 將堆棧頂設(shè)置為最高地址+1.
;
; 使用LARGE存儲器模式時(shí)再入函數(shù)的堆�?臻g.
XBPSTACKEQU 0 ; 使用LARGE存儲器模式再入函數(shù)時(shí)將其設(shè)置成1.
XBPSTACKTOPEQU 0FFFFH+1; 將堆棧頂設(shè)置為最高地址+1.
;
; 使用COMPACT存儲器模式時(shí)再入函數(shù)的堆棧空間.
PBPSTACKEQU 0 ; 使用COMPACT存儲器模式再入函數(shù)時(shí)將其設(shè)置成1.
PBPSTACKTOPEQU 0FFFFH+1; 將堆棧頂設(shè)置為最高地址+1.
;
;------------------------------------------------------------------------------
;
; 使用COMPACT存儲器模式時(shí)64K字節(jié)XDATA存儲器空間的分頁定義
;
; 以下用EQU指令定義PDATA類型變量在XDATA存儲器空間的頁地址
; 使用EQU指令定義PFAGE時(shí)必須與L51連接定位器PDATA指令的控制參數(shù)一致
;
PPAGEENABLEEQU 0 ; 使用PDATA類型變量時(shí)將其設(shè)置成1.
PPAGEEQU 0 ; 定義頁號.
;
;------------------------------------------------------------------------------
NAME?C_STARTUP ; 模塊名為?C_STAUTUP
?C_C51STARTUPSEGMENT CODE ; 代碼
?STACKSEGMENT IDATA ; 堆棧
RSEG?STACK ; 堆棧
DS 1
EXTRNCODE (?C_START) ; 程序開始地址
PUBLIC?C_STARTUP
CSEGAT 0x8000 ; 定義用戶程序的起始地址,用MON51仿真器時(shí)可能有用
?C_STARTUP:LJMP STARTUP1
RSEG?C_C51STARTUP
STARTUP1:
;
; 初始化串口
MOVSCON,#40H
MOVTMOD,#20H
MOVTH1,#0fdH
SETBTR1
CLRTI
; 單片機(jī)上電IDATA內(nèi)存清零如果不需要上電清零IDATA可以注銷IF到IFEDN之間的話句
; 或者修改IDTALEN的長度為了具有掉電保護(hù)功能不知IDTALEN多長為好
IFIDATALEN <> 0
MOVR0,#IDATALEN - 1
CLR A
IDATALOOP:MOV @R0,A
DJNZR0,IDATALOOP
ENDIF
;
; 單片機(jī)上電XDATA內(nèi)存清零如果不需要上電清零XDATA可以注銷IF到IFEDN之間的話句
; 或者修改XDATALEN的長度
IFXDATALEN <> 0
MOVDPTR,#XDATASTART
MOVR7,#LOW (XDATALEN)
IF(LOW (XDATALEN)) <> 0
MOVR6,#(HIGH (XDATALEN)) +1
ELSE
MOVR6,#HIGH (XDATALEN)
ENDIF
CLR A
XDATALOOP:MOVX @DPTR,A
INCDPTR
DJNZR7,XDATALOOP
DJNZR6,XDATALOOP
ENDIF
;
; 送PDATA存儲器頁面高位地址
IFPPAGEENABLE <> 0
MOVP2,#PPAGE
ENDIF
;
; 單片機(jī)上電PDATA內(nèi)存清零如果不需要上電清零XDATA可以注銷IF到IFEDN之間的話句
; 或者修改PDATALEN的長度
IFPDATALEN <> 0
MOVR0,#PDATASTART
MOVR7,#LOW (PDATALEN)
CLR A
PDATALOOP:MOVX @R0,A
INCR0
DJNZR7,PDATALOOP
ENDIF
;
; 設(shè)置使用SMALL存儲器模式時(shí)再入函數(shù)的堆�?臻g.
IFIBPSTACK <> 0
EXTRNDATA (?C_IBP)
MOV?C_IBP,#LOW IBPSTACKTOP
ENDIF
;
; 設(shè)置使用LARGE存儲器模式時(shí)再入函數(shù)的堆棧空間.
IFXBPSTACK <> 0
EXTRNDATA (?C_XBP)
MOV?C_XBP,#HIGH XBPSTACKTOP
MOV?C_XBP+1,#LOW XBPSTACKTOP
ENDIF
;
; 設(shè)置使用COMPACT存儲器模式時(shí)再入函數(shù)的堆�?臻g.
IFPBPSTACK <> 0
EXTRNDATA (?C_PBP)
MOV?C_PBP,#LOW PBPSTACKTOP
ENDIF
;
; 設(shè)置堆棧的起始地址
MOVSP,#?STACK-1 ; 例如MOV SP,#4FH
;
;This code is required if you use L51_BANK.A51 with Banking Mode 4
; 如果你的程序使用了Mode 4 程序分組技術(shù)請啟動(dòng)下面的程序,不會(huì)吧你的程序超過64K 利害
;EXTRN CODE (?B_SWITCH0)
;CALL ?B_SWITCH0 ; init bank mechanism to code bank 0
; 程序從第一組bank 0 塊開始執(zhí)行
; 跳轉(zhuǎn)到用戶程序MAIN函數(shù)
LJMP?C_START
END
|
評分
-
查看全部評分
|