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