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