之前在寫(xiě)X86 Linux的時(shí)候提到了BSP基公,它的全稱(chēng)是Boot Strap Processor,是負(fù)責(zé)系統(tǒng)引導(dǎo)啟動(dòng)的處理器宋欺,其余的處理器叫做AP(application processor)轰豆。
其實(shí),另一個(gè)使用BSP最多的是嵌入式系統(tǒng)齿诞,特別是商業(yè)化的嵌入式實(shí)時(shí)操作系統(tǒng)RTOS環(huán)境下酸休。當(dāng)然部分特定的Linux也借用了這個(gè)名字。
在嵌入式系統(tǒng)里面BSP代表board support package祷杈,板級(jí)支持包斑司。雖然常說(shuō)“包治百病”,但是這里的“包”但汞,不一定是真正的package宿刮,而更可能是廠(chǎng)家提供給特定嵌入式平臺(tái)的一個(gè)文件集合,里面包含了針對(duì)特定平臺(tái)和RTOS接口的軟件代碼私蕾。
BSP的產(chǎn)生有著架構(gòu)和商業(yè)上的雙重需要僵缺。
在架構(gòu)上,RTOS把與平臺(tái)無(wú)關(guān)的代碼抽象出來(lái)作為公用的代碼部分踩叭,例如RTOS的內(nèi)核磕潮,網(wǎng)絡(luò)協(xié)議棧等等。而把與具體平臺(tái)相關(guān)的部分交給BSP及其接口來(lái)完成容贝。針對(duì)不同的硬件平臺(tái)自脯,公用部分代碼無(wú)須修改,只要做出不同的BSP就可以了斤富,否則商業(yè)版的RTOS沒(méi)法開(kāi)展業(yè)務(wù)膏潮。
在商業(yè)上,很多RTOS都是閉源的满力,嵌入式系統(tǒng)的硬件平臺(tái)又是數(shù)不勝數(shù)千差萬(wàn)別的戏罢,為了支持這些硬件,廠(chǎng)家只需要“提供”(需要花錢(qián)購(gòu)買(mǎi)的)特定硬件的BSP就可以了脚囊,而B(niǎo)SP是可以提供源代碼的龟糕。
這就好比一臺(tái)汽車(chē),為了適應(yīng)不同的路況悔耘,用戶(hù)可以采購(gòu)不同的輪胎讲岁,只要符合車(chē)輛對(duì)輪胎的規(guī)格要求(BSP接口)就可以了。
BSP主要的作用就是為復(fù)雜多樣的、定制化的嵌入式系統(tǒng)提供一個(gè)支持其硬件的軟件層次缓艳。RTOS的內(nèi)核往往是系統(tǒng)無(wú)關(guān)的校摩,那么針對(duì)特定的硬件,例如總線(xiàn)頻率阶淘,晶振頻率衙吩,串口,SPI ROM, I2C總線(xiàn)溪窒,MAC/PHY坤塞,LCD 控制器,PIO等等澈蚌,操作系統(tǒng)需要定義一套標(biāo)準(zhǔn)接口來(lái)操作這些硬件資源摹芙。而這套接口向下就是BSP的功能。
該軟件部分的首要功能是完成系統(tǒng)的硬件初始化宛瞄,例如浮禾,時(shí)鐘校準(zhǔn),POST份汗,DRAM初始化等等盈电。
另一個(gè)典型的初始化例子是,某ARM的SoC系統(tǒng)中杯活,ARM核的主頻是400MHz挣轨,晶振頻率32.768KHz。其中有2個(gè)UART控制器轩猩,UART1一個(gè)作為外接的串口卷扮,配置為115200 8n1。這個(gè)時(shí)候就需要在BSP當(dāng)中合理設(shè)置UART1控制器均践,使其工作在預(yù)期的模式下晤锹。如果同樣的SoC,但使用的晶振硬件頻率變?yōu)?0.003KHz彤委,那么原來(lái)的BSP代碼就可能導(dǎo)致串口輸出亂碼鞭铆,因?yàn)閁ART1的baud分頻數(shù)在新的晶振頻率下不能得到115200的baud rate。
可見(jiàn)焦影,BSP主要針對(duì)的就是硬件平臺(tái)的特定性规个。
BSP還提供接口使RTOS知道當(dāng)前系統(tǒng)的內(nèi)存資源位置和大小铆农,還包括其他設(shè)備的驅(qū)動(dòng)程序,例如I2C,SPI舒憾,Ethernet等等控轿。例如叶雹,ethtool的底層操作最后都是落在了BSP的驅(qū)動(dòng)代碼里面解阅。
由此可見(jiàn)柄瑰,嵌入式系統(tǒng)中的BSP既類(lèi)似于PC/服務(wù)器里面的BIOS/EFI,完成系統(tǒng)的上電引導(dǎo)初始化工作剪况。同時(shí)BSP又相當(dāng)于OS內(nèi)核驅(qū)動(dòng)程序的底層部分教沾,針對(duì)特定硬件的驅(qū)動(dòng)部分。
BSP工程師的要求是“系統(tǒng)”译断,不光懂CPU授翻,還要懂外設(shè),還要懂軟件孙咪。
BSP是學(xué)習(xí)計(jì)算系統(tǒng)知識(shí)的起點(diǎn)堪唐,通過(guò)它可以了解完整計(jì)算機(jī)系統(tǒng)的主要方面,例如:C語(yǔ)言的堆棧初始化该贾,全局變量,靜態(tài)變量的差異和設(shè)置捌臊,main函數(shù)是如何啟動(dòng)的杨蛋,等等。這里是一個(gè)寶庫(kù)理澎,只要肯挖逞力,總能挖出很多驚喜出來(lái)。
我曾經(jīng)利用BSP里面學(xué)習(xí)到的知識(shí)去面試候選人糠爬,很多候選人對(duì)于main函數(shù)是如何啟動(dòng)的不甚了了寇荧,確實(shí)很遺憾。
嵌入式的BSP先介紹到這里执隧,有空講講嵌入式系統(tǒng)和其中架構(gòu)設(shè)計(jì)揩抡。