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