一.target名更改
打開Keil后,左側(cè)Project Workspace中的target可改,方法:右擊Target——Manage Compnents——雙擊待修改項即可,若要添加,使用對話框內(nèi)對應工具欄。
二.option for target 設(shè)置之TARGET項
1 MEMARY MODEL
Small:變量存儲在內(nèi)部ram里.
Compact:變量存儲在外部ram里,使用頁8位間接尋址
Large:變量存儲在外部Ram里,使用16位間接尋址.
我們一般使用Small來存儲變量,就是說單片機優(yōu)先把變量存儲在內(nèi)部ram里,如果內(nèi)部ram不夠了,才會存到外部去.Compact的方式要自己通過程序來指定頁的高位地址,編程比較復雜,如果外部ram很少,只有256個字節(jié),那么對該256個字節(jié)的讀取就比較快,用MOVX @Ri,A 或MOVX A,@Ri指令.
如果超過256字節(jié),那么要不斷地進行切換的話,就比較麻煩.Compact模式適用于比較少的外部ram的情況.Large模式,是指變量會優(yōu)先分配到外部ram里,用MOVX A,@DPTR或MOVX @DPTR,A來讀取.要注意的是,3種存儲方式都支持內(nèi)部256字節(jié)和外部64k字節(jié)的ram.區(qū)別是變量的優(yōu)先(或默認)存儲在哪里的區(qū)別.除非你不想把變量存儲在內(nèi)部ram,才使用后面的Compact,Large模式.因為變量存儲在內(nèi)部ram里,運算速度比存儲在外部ram要快的多,大部分的應用都是選擇Small的模式.
使用Small的方式:也不是說變量就不可以存儲在外部,一樣可以存儲在外部,只是你要指定,比如:
unsigned char xdata a; //那么變量a就存儲在外部的ram.
unsigned char a; //變量存儲在內(nèi)部ram.
假如用Large的模式:
unsigned char xdata a; //那么變量a就存儲在外部的ram.
unsigned char a; //變量存儲在外部ram.
這就是區(qū)別,就是說這幾個選項只是影響沒有特別指定變量的存儲空間的時候,默認存儲在哪里,比如上面的變量定義unsigned char a .
2. CODE ROM SIZE
Small: program 2K or less ;適用于89c2051這些芯片,2051只有2k的代碼空間,所以跳轉(zhuǎn)地址只有2k,編譯的時候會使用ACALL AJMP這些短跳轉(zhuǎn)指令,而不會使用LCALL,LJMP指令.如果你的代碼跳轉(zhuǎn)超過2k,那么會出錯.
Compact:2k functiongs ,64k program:表示每個子函數(shù)的程序大小不超過2k,整個工程可以有64k的代碼.就是說在main()里可以使用LCALL, LJMP指令,但在子程序里只會使用ACALL,AJMP指令.除非你確認你的每個子程序不會超過2k,否則不要用Compact方式.
Large:64K program:表示程序或子函數(shù)都可以大到64k.使用code bank還可以更大.通常我們都選用該方式.Code Rom Size選擇Large方式速度不會比Small慢很多,所以一般沒有必要選擇Compact和Small的方式.我們這里選擇Large方式.
3. OPERATING NONE:不適用操作系統(tǒng) RTX51-TINY:使用TINY操作系統(tǒng) RTX-FULL:使用FULL操作系統(tǒng)
Keil C51 提供了Tiny多任務操作系統(tǒng),使用定時器0來做任務切換,效率很低,無實用價值。Full需要用戶使用外部RAM,且需要單獨購買運行庫,不能使用,默認選NONE。
4. 存儲器選擇 1. Use On-chip ROM(0x0-0x1fff)
這個選項是使用片上的Flash Rom,我們知道At89c52有8k的flash Rom.取決于你的應用系統(tǒng),你的單片機的EA接高電平的話,請選中這個選項,如果你的單片機的EA接低電平,表示使用外部Rom,那么不要選中該選項.
2. Off-chip Code memory
表示你在片外接的Rom的開始地址和大小,如果你沒有外接程序存儲器,那么不要填任何數(shù)據(jù).我們在這里假設(shè)使用一個片外的Rom,地址從0x8000開始(不要填成8000,如果是8000,是10進制的數(shù),一般填16進制的數(shù)),Size為外接Rom的大小.假設(shè)接了一塊0x1000字節(jié)的rom.最多可以外接3塊Rom,如果你還用了別的地址,那么就添上.
3. Off-Chip Xdata Memory
那么可以填上你外接的Xdata(外部數(shù)據(jù)存儲器的起始地址和大小,一般的應用是接一個62256,我們在這里特殊的指定Xdata的起始地址為0x2000,大小為0x8000;
5. Code Banking
使用Code Banking技術(shù).keil可以支持程序代碼超過64k的情況,最大可以有2兆的程序代碼.如果你的代碼超過64k,那么就要使用Code Banking技術(shù),以支持更多的程序空間.Code Banking是一個高級的技術(shù),支持自動的Bank的切換,是建立一個大型系統(tǒng)的需要,比如你要在單片機里實現(xiàn)漢字字庫,實現(xiàn)漢字輸入法,都要用到該技術(shù).我們會在以后的文章里論述Bank技術(shù).我們在這里不選中它.
二.option for target 設(shè)置之output項
select folder for object:選擇編譯之后的目標文件所存放的目錄,默認存放在工程文件夾中。
name of executable:設(shè)置生成的目標文件的名字,默認是工程名。
creat executable:生成OMF和HEX文件,OMF文件名同工程文件名但沒有擴展名。
creat hex file:選中該項編譯后生成可以少些的HEX文件。
creat library:生成lib庫文件,默認不選。
after make :1.beep when complete:編譯完成后提示聲響
2.start debugging:編譯完成后馬上啟動調(diào)試(軟件仿真或硬件仿真),默認不選中
3.run user program1,run user program2:根據(jù)需要設(shè)置編譯之后的應用程序,比如自己編寫的燒寫芯片的程序,或調(diào)用外部仿真程序。
3.listing
select folder for listings:選擇列表文件存放的目錄,默認為工程文件所在的目錄。
*.lst,*.m51文件對了解程序用到了哪些idata、data、bit、xdata、code、RAM、ROM、Stack等有很重要的作用。
Assembly code生產(chǎn)匯編的代碼,根據(jù)需要決定是否選擇。
4.c51
用于對Keil的C51編譯器編譯過程進行控制,其中比較常用的是“code optimization”組,該組中l(wèi)evel是優(yōu)化等級,C51在對源程序進行編譯時可以對代碼多至9級優(yōu)化,默認使用8級,一般不必修改。如果在編譯中出現(xiàn)一些問題可以降低優(yōu)化級別試一試。
emphasis是選擇編譯優(yōu)先方式,第一項是代碼量優(yōu)化(最終生成的代碼量?。?,第二項是速度優(yōu)先(最終生成的代碼速度快),第三項是默認的,是速度優(yōu)先,可根據(jù)需要更改。
5.BL51 locat
使用KeilC51軟件,可以很方便地將代碼或者數(shù)據(jù)絕對定位到某個地址。
1、代碼定位
方法1:使用偽指令CSEG。比如要將MyFunc1定位到代碼區(qū)C:0x1000,則新建一個A51文件,添加以下內(nèi)容:
PUBLIC MYFUNC1
CSEG AT 1000H
MYFUNC1:
;其它代碼
RET
在其它源文件中,就可以調(diào)用MyFunc()函數(shù)了。需要注意的是,編譯器不檢測傳遞參數(shù)的數(shù)目,僅檢測函數(shù)是否有返回值。
方法2:使用BL51 Locate選項。比如在main.c中定義了一個MyFunc2函數(shù),并且要將該函數(shù)定位到代碼區(qū)C:0x2000,則從菜單中選擇Project->Options for Target 'Target1',在彈出的對話框中選擇BL51 Locate頁,在下面的code欄中寫上?PR?MYFUNC2?MAIN(0x2000)即可。如果想定位多個函數(shù),也可以使用*通配符。
2、變量定位
只有全局變量可以絕對定位,局部變量無法實現(xiàn)絕對定位。
方法1:使用_at_關(guān)鍵字。聲明一個全局變量unsigned char data MyBuf1[8] _at_ 0x20;
方法2:使用BL51 Locate選項。比如將main.c中定義的所有data型的全局變量定位到數(shù)據(jù)區(qū)D:0x28開始的空間,則從菜單中選擇Project->Options for Target 'Target1',在彈出的對話框中選擇BL51 Locate頁,在下面的data欄中寫上?DT?MAIN(0x28)即可。如果是idata,則使用?ID?MAIN(0x28),如果是xdata,則使用?XD?MAIN(0x28),如果是pdata,則使用?PD?MAIN(0x28)
3、堆棧定位
在STARTUP.A51文件中定義了堆棧區(qū)?STACK,其起始地址同樣可以在BL51 Locate頁中設(shè)置,在Stack欄寫上?STACK(0x80)
4、函數(shù)定位
假如要把C源文件 tools.c 中的函數(shù)
int BIN2HEX(int xx)
{
...
}
放在CODE MEMORY的0x1000處,先編譯該工程,然后打開該工程的M51文件,在
* * * C O D E M E M O R Y * * *
;行下找出要定位的函數(shù)的名稱,應該形如:
CODE xxxxH xxxxH UNIT ?PR?_BCD2HEX?TOOLS
然后在:Project->Options for Target ...->BL51 Locate:Code中填寫如下內(nèi)容:?PR?_BCD2HEX?TOOLS(0x1000)再次Build,在M51中會發(fā)現(xiàn)該函數(shù)已放在CODE MEMORY的0x1000處了
5、賦初值的變量定位:
要將某變量定位在一絕對位置且要賦初值,此時用 _at_ 不能完成,則如下操作:
在工程中建立一個新的文件,如InitVars.c,在其中對要處理的變量賦初值(假設(shè)是code變量):
char code myVer = {"COPYRIGHT 2001-11"};
然后將該文件加入工程,編譯,打開M51文件,若定義的是code型,則在
* * * C O D E M E M O R Y * * *
;下可找到:
CODE xxxxH xxxxH UNIT ?CO?INITVARS
然后在:Project->Options for Target ...->BL51 Locate:Code中填入:?CO?INITVARS(0x200),再次編譯即可。
相應地,如為xdata變量,則InitVars.c中寫:
char xdata myVer = {"COPYRIGHT 2001-11"};
然后將該文件加入工程,編譯,打開M51文件,在
* * * X D A T A M E M O R Y * * *
;下可找到:
XDATA xxxxH xxxxH UNIT ?XD?INITVARS
然后在:Project->Options for Target ...->BL51 Locate:Xdata中填入:?XD?INITVARS(0x200),再次編譯即可。相應地,若定義的是data/idata等變量,則相應處理即可。
3、若有多個變量或函數(shù)要進行絕對地址定位,則應按地址從低到高的順序排列。
====