摘要:因為操作系統(tǒng)一直被看做是計算機(jī)軟件的基石。本系列是我學(xué)習(xí)操作系統(tǒng)的筆記,操作系統(tǒng)是以為例子。其他的操作系統(tǒng)也是差不多。將設(shè)備驅(qū)動一共分為個級別,每個級別的驅(qū)動初始化聲明宏定義及其在系統(tǒng)啟動過程中的啟動順序如下表所示。
老板說我技術(shù)需要有長進(jìn),不能只做一個crud boy。 于是我選來選去,終于選定了,來學(xué)習(xí)操作系統(tǒng)。因為操作系統(tǒng)一直被看做是計算機(jī)軟件的基石。
本系列是我學(xué)習(xí)操作系統(tǒng)的筆記,操作系統(tǒng)是以AliOS Things為例子。其他的操作系統(tǒng)也是差不多。
本文主要是講操作系統(tǒng)的設(shè)備驅(qū)動模型,后面會有更多的操作系統(tǒng)內(nèi)容介紹。
國慶假期學(xué)門新技術(shù),拒絕只做crud boy, 就從操作系統(tǒng)開始 - 中斷管理
國慶假期學(xué)門新技術(shù),拒絕只做crud boy, 就從操作系統(tǒng)開始 - 定時器管理
開源操作系統(tǒng)中系統(tǒng)驅(qū)動框架做的最好的無疑是Linux系統(tǒng),Linux系統(tǒng)中設(shè)計精良的驅(qū)動框架、設(shè)備樹等功能會硬件廠商對接驅(qū)動系統(tǒng)的成本降到很低,并且通過接入VFS系統(tǒng)統(tǒng)一了Linux系統(tǒng)驅(qū)動對應(yīng)用程序提供的接口,為操作系統(tǒng)中使用驅(qū)動相關(guān)的應(yīng)用程序在不同的Linux系統(tǒng)間的移植掃平了障礙。反觀傳統(tǒng)的RTOS系統(tǒng)大多數(shù)比較注重在內(nèi)核功能的開發(fā)上,欠缺對驅(qū)動架構(gòu)方面的設(shè)計。前文曾經(jīng)提到過物聯(lián)網(wǎng)操作系統(tǒng)大多是從傳統(tǒng)RTOS系統(tǒng)發(fā)展而來的,所以大多數(shù)的物聯(lián)網(wǎng)操作系統(tǒng)在驅(qū)動框架上面的沒有經(jīng)過太多設(shè)計,總結(jié)下來可以分為以下幾類:
第1類和第2類系統(tǒng)對應(yīng)用程序不太友好,即使是相同的操作系統(tǒng)上面寫的應(yīng)用程序移植到不同平臺后也會因為接口不一致,或者是雖然接口形式一致但接口底層實現(xiàn)的差別導(dǎo)致應(yīng)用程序大概率沒辦法跨平臺移植或跨平臺無需調(diào)試即可運(yùn)行。第3類對應(yīng)用程序的移植性比較友好,但有一個問題是,很多系統(tǒng)實現(xiàn)的通用驅(qū)動實現(xiàn)的都“過于簡單”,這就導(dǎo)致有些硬件的總線的特性沒辦法被發(fā)揮出來,隨著物聯(lián)網(wǎng)應(yīng)用場景越來越復(fù)雜,其缺點(diǎn)也是越來越明顯。
在總結(jié)了物聯(lián)網(wǎng)領(lǐng)域設(shè)備框架的問題之后,AliOS Things從“易用性”的角度出發(fā)進(jìn)行設(shè)計,設(shè)計了下圖所示的驅(qū)動框架。
?驅(qū)動框架對應(yīng)用程序統(tǒng)一提供兩種類型的接口:
AOS API對進(jìn)行傳統(tǒng)RTOS應(yīng)用開發(fā)的人比較友好。對于RAM/ROM要求非常嚴(yán)格的應(yīng)用場景,可以直接呼叫AOS形式的API,減少對VFS驅(qū)動子系統(tǒng)的依賴,從而減少固件大小。
VFS API對Linux開發(fā)者比較友好,遵循POSIX接口定義,基于POSIX標(biāo)準(zhǔn)實現(xiàn)的應(yīng)用程序在AliOS Things和其它遵循POSIX接口的操作系統(tǒng)之間相互移植就會簡便很多。
驅(qū)動框架定義了HAL API的標(biāo)準(zhǔn),一般是由芯片廠商來實現(xiàn)的。HAL API的定義 的過程中主要考慮了以下兩點(diǎn):
在HAL API和AOS API之間則是設(shè)備驅(qū)動子系統(tǒng)的實現(xiàn)層。設(shè)計設(shè)備驅(qū)動子系統(tǒng)的主要目的有兩個:
除了提供AOS或VFS API之外和定義HAL API的功能之外,驅(qū)動框架還提供了以下功能,下面分別進(jìn)行介紹。
隨著現(xiàn)代物聯(lián)網(wǎng)系統(tǒng)的應(yīng)用場景越來越復(fù)雜,同一個物聯(lián)網(wǎng)硬件設(shè)備對外設(shè)的需求也越來越多。不同驅(qū)動程序之間可能會存在依賴關(guān)系。為了能讓驅(qū)動開發(fā)者比較方便的將自己的驅(qū)動以模塊的方式添加到系統(tǒng)中和盡量減少添加/刪除設(shè)備驅(qū)動過程中所需要修改的代碼,設(shè)計了驅(qū)動自動加載機(jī)制。AliOS Things將設(shè)備驅(qū)動一共分為9個級別,每個級別的驅(qū)動初始化聲明宏定義及其在系統(tǒng)啟動過程中的啟動順序如下表所示。
啟動順序 | 宏定義 | 段名稱定義 |
1 | CORE_DRIVER_ENTRY(driver_entry_api_name) | core_driver_entry |
2 | BUS_ DRIVER_ENTRY(driver_entry_api_name) | bus_driver_entry |
3 | EARLY_DRIVER_ENTRY(driver_entry_api_name) | early_driver_entry |
4 | VFS_ DRIVER_ENTRY(driver_entry_api_name) | vfs_driver_entry |
5 | LEVEL0_DRIVER_ENTRY(driver_entry_api_name) | level0_driver_entry |
6 | LEVEL1_DRIVER_ENTRY(driver_entry_api_name) | level1_driver_entry |
7 | LEVEL2_DRIVER_ENTRY(driver_entry_api_name) | level2_driver_entry |
8 | LEVEL3_DRIVER_ENTRY(driver_entry_api_name) | level3_driver_entry |
9 | POST_DRIVER_ENTRY(driver_entry_api_name) | post_driver_entry |
采用上面的宏定義進(jìn)行初始化函數(shù)聲明之后,用同樣的宏定義聲明的函數(shù)指針會被分到一組中,相同組會在鏈接階段放到固件特定的代碼段中。系統(tǒng)啟動的時候,驅(qū)動框架會依次從這些特定的代碼段去讀取函數(shù)指針并呼叫這些函數(shù)指針指向的函數(shù),每個段被編譯進(jìn)的段名稱如上表所示。這套機(jī)制可以保證用不同宏定義聲明的多個驅(qū)動初始化函數(shù)會嚴(yán)格按照表格中從1到9的順序被呼叫,用相同宏定義聲明的多個驅(qū)動初始化函數(shù)則是隨機(jī)的。
除此之外,驅(qū)動框架還提供了設(shè)備后臺初始化方式的宏定義(VFS_DRIVER_BG_ENTRY(driver_entry_api_name)),可以用于低優(yōu)先級驅(qū)動初始化函數(shù)的聲明。被聲明做低優(yōu)先級驅(qū)動的初始化函數(shù)會在被低優(yōu)先級的線程在后臺運(yùn)行,通過這樣的方式可以提高整個系統(tǒng)啟動的速度。假設(shè)將將藍(lán)牙驅(qū)動初始化過程聲明成后臺初始化(VFS_DRIVER_BG_ENTRY(bluetooth_drv_init, NULL, 4096)),常規(guī)加載過程和驅(qū)動分級加載過程的軟件流程的差異可以參考下圖所示的流程圖。
?
AliOS Things在3.3版版本中支持的彈性內(nèi)核對驅(qū)動框架提出了比較高的要求,驅(qū)動框架既要能運(yùn)行在宏內(nèi)核架構(gòu)下,又要能運(yùn)行在微內(nèi)核架構(gòu)下,甚至還需要同時運(yùn)行在內(nèi)核態(tài)和用戶態(tài)。針對這種需求,AliOS Things設(shè)計了在適用于彈性內(nèi)核架構(gòu)下線程/消息/事件模型。
當(dāng)設(shè)備驅(qū)動運(yùn)行在內(nèi)核態(tài)的時候,內(nèi)核功能可以通過直接函數(shù)調(diào)用的方式來調(diào)用驅(qū)動提供的服務(wù);用戶態(tài)應(yīng)用程序可以通過VFS接口或這是通過系統(tǒng)調(diào)用的方式訪問AOS接口。
但當(dāng)驅(qū)動運(yùn)行在用戶態(tài)的時候,其它應(yīng)用程序訪問驅(qū)動提供的服務(wù)則需要通過RPC(Remote Procure Call,遠(yuǎn)程過程調(diào)用)的方式。在這種情況下,AliOS Things只提供VFS的服務(wù)訪問方式,如上圖所示。這樣同一套硬件的驅(qū)動程序無需修改就可以運(yùn)行在用戶態(tài)或內(nèi)核態(tài),跟RPC和VFS相關(guān)的邏輯全部由驅(qū)動框架完成,從而簡化硬件驅(qū)動程序的設(shè)計。微內(nèi)核架構(gòu)下驅(qū)動線程/消息模型的流程圖如下圖所示,詳細(xì)代碼可以查看aos_device_register函數(shù)的實現(xiàn),這里就不進(jìn)行詳細(xì)展開。
?
?
下表是各個設(shè)備驅(qū)動子系統(tǒng)源代碼位置,接口定義頭文件、使用案例說明以及芯片廠對接接口頭文件所在位置。讀者可以根據(jù)自己的需求進(jìn)行詳細(xì)解讀。
其中每個設(shè)備驅(qū)動子系統(tǒng)都有對應(yīng)的AOS API模塊和VFS API模塊,VFS API模塊是依賴于AOS API的。用戶可以根據(jù)需求選擇使用哪種類型的API。
項目 | 說明 |
源代碼位置 | components/drivers/peripheral |
接口頭文件說明 | components/drivers/peripheral/ |
使用案例說明 | components/drivers/peripheral/ |
芯片廠對接接口頭文件 | components/csi/csi2/include/drv/ |
其中各驅(qū)動子系統(tǒng)在設(shè)計實現(xiàn)過程中可以滿足下表的場景需求。
驅(qū)動子系統(tǒng)類型 | 適用的場景 |
I2C | 同時和多個I2C從設(shè)備使用不同的Clock頻率進(jìn)行數(shù)據(jù)通信 |
SPI | 同時和多個SPI從設(shè)備使用不同的參數(shù)設(shè)定(Clock頻率、有無CS及CS極性有效性)進(jìn)行數(shù)據(jù)通信 |
MTD | 支持多分區(qū),Nand Flash和Nor Flash |
UART | 兼容POSIX的UART操作 |
?
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/122115.html
摘要:戰(zhàn)爭已勝,精神依在,當(dāng)延續(xù)了這份堅韌與毅力之后,所有事情都將變得有無限可能,本期成功就業(yè)的小余,正是憑借著這股毅力,完成了夢想,取得了高薪。 伴隨著7天國慶長假落...
? ? ? ? 國慶假期快到了,想查查還有幾天幾小時到假期,這對程序員小菜一碟,輕輕松松用python寫個倒計時程序(天、時、分、秒),助你熬到假期! 一、先看效果: ?二、安裝python: 1、下載安裝python 下載安裝python3.9.6,進(jìn)入python官方網(wǎng)站://www.python.org/ ?點(diǎn)擊Python 3.9.6 直接安裝即可。 2、驗證安裝成功。 按win+R...
今年國慶七天和以往就不一樣了,過去都是學(xué)生時代的國慶,大學(xué)時光以前在家有家人的陪伴,在大學(xué)階段也基本沒回過家。 這里說明一下不怎么回家的原因吧,因為我老家在農(nóng)村里,國慶階段是收集油茶樹果實的好時光,就從網(wǎng)上拿了一張圖,大概就是如下樣子,碩果累累(說不定有些小伙伴還不知道這啥,因為我問了一些朋友都說不知道這回事,農(nóng)村里的小伙伴可能會知道)。 往年的國慶 還記得初中那會還和家里人一起上山采摘過,不過...
?階段一:回顧過往 ? ? ? ? 好久沒有更新博客了?(鴿了太久),嘿嘿,感覺是時候回過頭來寫一篇了...... ? ? ? ? 主要是因為國慶假期快過去了,才發(fā)現(xiàn)自己好像什么事都沒有開始做。確實深有體會:人越長大,時間過得越快,當(dāng)下的我就處在時間飛逝的浮光掠影之中...... ? ? ? ? 后端的基礎(chǔ)經(jīng)過一年多的不斷學(xué)習(xí),漸漸進(jìn)入了尾聲...終于在國慶不久前進(jìn)入了分布式、SpingCloud...
摘要:前言這個國慶假期,筆者陪同家人一起游玩,也順便考察了下浙江杭州的先進(jìn)智能制造實踐技術(shù)的發(fā)展。對比之下,發(fā)現(xiàn)了上海蘇錫常技術(shù)方面和浙江相比的優(yōu)勢,當(dāng)然也有不足。 前言:這個國慶假期,筆者陪同家人一起游玩,也順便考察了下浙江杭州的先進(jìn)智能制造實踐技術(shù)的發(fā)展。江蘇的蘇錫常是筆者的故鄉(xiāng),目前筆者在上...
閱讀 2700·2023-04-25 15:22
閱讀 2857·2021-10-11 10:58
閱讀 1084·2021-08-30 09:48
閱讀 1882·2019-08-30 15:56
閱讀 1763·2019-08-30 15:53
閱讀 1130·2019-08-29 11:16
閱讀 1082·2019-08-23 18:34
閱讀 1667·2019-08-23 18:12