嵌入式驅(qu)動程序設計的(de)小(xiao)竅門,業界大牛總結
時間(jian):2018-07-17 來(lai)源:未知(zhi)
對于嵌(qian)(qian)入(ru)(ru)(ru)式(shi)來說(shuo),嵌(qian)(qian)入(ru)(ru)(ru)式(shi)應用(yong)軟件都會在(zai)特定時候訪問(wen)底層固件和(he)進行硬(ying)件控制,嵌(qian)(qian)入(ru)(ru)(ru)式(shi)驅(qu)動(dong)(dong)程(cheng)序(xu)的(de)(de)設計(ji)(ji)是滿足嵌(qian)(qian)入(ru)(ru)(ru)式(shi)系統最(zui)關鍵(jian)的(de)(de)一步,學(xue)習(xi)嵌(qian)(qian)入(ru)(ru)(ru)式(shi)對嵌(qian)(qian)入(ru)(ru)(ru)式(shi)驅(qu)動(dong)(dong)程(cheng)序(xu)設計(ji)(ji)是比較(jiao)關鍵(jian)的(de)(de),那么如何學(xue)嵌(qian)(qian)入(ru)(ru)(ru)式(shi)驅(qu)動(dong)(dong)程(cheng)序(xu)設計(ji)(ji)成為了(le)關鍵(jian),在(zai)這里業界大(da)牛總結(jie)了(le)一些嵌(qian)(qian)入(ru)(ru)(ru)式(shi)驅(qu)動(dong)(dong)程(cheng)序(xu)設計(ji)(ji)的(de)(de)小(xiao)竅門,對學(xue)習(xi)嵌(qian)(qian)入(ru)(ru)(ru)式(shi)驅(qu)動(dong)(dong)程(cheng)序(xu)設計(ji)(ji)還是老有用(yong)了(le)。
首先就是我們在(zai)做嵌入式(shi)驅動程序設計(ji)使用設計(ji)模(mo)式(shi)時,在(zai)這里有一個注意的(de)點,認真(zhen)看哦:

對于設計模式來說(shuo),設計模型就是一個(ge)用(yong)(yong)來處理那些在(zai)軟件中會重復出(chu)現的(de)(de)問題的(de)(de)解(jie)決方(fang)案(an)。 開發人員可(ke)以(yi)選(xuan)擇浪(lang)費寶貴(gui)的(de)(de)時間和預算從無到有地(di)重新發明一個(ge)解(jie)決方(fang)案(an),也(ye)可(ke)以(yi)從他(ta)的(de)(de)解(jie)決方(fang)案(an)工(gong)具箱中選(xuan)擇一個(ge)最適合解(jie)決這個(ge)問題的(de)(de)方(fang)案(an)。在(zai)微(wei)處理器出(chu)現之初,底(di)層(ceng)驅動(dong)已經(jing)很成熟(shu)了,那么,為什么不利用(yong)(yong)現有的(de)(de)成熟(shu)的(de)(de)解(jie)決方(fang)案(an)呢?
在這里就有一個小技巧咯(ge),驅動程(cheng)序(xu)設計模(mo)式大(da)致(zhi)分屬(shu)以下4個類別(bie):Bit bang、輪詢、中(zhong)斷(duan)驅動和(he)直接存儲器訪問(wen)(DMA)。
Bit bang模(mo)(mo)(mo)式:當微(wei)控制器沒有內外(wai)設(she)去執行(xing)功能的(de)(de)時(shi)候(hou),或(huo)者當所有的(de)(de)內外(wai)設(she)都已經被使用了,而此(ci)時(shi)又有一個新的(de)(de)請求,那么開(kai)發(fa)(fa)者就應(ying)該(gai)選擇Bit bang設(she)計模(mo)(mo)(mo)式。Bit bang模(mo)(mo)(mo)式的(de)(de)解決方(fang)案(an)很有效率,但通常(chang)需(xu)要大量的(de)(de)軟(ruan)件開(kai)銷來確保其(qi)實施的(de)(de)能力。Bit bang模(mo)(mo)(mo)式可以讓開(kai)發(fa)(fa)者手動完成通信協議或(huo)外(wai)部(bu)行(xing)為。
輪(lun)(lun)詢(xun)(xun)模(mo)(mo)式用(yong)(yong)于簡單地監視一(yi)個輪(lun)(lun)詢(xun)(xun)調度方式中的(de)事件。輪(lun)(lun)詢(xun)(xun)模(mo)(mo)式適用(yong)(yong)于非常簡單的(de)系統,但許(xu)多現代應用(yong)(yong)程序都需要(yao)中斷。
中斷可以讓開發(fa)者在事(shi)件發(fa)生時進行處理,而不用等代碼手動檢查。
DMA(直接存(cun)儲器訪問)模式(shi)允(yun)許其它(ta)外圍設備來處(chu)理(li)數據(ju)傳輸的需求,而(er)不需要驅動的干預。
有(you)現成的(de)那么就可(ke)以利用(yong)現成的(de),這樣又高效又快。
重用設(she)計這個了解嗎
當你在時(shi)間和預算都很緊張的(de)(de)時(shi)候,為(wei)什么還要再造(zao)輪子呢?在驅(qu)動程序開(kai)發中,驅(qu)動設計(ji)的(de)(de)關(guan)鍵的(de)(de)要求就(jiu)是(shi)重(zhong)用、便攜性和可(ke)維(wei)護性,那告訴你一(yi)(yi)個(ge)(ge)方法就(jiu)是(shi),這些特征都可(ke)以通過硬件(jian)抽(chou)象(xiang)(xiang)層的(de)(de)設計(ji)和使(shi)用來(lai)說明。硬件(jian)抽(chou)象(xiang)(xiang)層(HAL)為(wei)開(kai)發人(ren)員(yuan)提供(gong)一(yi)(yi)種方式來(lai)創建一(yi)(yi)個(ge)(ge)標(biao)準(zhun)接口去控(kong)制微(wei)控(kong)制器的(de)(de)外設。抽(chou)象(xiang)(xiang)隱藏實現細節,取(qu)而代之的(de)(de)是(shi)提供(gong)了可(ke)視化功能,如 Usart_Init和Usart_Transmit。這個(ge)(ge)方法就(jiu)是(shi)讓(rang)任何USART、SPI、PWM或其他外設具備(bei)所有微(wei)控(kong)制器都支持的(de)(de)共同特點。她就(jiu)相當于提供(gong)了一(yi)(yi)個(ge)(ge)容器。
再(zai)來一個小竅門(men)就是(shi)了解(jie)實時行(xing)為
一(yi)(yi)個(ge)實(shi)(shi)時系(xi)統是否(fou)能(neng)滿足實(shi)(shi)時需求(qiu)取決于(yu)它的(de)(de)(de)驅(qu)動程(cheng)序。寫(xie)入能(neng)力差的(de)(de)(de)驅(qu)動是低(di)效的(de)(de)(de),并可能(neng)使不知情(qing)的(de)(de)(de)開發者放棄系(xi)統的(de)(de)(de)性能(neng)。設計者需要考慮驅(qu)動的(de)(de)(de)兩(liang)個(ge)特點:阻塞和非阻塞。一(yi)(yi)個(ge)阻塞的(de)(de)(de)驅(qu)動程(cheng)序在其(qi)完成(cheng)工作之前會(hui)阻止其(qi)他任何軟件(jian)執行操(cao)(cao)作。例如(ru),一(yi)(yi)個(ge)USART驅(qu)動程(cheng)序可以(yi)把一(yi)(yi)個(ge)字符裝入傳輸(shu)緩沖(chong)區,然后一(yi)(yi)直等到(dao)接(jie)收到(dao)傳輸(shu)結(jie)束標志符才繼續執行下(xia)一(yi)(yi)步操(cao)(cao)作。
另一方面,非阻(zu)塞驅(qu)動(dong)則是一般利用中斷(duan)來實(shi)現它的功能。中斷(duan)的使用可以(yi)防止驅(qu)動(dong)程(cheng)(cheng)序在等待一個(ge)事件發生時攔截其他(ta)軟件的執行操(cao)作(zuo)。USART的驅(qu)動(dong)程(cheng)(cheng)序可以(yi)將一個(ge)字符裝(zhuang)入傳(chuan)輸(shu)緩(huan)沖(chong)區然(ran)后等主程(cheng)(cheng)序發布下一個(ge)指令。傳(chuan)輸(shu)結束標志符的設置(zhi)會導致中斷(duan)結束,讓驅(qu)動(dong)進(jin)行下一步(bu)操(cao)作(zuo)。
無論哪種類型,為了保持實時(shi)性能,并防止系(xi)統中的(de)故(gu)障(zhang),開發(fa)人(ren)員(yuan)必須了解驅動的(de)平均執(zhi)行時(shi)間和最壞(huai)情(qing)況下(xia)的(de)執(zhi)行時(shi)間。一個完整的(de)系(xi)統可(ke)能會因為一個潛在的(de)風險(xian)而造成更(geng)大的(de)安全問題。

這個就是需要動手了,翻翻參(can)考數據(ju)手冊
微控制(zhi)(zhi)器在過去的(de)幾年(nian)里變得越來越復雜。以前想(xiang)要完全了解一個(ge)(ge)(ge)微控制(zhi)(zhi)器需要掌握由一個(ge)(ge)(ge)大約(yue)包含500頁(ye)組(zu)成的(de)單一數(shu)(shu)據(ju)手(shou)冊。而(er)如今,一個(ge)(ge)(ge)32位微控制(zhi)(zhi)器通常包含由部分的(de)數(shu)(shu)據(ju)手(shou)冊、整(zheng)個(ge)(ge)(ge)微控制(zhi)(zhi)器系列(lie)的(de)資料(liao)表、每個(ge)(ge)(ge)外設(she)數(shu)(shu)以百計的(de)資料(liao)以及(ji)所有的(de)勘誤(wu)表組(zu)成的(de)數(shu)(shu)據(ju)手(shou)冊。 開(kai)發人(ren)員如果想(xiang)要完全掌握這部分的(de)內容需要了解幾千頁(ye)的(de)文件。
不幸的是,所(suo)有(you)這些數據(ju)手冊(ce)都是一個(ge)驅(qu)動程序能(neng)真(zhen)正合理實現所(suo)需要的。開發(fa)人(ren)員在一開始就要對每(mei)個(ge)數據(ju)手冊(ce)中包含的信息(xi)進行(xing)收(shou)集(ji)和排序。通常它們中的每(mei)一個(ge)都需要被訪問以使外設啟動和運行(xing)。 關鍵信息(xi)被分(fen)散(或隱藏)在每(mei)種類型的數據(ju)手冊(ce)中。
謹防外設故障
最近我(wo)剛好有機(ji)會把一(yi)系(xi)列(lie)的(de)微控制(zhi)器(qi)驅(qu)動移植到其他的(de)微處理器(qi)上。制(zhi)造商和數據手冊都(dou)表明PWM外設在(zai)(zai)這(zhe)兩(liang)個系(xi)列(lie)的(de)微控制(zhi)器(qi)之間(jian)是相同(tong)的(de)。 然(ran)而(er),實際情況卻是在(zai)(zai)運行PWM驅(qu)動器(qi)的(de)時候兩(liang)者之間(jian)有很大的(de)不同(tong)。該驅(qu)動程序只能在(zai)(zai)原來的(de)微控制(zhi)器(qi)工作,而(er)在(zai)(zai)新系(xi)列(lie)的(de)微控制(zhi)器(qi)上卻無(wu)效(xiao)。
在反復翻看數據手冊之后,我(wo)在數據手冊中一個(ge)完全不相關的注腳里發現(xian)了PWM外設上電時會處于故(gu)障狀態,需要將一個(ge)隱藏在寄(ji)存器(qi)中的標志位清(qing)零。在驅動程序實(shi)現(xian)的開始,確認外設可能出現(xian)的故(gu)障并(bing)查看其他看似無(wu)關的寄(ji)存器(qi)錯(cuo)誤。
這些都是在嵌入式(shi)驅動(dong)(dong)程序設計的小竅門,會讓你(ni)更快速高效的來(lai)學(xue)習(xi)嵌入式(shi)驅動(dong)(dong)程序設計,這樣你(ni)就(jiu)不(bu)會在這個上(shang)面(mian)浪費更多的時間,又快又高效,這些小竅門學(xue)起來(lai),對以后的各種嵌入式(shi)學(xue)習(xi)都是用幫助的哦。

