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