1 底層驅(qū)動(dòng)的那些事
先說(shuō)說(shuō)MBD關(guān)于底層驅(qū)動(dòng)的一些基本情況。
我們知道,MBD是通過(guò)建立模型來(lái)生成代碼,然而并不是所有的代碼都能建立模型,嵌入式系統(tǒng)中的底層驅(qū)動(dòng)(Low Level Drivers,LLD)就屬于這樣的代碼。之所以底層驅(qū)動(dòng)代碼不能建立模型,是因?yàn)槠渚哂邢旅孢@樣的特征:
- 沒(méi)有明顯是數(shù)學(xué)邏輯,無(wú)法使用數(shù)學(xué)表達(dá)式表達(dá);
- 與芯片的外設(shè)(Peripherals,例如ADC、PWM等外設(shè))息息相關(guān),不同的芯片可能差別很大;
- 嚴(yán)格規(guī)范的底層驅(qū)動(dòng)需要滿(mǎn)足一定的要求,例如AUTOSAR;
- 底層驅(qū)動(dòng)往往需要頻繁的調(diào)用;
- 配置底層驅(qū)動(dòng)的邏輯關(guān)系往往比較復(fù)雜。
模型擅長(zhǎng)處理的是數(shù)學(xué)問(wèn)題,而底層驅(qū)動(dòng)本質(zhì)上是一種格式化的代碼,是一套與芯片設(shè)計(jì)、功能配置聯(lián)系緊密的流程式操作,所以不適合建模實(shí)現(xiàn)。
很多剛?cè)腴T(mén)MBD的讀者可能并不具備嵌入式相關(guān)的基礎(chǔ)(學(xué)習(xí)MBD大多是機(jī)械、汽車(chē)專(zhuān)業(yè)的,很少有電子、自動(dòng)化和計(jì)算機(jī)專(zhuān)業(yè)的),這里給大家看看實(shí)際的嵌入式工程中,底層驅(qū)動(dòng)究竟是什么樣子的。下面這段代碼摘自NXP(恩智浦)電機(jī)控制工具包MCSPTE1AK144中的部分代碼:
int main(void)
{
McuClockConfig(); /* 配置時(shí)鐘 */
McuCacheConfig(); /* 配置緩存 */
McuPowerConfig(); /* 配置功耗模式 */
McuIntConfig(); /* 配置中斷 */
McuSimConfig(); /* 配置系統(tǒng)集成模塊 */
McuTrigmuxConfig(); /* 配置觸發(fā)單元 */
McuPinsConfig(); /* 配置Pin腳 */
McuLpuartConfig(); /* 配置UART(通用異步收發(fā)) */
McuAdcConfig(); /* 配置ADC */
McuPdbConfig(); /* 配置延時(shí)計(jì)時(shí)器 */
McuFtmConfig(); /* 配置PWM輸出模塊 */
FMSTR_Init(); /* 配置上位機(jī)通信模塊 */
GD3000_Init(); /* 配置預(yù)驅(qū)芯片 */
MCAT_Init(); /* 配置FOC初始化 */
for(;;){ /* 省略 */ } /* 進(jìn)入死循環(huán) */
return 0;
}
可以看到,程序在進(jìn)入死循環(huán)之前,全部的工作都在進(jìn)行底層配置的初始化,以ADC為例,底層配置初始化調(diào)用的底層驅(qū)動(dòng)API是這樣的:
void McuAdcConfig (void)
{
/* ADC0 module initialization */
ADC_DRV_ConfigConverter(INST_ADCONV0, &adConv0_ConvConfig0);
/* ADC1 module initialization */
ADC_DRV_ConfigConverter(INST_ADCONV1, &adConv1_ConvConfig0);
/* AD4 input channel is used for PhaseA stator current sensing */
ADC_DRV_ConfigChan(INST_ADCONV0, 0, &adConv0_ChnConfig0);
/* AD7 input channel is used for DC bus voltage sensing */
ADC_DRV_ConfigChan(INST_ADCONV1, 0, &adConv1_ChnConfig0);
/* AD15 input channel is used for PhaseB stator current sensing */
ADC_DRV_ConfigChan(INST_ADCONV1, 1, &adConv1_ChnConfig1);
}
這些API由NXP的S32K1xx SDK3.0.0提供。而實(shí)際上,這些API之下還有硬件訪(fǎng)問(wèn)層(Hardware Access Layer),在這一層完全變成了寄存器位操作,那就更沒(méi)辦法搭建模型了。
所以,一款芯片的底層驅(qū)動(dòng)本身就是一套非常復(fù)雜的軟件,這樣的底層軟件不需要芯片使用者來(lái)開(kāi)發(fā),通常由芯片制造商提供,開(kāi)發(fā)者直接使用即可。
在MBD中就沒(méi)有相應(yīng)的解決方案了嗎?實(shí)際上是有的,這就要提到部分芯片廠(chǎng)商會(huì)發(fā)布的另一種MBD工具包(也稱(chēng)為硬件支持包)。還是以NXP為例,NXP會(huì)隨著某一款芯片,發(fā)布其基于Simulink的 MBDT (Model-Based Design Toolbox)工具包。該工具包作為Simulink的擴(kuò)展,可以實(shí)現(xiàn)大部分底層驅(qū)動(dòng)的配置。例如NXP S32K1xx的MBDT,安裝好后在Simulink的庫(kù)中可以看到相應(yīng)的底層驅(qū)動(dòng)模型:
NXP MBDT底層驅(qū)動(dòng)模型 - Frome NXP MBDT
而使用模型的方式,底層驅(qū)動(dòng)的初始化就變成了這樣,只需要把需要初始化的模塊放置在模型中即可:
NXP MBDT底層驅(qū)動(dòng)初始化 - Frome NXP MBDT
雙擊ADC0_Init模型可以編輯底層驅(qū)動(dòng)的一些配置選項(xiàng),例如采樣精度等參數(shù):
NXP MBDT底層驅(qū)動(dòng)配置示例 (ADC) - Frome NXP MBDT
除了上面提到的NXP,其他芯片廠(chǎng)商也會(huì)提供這種類(lèi)似的MBD工具包,匯總?cè)缦拢?/p>
- TI(德州儀器)
- NXP(恩智浦)
- ST(意法半導(dǎo)體)
- Renesas(瑞薩)
- infineon(英飛凌)
- Microchip(微芯科技)
- Arduino(沒(méi)找到中文名
- Raspberry Pi(樹(shù)莓派)
最后兩家并不是芯片廠(chǎng)商,Arduino是開(kāi)源電子原型平臺(tái),樹(shù)莓派已經(jīng)屬于微型電腦了,這說(shuō)明了MBD的應(yīng)用領(lǐng)域是可以上升到更加高級(jí)的場(chǎng)合,并非限于MCU領(lǐng)域。
當(dāng)然還有很多其他家的MBD工具包,這里只列舉了部分。以后我會(huì)選擇其中的幾個(gè)家,詳細(xì)講講它們的MBD工具的使用。目前還沒(méi)發(fā)現(xiàn)有國(guó)內(nèi)芯片廠(chǎng)商有提供MBD開(kāi)發(fā)包的。
(題外話(huà),實(shí)際上國(guó)內(nèi)MCU廠(chǎng)商的開(kāi)發(fā)工具鏈都不算完整,集成開(kāi)發(fā)環(huán)境IDE大多也依賴(lài)第三方Keil、IAR等,編譯器也不是自己的編譯器,能提供的開(kāi)發(fā)工具更少,***任重而道遠(yuǎn))
這些底層驅(qū)動(dòng)模型調(diào)用的依然是原本設(shè)計(jì)好的底層驅(qū)動(dòng)軟件,但是Simulink并不認(rèn)識(shí)這些軟件,所以需要告訴Simulink真正的驅(qū)動(dòng)軟件在哪里。這些底層驅(qū)動(dòng)模型本質(zhì)上是Simulink的S-函數(shù),S-函數(shù)是能生成代碼的。芯片廠(chǎng)商底層驅(qū)動(dòng)的配置通過(guò)S-函數(shù)的形式在模型中實(shí)現(xiàn),S-函數(shù)中包含了用戶(hù)的配置信息,以及底層驅(qū)動(dòng)的代碼。
總的來(lái)說(shuō),關(guān)于嵌入式軟件的底層驅(qū)動(dòng)部分,雖然不容易建模實(shí)現(xiàn),但借助芯片廠(chǎng)商的MBD工具包,仍然可以實(shí)現(xiàn)建模和自動(dòng)生成代碼。
2 底層驅(qū)動(dòng)為啥是MBD“禁區(qū)”?
故事講到這里,似乎很圓滿(mǎn),為啥還被稱(chēng)為“禁區(qū)”呢?
我在MATLAB中文論壇的基于模型設(shè)計(jì)板塊看到幾篇帖子,很有參考意義,有許多大佬在這個(gè)帖子上發(fā)表了關(guān)于底層驅(qū)動(dòng)的一些觀(guān)點(diǎn),比如劉杰博士(《基于模型設(shè)計(jì)》四部著作的作者)和老胡(MathWorks高級(jí)工程師)。
關(guān)于大佬們的觀(guān)點(diǎn),我總結(jié)了以下幾點(diǎn):
- 在Simulink中是可以實(shí)現(xiàn)底層驅(qū)動(dòng)的,但繁瑣且效率不高;
- MBD應(yīng)當(dāng)重點(diǎn)關(guān)注上層應(yīng)用和算法,沒(méi)必要做底層驅(qū)動(dòng);
- MBD的核心是算法驗(yàn)證,即驗(yàn)證上層應(yīng)用和算法。
我們可以發(fā)現(xiàn),大佬們討論的時(shí)候,都沒(méi)有提到芯片廠(chǎng)商的MBD工具包。但可以猜測(cè),那時(shí)的MBD工具包應(yīng)該非常不完善,達(dá)不到應(yīng)用的要求,所以才會(huì)圍繞底層驅(qū)動(dòng)是否值得做展開(kāi)了激烈的討論?,F(xiàn)在和那時(shí)相比,MBD工具包發(fā)展了很多,它的底層驅(qū)動(dòng)模塊已經(jīng)可以滿(mǎn)足一些簡(jiǎn)單的應(yīng)用需求,MBD工具包給的例程是可以直接下載到相應(yīng)的硬件中,包括電機(jī)控制這樣的算法可以直接跑起來(lái)。
但也僅僅只是滿(mǎn)足一些簡(jiǎn)單的應(yīng)用需求 ,即使是現(xiàn)在,MBD工具包依然存在著很多局限性。
**首先,**MBD工具包的功能沒(méi)有底層驅(qū)動(dòng)軟件強(qiáng)大,可以說(shuō),芯片廠(chǎng)商提供的底層驅(qū)動(dòng)軟件能發(fā)揮芯片的100%功能,但MBD工具包就很難說(shuō)了,芯片廠(chǎng)商移植了多少,就支持多少。而且芯片廠(chǎng)商也不會(huì)把底層驅(qū)動(dòng)軟件的全部功能都移植到MBD工具包中,因?yàn)榈讓域?qū)動(dòng)軟件是屬于芯片廠(chǎng)商自己的產(chǎn)品,你愿意把自己的產(chǎn)品放在別人家的平臺(tái)(例如Simulink)上面嗎?
**其次,**目前大多數(shù)芯片廠(chǎng)商的底層驅(qū)動(dòng)軟件已經(jīng)具備了圖形化的配置界面,例如NXP的Processor Expert(PE),利用該配置工具,已經(jīng)可以很友好的配置底層軟件,體驗(yàn)效果并不比在Simulink中差。
**第三,**對(duì)于芯片廠(chǎng)商來(lái)說(shuō),它們的資源肯定是優(yōu)先投放非底層驅(qū)動(dòng)軟件和圖形化配置界面的開(kāi)發(fā),一款芯片的MBD工具包肯定會(huì)落后與前兩者發(fā)布。
**第四,**從我的使用經(jīng)驗(yàn)來(lái)看,MBD工具包并沒(méi)有底層驅(qū)動(dòng)軟件靈活,在熟悉了底層驅(qū)動(dòng)軟件后,遇到問(wèn)題能很快定位到位置。而如果在MBD工具包的模型中遇到了問(wèn)題,有時(shí)候不查看底層驅(qū)動(dòng)軟件,可能很難找到問(wèn)題所在,因?yàn)镸BD工具包底層本身也是調(diào)用的底層驅(qū)動(dòng)軟件,中間隔了一層S-函數(shù)。
**第五,**對(duì)應(yīng)復(fù)雜的項(xiàng)目來(lái)說(shuō),使用底層驅(qū)動(dòng)模塊可能會(huì)大大增加模型的復(fù)雜程度,前面提到了,底層驅(qū)動(dòng)模塊是需要頻繁調(diào)用的。
**最后,**也是一個(gè)很現(xiàn)實(shí)的問(wèn)題,除了上述提到的芯片廠(chǎng)商會(huì)提供MBD工具包,如果使用的芯片不提供MBD工具包呢?畢竟現(xiàn)在能提供MBD工具包的是少數(shù)。
所以,即使是在2020年,老胡在回復(fù)網(wǎng)友時(shí)依然不建議自己搭建底層驅(qū)動(dòng)接口。大佬們的觀(guān)點(diǎn)到現(xiàn)在依然成立,我們?cè)谑褂肕BD開(kāi)展項(xiàng)目的時(shí)候,可以不考慮底層驅(qū)動(dòng),也盡量不要涉及底層驅(qū)動(dòng)。因此我把底層驅(qū)動(dòng)稱(chēng)作MBD的“禁區(qū)”。
3 底層驅(qū)動(dòng)與模型集成
我們知道,底層驅(qū)動(dòng)是連接上層算法和硬件的橋梁,如果模型中不做底層驅(qū)動(dòng),那底層驅(qū)動(dòng)怎么實(shí)現(xiàn)呢?
按照上面的結(jié)論,我們?cè)诖罱P偷臅r(shí)候,并不需要將底層驅(qū)動(dòng)放到模型中(當(dāng)然建模時(shí)要考慮底層驅(qū)動(dòng)帶來(lái)的影響,例如的ADC精度),所以生成的代碼就只有算法,我需要做的就是在模型中將這個(gè)算法的接口做好。就像下面這樣:
算法模型 - Frome aotuMBD
這樣在測(cè)試的時(shí)候,也可以直接將該模型作為參考模型進(jìn)行測(cè)試,這樣也將測(cè)試和建模的工作分離開(kāi)了。
算法測(cè)試 - Frome aotuMBD
接下來(lái)就是將生成的代碼和底層驅(qū)動(dòng)集成在一起,這一步操作需要在IDE中進(jìn)行。在IDE中我們建立好工程,利用芯片廠(chǎng)商的配置工具將底層配置好,然后將生成的代碼復(fù)制到工程中去,將模型生成的頭文件包含到工程當(dāng)中,在需要用到算法的地方調(diào)用生成的函數(shù)接口即可。
這里只是很簡(jiǎn)要的描述了底層驅(qū)動(dòng)與模型集成的大致過(guò)程,后續(xù)我會(huì)針對(duì)不同的芯片更加詳細(xì)的展示這個(gè)過(guò)程,歡迎持續(xù)關(guān)注。
可以看到,底層驅(qū)動(dòng)與模型集成是需要和代碼打交道的,但這正是目前使用MBD的主流方式。不要覺(jué)得MBD就是純粹的無(wú)代碼式開(kāi)發(fā),就目前來(lái)說(shuō),如果是產(chǎn)品級(jí)的設(shè)計(jì),我們依然需要在底層驅(qū)動(dòng)部分和代碼接觸,MBD工具包只能實(shí)現(xiàn)簡(jiǎn)單demo性質(zhì)的功能。
評(píng)論
查看更多