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