熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2021-2-24 16:26
正文摘要:新建單片機(jī)項(xiàng)目時(shí),沒有選擇拷貝啟動文件,程序也能運(yùn)行。請問這個(gè)啟動文件有什么用處呢? |
不添加的話 就默認(rèn)用默認(rèn)的安裝路徑下面的庫 加了的話 就用你添加的。 你可以稍微改動點(diǎn)試試 比如 內(nèi)存清零部分 讓只是清除部分內(nèi)存 |
startup.a51在庫文件.lib里面已經(jīng)存在了,所以你不加人工程也可以用。但是你要是想修改其中的內(nèi)容,來符合你的工程,就必須加入你的工程里面了。.a51會被編譯成.obj,鏈接的時(shí)候優(yōu)先級比.lib文件高,自然會替代庫文件里面的內(nèi)容。 |
參與人數(shù) 1 | 黑幣 +20 | 收起 理由 |
---|---|---|
![]() | + 20 | 回帖助人的獎(jiǎng)勵(lì)! |
你管他干啥呢 選擇OK就是了 重點(diǎn)是如何編程實(shí)現(xiàn)自己的設(shè)計(jì)目標(biāo), |
清理RAM.設(shè)置堆棧等.即執(zhí)行完start.a51后跳轉(zhuǎn)到.c文件的函數(shù). ,在C中定義的那些變量和數(shù)組的初始化就在startup.a51中進(jìn),如果你在定義全局變量時(shí)帶有數(shù)值,如unsigned char data xxx="100";,那 中就會有相關(guān)的賦值。如果沒有=100,startup.a51就會把他清0。 startup.a51==變量的初始化)。這些初始化完畢后,還會SP指針。對非,如堆棧區(qū),將不會有賦值或清零動作。 有人喜歡改startup.a51,為了滿足自己一些想當(dāng)然的愛好,這是不必要的,比如掉電保護(hù)的時(shí)候想保存一些變量, 但改startup.a51來實(shí)現(xiàn),實(shí)際只要利用非變量區(qū)域的特性,定義一個(gè)指針變量指向堆棧低0xff處就可實(shí)現(xiàn)。為什么還要去改? 可以這么說:任何時(shí)候都可以不需startup.a51,如果你明白它的特性。 |
參與人數(shù) 1 | 黑幣 +20 | 收起 理由 |
---|---|---|
![]() | + 20 | 回帖助人的獎(jiǎng)勵(lì)! |
當(dāng)在kiel C中新建項(xiàng)目時(shí),會問: Copy standard 8051 Starup Code to Project Forder and add file to Project? 翻譯為:復(fù)制8051啟動代碼到項(xiàng)目并和添加文件到項(xiàng)目? 其實(shí)無論您選是還是否,您的代碼中都將包含該文件。 該文件的作用是 初始化 內(nèi)外部 RAM使其清零,另外還初始化SP等。 如果上述提示框您選否,對哪些RAM清零將采用默認(rèn)的方式。 如果您想改變RAM清零區(qū)域(假如希望復(fù)位時(shí)某些RAM不被清零時(shí)會很有用。),您可以選是,這樣該文件的一個(gè)副本將添加到您的項(xiàng)目,您可以根據(jù)需要改寫此文件。 其他SP,SAMLL/COMPACT、LARGE模式的重入函數(shù)的堆棧和指針的初始化等和RAM的道理是一樣的。 關(guān)于51單片機(jī)啟動文件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ù)的堆棧空間. 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ù)的堆?臻g. 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ù)的堆?臻g. 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ù)請啟動下面的程序,不會吧你的程序超過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 |
參與人數(shù) 1 | 黑幣 +20 | 收起 理由 |
---|---|---|
![]() | + 20 | 回帖助人的獎(jiǎng)勵(lì)! |
Powered by 單片機(jī)教程網(wǎng)