????本文面向已經懂得軟件基本操作的職業(yè)老手,如果是未使用過該軟件的小鮮肉,請移步基礎篇。這里以STM32芯片為例對工具進行講解,其他品牌的芯片在工程配置上可能存在差異。
????Keil提供了包括C編譯器、宏匯編、鏈接器、庫管理和一個功能強大的仿真調試器等在內的完整開發(fā)方案,通過一個集成開發(fā)環(huán)境(μVision)將這些部分組合在一起。
????目前軟件對中文的支持不友好,不建議安裝網上的一些漢化包之類的。另外建立的工程文件路徑也盡量不要存在中文,否則可能會出現(xiàn)一些異常。
演示版本:5.24a
????RTX(Real Time eXecutive)是ARM公司針對ARM7,ARM9,cortex-m內核推出的一款嵌入式實時操作系統(tǒng)。RTX的源碼跟Keil-MDK綁定在一起,安裝了Keil-MDK之后,可以在 Keil\ARM\RL\RTX\SRC文件夾下找到源碼。
????所以在Keil上移植RTX操作系統(tǒng)十分方便。
????第一步此選項選擇"RTX kernel"。
????在"Code Generation"中的"ARM Compiler"下拉選項框中可以選擇不同的編譯器版本。選擇不同編譯器版本時,工程配置的一些選項會有相應的變化,這里我們一般默認選用"Use defalut compiler version 5"即可。如果是全新的工程,可以試下V6的編譯器,速度更快,但缺點就是跟現(xiàn)在大部分主流工程不兼容,因為使用的編譯器完全不一樣。
????在Xtal(MHz)后面可以填寫當前使用的開發(fā)板上芯片系統(tǒng)使用的晶振頻率。這個只會在仿真調試中使用,如果直接用開發(fā)板在線調試,這個可以不用管。
????勾選"Use Cross-Module Optimization"選擇跨模塊優(yōu)化,此選項可在編譯鏈接后對文件鏈接再進一步進行優(yōu)化,從而減少一些開銷。選擇此功能時,可能會導致編譯時間變長,但同樣的可以使得編譯后所使用的空間減少。
????勾選"Use MicroLIB"可選擇使用標準缺省庫,勾選這個會導致很多庫函數(shù)用不了,但換來的是節(jié)省了大量的空間。
????如果是M3、M4內核,且芯片硬件有浮點計算單元,可通過勾選"Floating Point Hardware"打開硬件浮點計算功能。
????注意這里有IROM和ROM的區(qū)別,IROM是指片內集成的ROM(上面也有一行小字寫了on-chip),也就是查芯片手冊上規(guī)定好的內部Flash的地址段。先講IROM,一般選好芯片后,工程會默認有一套配置,比如現(xiàn)在選的STM32F302RBTx,其片上Flash是0x8000000開始,大小是128K,也就是這里的0x20000字節(jié)。這前后有兩個選項,“default"可以勾選啟動時是否對此段ROM空間進行初始化。而"Startup"則可以勾選當前程序是要在哪個Flash段開始啟動。
????舉個簡單的例子,像正常的只用一段App程序的情況下,只要設置一段ROM即可,起始即為片內Flash起始地址,默認勾選"default”,也就是程序燒錄時,會把此段Flash進行初始化,并且程序從此地址開始運行。那如果此時我有兩段程序呢?也就是現(xiàn)在常用的一種方式,程序分兩段,一段作為引導程序boot,另一段是實際運行的App程序,那么boot應設置在片內起始地址段,大小根據boot實際占用空間大小來定義。App接在boot地址段后面,此時"Startup"應勾選在boot段。
????注意這里有IRAM和RAM的區(qū)別,IRAM是指片內集成的RAM(上面也有一行小字寫了on-chip),也就是查芯片手冊上規(guī)定好的內部ram的地址段。
注:對于ROM跟RAM的設置,光靠這個界面設置并不全面,最直觀的就是這里IRAM/IROM只有兩段,而STM32H7B0光IRAM就有三段,根本不足以設置。所以想要設置全面,應該使用.sct文件,這個后面會講到。
????在"System Viewer File"選項中勾選"Use Custom File",可以自主選擇芯片的視圖文件?,F(xiàn)在國產化芯片越來越多,不同廠家芯片支持的視圖可能不同。如果使用ST的芯片,這里不用改,使用默認文件即可。
????在"Select Folder for Objects"里可以設置輸出文件的路徑,在"Name of Executable"后面可以設置輸出的文件名。這個輸出文件路徑和文件名也是Keil工程燒錄和調試獲取文件的依據。
????比如這里輸出路徑設置為/Out,文件名為TestPro,那燒錄時,Keil會去查找當前工程路徑下/Out路徑下是否存在TestPro.axf這個文件,有就燒錄,沒有就報錯。如果要使用.Hex文件燒錄,則文件名這里填寫TestPro.Hex。
注:調試只能使用.axf文件,因為.Hex文件不帶調試信息。
????勾選"Create HEX File"即可在編譯后生成.hex文件。
????當需要封裝模塊或打包SDK包時,可以勾選"Create Library"這個選項,該選項與"Create Executable"互斥,選擇生成.lib文件而不是完整的可執(zhí)行.axf文件。這種一般是用于提供二次開發(fā)的軟件包使用。
????勾選"Create Batch File"即可在編譯后生成.bat的編譯執(zhí)行腳本,即可以不用打開Keil工程,只需要執(zhí)行編譯執(zhí)行腳本即可編譯工程軟件。
????勾選"Debug Infomation"可以選擇是否生成調試信息,注意去掉此勾選項時,無法打斷點調試。
????勾選"Browse Infomation"可以選擇是否生成瀏覽信息,有這個瀏覽信息時,可以在Keil里索引函數(shù)或變量的定義,調用等,沒有這個信息就無法把這些信息關聯(lián)起來。如果不用Keil作為代碼編輯器的小伙伴,去掉這個勾選項,可以減少編譯的時間。
Select Folder for Listings…:選擇列表文件的輸出路徑。
Page Width:定義列表文件每行字符數(shù)量。
Page Length:定義列表文件每頁字符數(shù)量。
這兩個基本都用不著,按默認設置即可。
Assembler Listing: .\Listings*.lst:為匯編源文件創(chuàng)建列表文件,對應產生源文件名.lst 的文件。
Cross Reference:列出有關符號的交叉引用信息,包括它們的定義位置以及宏的內部和外部的使用位置。
C Compiler Listing: .\Listings*.txt:為 C 源文件創(chuàng)建列表文件,對應產生 源文件名.txt 的文件 和 源文件名.lst 的文件。
C Preprocessor Listing: .\Listings*.i:指示編譯器生成預處理文件。 宏調用將被展開并且注釋將被刪除 對應產生 源文件名.i 的文件。
Linker Listing: .\Listings\TestPro.map:主要是用來生成代碼詳細信息的map文件,用于后面的代碼分析。這里面有選項建議全部勾選上。
Memory Map:包含一個內存映射,其中包含鏡像中每個加載區(qū),執(zhí)行區(qū)和輸入節(jié)的地址和大小,包括調試和鏈接器生成的輸入節(jié)。
Callgraph:以HTML格式創(chuàng)建函數(shù)的靜態(tài)調用圖文件。調用圖給出了鏡像中所有函數(shù)的定義和參考信息。
Symbols:列出本地,全局和鏈接器生成的符號以及符號值。
Cross Reference:列出輸入節(jié)之間的所有交叉引用。
Size Info:給出鏡像中每個輸入對象和庫成員的代碼和數(shù)據(RO數(shù)據,RW數(shù)據,ZI數(shù)據和調試數(shù)據)大小的列表。
Totals Info:提供輸入對象和庫的代碼和數(shù)據(RO數(shù)據,RW數(shù)據,ZI數(shù)據和調試數(shù)據)大小的總和。
Unused Sections Info:列出從鏡像中刪除的所有未使用的部分。
Veneers Info:提供鏈接器生成的Thumb/ARM膠合代碼的詳細信息。
Before Compile C/C++ File:編輯文件之前
Before Build/Rebuild:編譯工程之前
After Build/Rebuild:編譯工程之后
????一般編譯完會生成.axf文件,如果要生成.bin文件,可以在編譯后調用keil安裝路徑下/ARM/ARMCC/bin/fromelf.exe這個工具,提取.axf文件里的.bin文件。為了把這個操作集成在Keil里,這里可以在"After Build/Rebuild"下面的"Run #1"里添加
$K/ARM/ARMCC/bin/fromelf --bin -o "$L@L.bin" "!L"
????勾選前面的選項框就可以在編譯后執(zhí)行。有時候如果不想執(zhí)行該命令,可以把勾選去掉。
另外"Before Compile C/C++ File"和"Before Build/Rebuild"這兩個也同理,只是執(zhí)行腳本命令的時間不同而已,這個根據實際想要的效果來定。因為這里只有兩個選項,所以如果要執(zhí)行的腳本有很多,建議自己在外面寫個批處理調用其他腳本,然后這里只調用那個批處理即可。
常用的幾個語法如下:
$:擴展為指定文件的路徑名
@ :表示 Output -> Name of Exectable:定義的工程名,比如test1
!:表示當前目錄下的擴展路徑
!L:表示編譯(Build)后,就是 .\obj\xx.axf文件
K:keil develop chaintool 工具鏈(fromelf.exe)
L:Linker output file,比如工程名為test1,L.bin 編譯后,生成的就是最終的test1.bin文件
$K:表示當前Keil安裝的根目錄
$L:是指axf的文件路徑,不含文件名。
@L:是指axf的文件名,不含axf的后綴。
需要知道所有用法的,可以參考官方手冊http://www.keil.com/support/man/docs/uv4/uv4_ut_keysequence.htm
Run “After Build” conditionally:After Build/Rebuild的執(zhí)行條件。沒整明白這個有什么用
Beep When Complete:編譯完成發(fā)出聲音。勾選時在編譯完成時會響一下。
Start Debugging:啟動調試程序。沒整明白這個有什么用
Define:用于做一些工程全局宏定義。
注:在這里修改宏定義時,需要全編譯才可生效,局部編譯是不生效的哦
注:提升優(yōu)化等級后,對代碼的規(guī)范嚴格度提升,調試的友好程度會降低,請適當使用。
Optimize for Time:按時間性能優(yōu)化,一般對代碼執(zhí)行時間比較敏感的,可以勾選這個選項,但勾選后為了提升時間性能,編譯后可能會增加一部分空間占用。(魚與熊掌不可兼得呀)
Split Load and Store Multiple:加載和儲存多個分裂;非對其數(shù)據采用多次訪問方式,當LMD/STM指令有4個以上產生時,則分裂LMD和指令,以減小中斷延遲。
One ELF Section per Function:優(yōu)化每一段函數(shù)ELF段(建議都勾選);每個函數(shù)都會產生一個ELF段,勾選該功能允許優(yōu)化每個ELF,可以減少潛在的共享地址、數(shù)據和函數(shù)之間的字符串;直白說就是可以減少代碼量ROM的大小(內存RAM不會減少)
Strict ANSI C:標準(嚴格)的ANSI C;即編譯時嚴格按照標準的ANSI C進行檢查。為了養(yǎng)成良好的編程習慣,寫出更具移植性的代碼,建議勾選。
Enum Container always int:枚舉時成員變量總為int型。如果空間吃緊,這里就不建議勾選了。
Plain Char is Signed(看情況選擇):字符類型為有符號變量。這個不得不說曾經踩過的坑,原本有個項目,從C51平臺移植到ST的平臺,發(fā)現(xiàn)怎么跑都不對勁,后面發(fā)現(xiàn)代碼里很多8位的變量定義用的是char,在C51平臺編譯器編譯成無符號類型,到ST平臺就變成有符號類型。所以很多教材里說signed這個關鍵字可以省略,不適用于所有情況。為了可移植性,最好都寫上,或者IDE里有類似這種選項時,要多留個心眼。
Read-Only Position Independent:為常量生成獨立的代碼空間;比如我們可以將字庫變量定義為常量,勾選該功能后會將這些字庫變量放在獨立的代碼空間中。
Read-Write Position Independent:為可讀寫代碼生成獨立的代碼空間。
Warnings(建議All Warnings):No Warning:不會有警告提示和輸出;All Warnings:所有警告提示和輸出。建議選All Warnings,很多告警都不是空穴來風,檢查下好點。
Thumb Mode(注意:在工程中該模式為默認,即無法選擇):Thumb模式;指定設置文件或文件夾(組)為Thumb模式。
No Auto Includes(一般不勾選):不自動添加頭文件;不勾選該項則編譯器會在Keil安裝路徑下尋找工程中的 .h 文件。如果使用了標準庫,勾選后Keil只會在工程路徑下找?guī)旌瘮?shù)的頭文件,如果沒自己加進來一般是找不到的。
C99 Mode(看情況選擇):C99模式,勾選選擇啟用C99標準,如不勾選,則按C89標準來。為了高移植性,不建議勾選。
Include Paths:包含路徑,Keil編譯時查找頭文件,除了Keil本身安裝路徑下和自身工程路徑,還有一個就是這里添加的路徑。
Misc Controls:多功能控件,比如這里添加–gnu,可以使用gnu編程規(guī)范。
Compiler control string:編譯器控制字符串,這個只是用來看當前的一些編譯器設置,通過上面不同的勾選設置,這里會有不同的顯示。如果沒有Keil這種界面化工具,自己想要給編譯器設置,就可以使用該窗口中的這些指令。
Conditional Assembly Control Symbols(有條件的裝配控制符號)
Define:定義,指定匯編條件。
Language/Code Generation(語言代碼生成)
Read-Only Position Independent:為常量生成獨立的代碼空間。
Read-Write Position Independent:為可讀寫代碼生成獨立的代碼空間。
Thurmb Mode:Thumb模式;指定設置文件或文件夾(組)為Thumb模式。
No Warnings:無警告,勾選后不會有warning警告提示。
Split Load and Store Multiple:加載和存儲多個分裂。
Execute-only Code:只生成執(zhí)行代碼。
No Auto Includes:不自動添加頭文件(一般不勾選)。
Include Paths:頭文件包含路徑。
Misc Controls:多功能控件。
Assembler control string:編譯器控制字符串。
Make RW Sections Position Independent:使RW段獨立。
啟用時:變量區(qū)域(包含RW和ZI)具有獨立地址。
禁用時:變量區(qū)域(包含RW和ZI)位于絕對的內存地址。
Make RO Sections Position Independent:使RO段獨立。
啟用時:常量和代碼區(qū)域(RO)具有獨立地址。
禁用時:常量和代碼區(qū)域(RO)位于絕對的內存地址。
一般這兩項都是禁用狀態(tài),即程序所有編譯出來的函數(shù)、變量等,都使用絕對地址,在Map文件中查看到的都是一個絕對地址,燒入板子中即可使用。那什么時候會把它開啟呢?當有需要用到多個App,且App起始地址不固定時,就要使用此功能了。這個有興趣可以單獨開一篇詳細討論下。
Don’t Search Standard Libraries:不搜索標準庫。
Report 'might fail’ Conditions as Errors:報告’might fail’條件認為是錯誤。
X/O Base:X/O基地址
R/O Base:R/O基地址
R/W Base:R/W基地址
disable Warnings:禁止告警命令
Misc controls:多功能控件。
Linker control string:鏈接器控制字符串。
通過單選"Use Simulator"和"Use XXX"選擇是用模擬仿真還是在線仿真
Use ST-Link Debugger:選擇燒錄器類型
Load Application at Startup:從啟動文件開始加載。不勾選時,在進入調試時,不會重新從啟動開始執(zhí)行,但不勾選時,需要手動添加.ini文件,把.axf的調試信息放到Keil里,不然進入調試時無法打斷點,也無法追蹤到當前程序位置。這點在網上查“如何不復位進入調試”很多會提到這個勾選項,但很少有提及這個.ini的事情,有也是一帶而過。
Initlalization File:初始化文件,承接上文,只要新建一個XXX.ini文件(文件名隨意),點擊…按鈕,添加該文件,點旁邊的"Edit"按鈕,在文件中添加 “LOAD %L INCREMENTAL” 這一句即可。
LOAD %L INCREMENTAL
Run to main():跑進main函數(shù),進入調試后,會在main里停止,相當于是在main的第一行打了第一個斷點。如果不勾選時,一進入調試就全速跑。
使用上一次調試過程對Breakpoints,Watchpoints,Memory Display和Toolbox(如果這些項被選中的話)
Breakpoints:斷點。
Watch Windows:變量調試窗口。
Memory Display:查看內存的窗口。
Toolbox:工具欄。
System Viewer:系統(tǒng)視圖。
Driver DLL:驅動動態(tài)庫文件,后面Parameter是其對應參數(shù)。
Dialog DLL:會話框動態(tài)庫文件,后面Parameter是其對應參數(shù)。
這些是仿真的時候需要用到的動態(tài)庫,一般不用修改,使用默認值就行,這些動態(tài)庫在Keil的安裝路徑下了可以找得到。
Unit:當前連接的燒錄器設備,當同時連有多個設備時,這里可以切換選擇。如果這里沒有可選設備,說明當前電腦未識別到燒錄器設備。
Serial:設備
Version FW:固件版本
HW:硬件版本號
Port :端口類型,可以選擇SW或JTAG接口,如果用的是Nucleo開發(fā)板,這里選SW接口。
Clock:時鐘設置,可以設置調試的速度。
Req:請求頻率
Selected:實際頻率
連接跟復位設置(Connect & Reset Options)
Connect:連接設置,Normal
Reset:復位設置
Reset after Connect:連接后復位,不勾選時可以在進入調試時不中斷當前設備運行。
緩存設置(Cache Options)
Cache Code:緩存代碼,通知調試器已經下載的程序代碼不會改變,選中的話uVision將不會從目標系統(tǒng)讀取程序代碼。
Cache Memory:緩存內存,決定調試程序期間程序停止運行的時候,是否更新存儲器顯示。
下載設置(Download Options)
Verify Code Download:下載時檢驗代碼。比較目標存儲器和調試器上的應用程序的內容。
Download to Flash:下載至Flash。將代碼下載到所有的存儲器區(qū)域,如果不選中,調試器不會把代碼下載到Flash Download Setup中指定的存儲器地址范圍。
SWDIO:通過SWD接口連接的設備列表,其中IDCODE為連接的設備ID,Device Name為連接的設備名稱。如果當前燒錄器跟芯片之間沒有正常連接,此處不顯示設備名稱。
Core Clock:核心時鐘頻率。設置跟當前板子相同的時鐘頻率,可以在調試時按實際運行時間進行追蹤調試。
Trace Enable:使能追蹤功能。
Erase Full Chip:擦除整片
Erase Sectors:擦除部分
Do not Erase:不擦除
勾選Erase Full Chip時,每次下載時,都會對整片F(xiàn)lash進行擦除操作。勾選Erase Sectors時,下載時只會擦除使用到的扇區(qū)。勾選Do not Erase時,則下載時不擦除原本代碼。
Program:燒錄
Verify:校驗
Reset and Run:復位并運行
勾選Program時,下載時才會把代碼寫入Flash,否則不寫入。勾選Verify時,則在燒錄代碼后,對代碼進行校驗。某些場合下不能檢驗,比如代碼段跟數(shù)據段分開下載,代碼里不包含數(shù)據部分,而工程里配置的代碼段又包含數(shù)據段時,此時如果進行校驗,可能會因為數(shù)據內容不一致導致校驗失敗。勾選Reset and Run時,則在下載完成后立即復位運行代碼,不勾選時則需要手動復位運行。
RAM for Algorithm:給燒錄算法的RAM空間,Start和Size分別設置對應Ram空間的起始地址和大小,這個一般選擇完芯片后按默認就行,不用修改,如果有需要直接燒寫的片外Flash的,可能需要自己寫燒寫算法的,此時就需要關注這個Ram空間是否容得下自己編寫的燒錄算法大小,需要做適當?shù)恼{整。
????基本設置跟在線是一樣的,多了一個"Limit Speed to Real-Time"的選項,意思是把速度限制到實際時間。但Keil怎么知道實際速度是怎么樣的呢?所以這里還需要設置一個運行頻率,即前文說到,在Target里有個頻率設置。勾選此選項后,在離線仿真時,代碼執(zhí)行速度就是按設定的運行頻率來跑,接近實際板子的速度。如果不勾選,那就直接起飛了(按電腦頻率來跑,有多快跑多快)。
Use Target Driver for Flash Programming:使用跟調試一致的燒錄器進行Flash下載。
Use Debug Driver:使用調試設備,即下載和調試使用同一種燒錄器設備。
Update Target before Debugging:在調試前更新代碼,勾選后一般是只有在剛打開工程或編譯后,第一次進入調試時,會把當前代碼燒錄進目標板再進行調試。不勾選則進入調試時不更新代碼。
Use External Tool for Flash Programming:使用第三方的工具進行Flash下載。
Command:要使用的Flash燒寫工具的命令文件(通常是一個.exe文件)。
Arguments:傳遞給Flash燒寫工具的參數(shù)。
Run Independent:當選中的時候,uVision不等待Flash燒寫完成。不選中的時候uVision要等待Flash燒寫完成并且在輸出窗口顯示燒寫結果。
通過在編譯過程中調用FCARM,輸入配置映像文件處理(FCARM)的選項。這將把鏡像文件轉換成c源代碼。其中Output File為輸出的c文件名,Add Output File to Group這個默認不需要修改,Image Files Root Folder填寫需要轉換的鏡像文件
????STM32、RTX、FPU、SVD、Hex、Bin、axf、Lib、sct、燒錄算法、啟動文件、Map文件。
相關文章:Keil5軟件使用-基礎使用篇、Keil5軟件使用-進階調試篇、Keil軟件包-知識寶藏庫
聯(lián)系客服