弄清關(guān)于啟動代碼的幾個問題 啟動代碼通常都燒寫在Flash中,它是系統(tǒng)一上電就執(zhí)行的一段程序,運行在任何用戶C代碼之前 啟動代碼主要完成兩方面的工作,一是初始化執(zhí)行環(huán)境,例如中斷向量表、堆棧、I/O等;二是初始化C庫和用戶應(yīng)用程序。 關(guān)于啟動代碼,有幾個問題需要解解惑! 為什么啟動代碼一定一要用匯編語言編寫? 最開始的幾行代碼要完成初始化中斷向量,堆棧什么的,這些只能用匯編做。 啟動代碼的主要功能是什么? CPU上電后會從IO空間的某地址取第一條指令。但此時:PLL沒有啟動,CPU工作頻率為外部輸入晶振頻率,非常低;CPU工作模式、中斷設(shè)置等不確定;存儲空間的各個BANK(包括內(nèi)存)都沒有驅(qū)動,內(nèi)存不能使用。在這種情況下必須在第一條指令處做一些初始化工作,這段初始化程序與操作系統(tǒng)獨立分開,稱之為bootloader。 一個嵌入式Bootloader最初始部分的代碼幾乎必須是用匯編語言寫成的,因為開發(fā)板剛上電后沒有準(zhǔn)備好C程序運行環(huán)境,比如堆棧指針SP沒有指到正確的位置。匯編代碼應(yīng)該完成最原始的硬件設(shè)備初始化,并準(zhǔn)備好C運行環(huán)境,這樣后面的功能就可以用C語言來寫了。 單片機(jī)不用啟動代碼,為什么ARM要用啟動代碼? 1. C language 沒有 SP(Stack Pointer register), CPSR, CP15 等控制指令, 若要初始化這些, 一定要用 Assembly code, 其它部分不是不能用 C language 實現(xiàn), C language 的運行環(huán)境尚未準(zhǔn)備好, 故 SP 必須先設(shè)好, Global Variable, standard library 都還不能使用。 2. 單片機(jī)沒有 OS 的觀念, 可以說全部都是在啟動代碼的模式。 其實單片機(jī)也是有“啟動代碼”的。只不過這部分工作不需要單片機(jī)程序員自己來完成。 比如用Keil C編寫單片機(jī)程序,針對指定型號的單片機(jī)啟動代碼由Keil來完成了,不需要我們干涉。單片機(jī)程序只需要直接編寫C部分的程序即可。 啟動代碼和Bootloader的區(qū)別和關(guān)系是怎樣的? 啟動代碼是系統(tǒng)上電或者復(fù)位后運行的第一段代碼,是進(jìn)入C 語言的main 函數(shù)之前需要執(zhí)行的那段匯編代碼。它的作用是在用戶程序運行之前對系統(tǒng)硬件及軟件環(huán)境進(jìn)行必要的初始化并在最后使程序跳轉(zhuǎn)到用戶程序。它直接面對ARM 處理器內(nèi)核及硬件控制器進(jìn)行編程,所執(zhí)行的操作與具體的目標(biāo)系統(tǒng)緊密相關(guān)。 C語言程序的運行需要具備一定的條件,如分配好外部數(shù)據(jù)空間,堆棧空間和中斷入口等。另外,匯編代碼可以更直接地對硬件進(jìn)行操作,效率更高,這對啟動中斷等對時間要求更高的情況是非常必要的。 Bootloader 不是一段代碼,它是一個具有引導(dǎo)裝載功能的完整的程序,如可以引導(dǎo)裝載linux的vivi,uboot,以及通常PC機(jī)上的BOIS程序等。 Bootloader 也包含了相應(yīng)的啟動代碼,也就是說,啟動代碼是Bootloader的一部分,是所有相應(yīng)應(yīng)用程序的一部分。 免費試聽C語言、電子、PCB、STM32、Linux、FPGA、JAVA、安卓等。 想學(xué)習(xí)的你和我聯(lián)系預(yù)約就可以免費聽課了。 宋工企鵝號:三五二四六五九零八八 Tel:173--1795--1908 ![]() |