www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 嵌入式 > 嵌入式軟件
[導讀]嵌入式Linux設(shè)備驅(qū)動開發(fā)之驅(qū)動分層/分離思想 我們在學習I2C、USB、SD驅(qū)動時,有沒有發(fā)現(xiàn)一個共性,就是在驅(qū)動開發(fā)時,每個驅(qū)動都分層三部分,由上到下分別是: 1、XXX 設(shè)備驅(qū)動 2、XXX 核心層 3、XXX 主機控制器驅(qū)動

嵌入式Linux設(shè)備驅(qū)動開發(fā)之驅(qū)動分層/分離思想

我們在學習I2C、USB、SD驅(qū)動時,有沒有發(fā)現(xiàn)一個共性,就是在驅(qū)動開發(fā)時,每個驅(qū)動都分層三部分,由上到下分別是:

1、XXX 設(shè)備驅(qū)動

2、XXX 核心層

3、XXX 主機控制器驅(qū)動

而需要我們編寫的主要是設(shè)備驅(qū)動部分,主機控制器驅(qū)動部分也有少量編寫,二者進行交互主要時由核心層提供的接口來實現(xiàn);這樣結(jié)構(gòu)清晰,大大地有利于我們的驅(qū)動開發(fā),這其中就是利用了Linux設(shè)備驅(qū)動開發(fā)中兩個重要思想,下面來一一解析

一、設(shè)備驅(qū)動的分層思想

在面向?qū)ο蟮某绦蛟O(shè)計中,可以為某一類相似的事物定義一個基類,而具體的事物可以繼承這個基類中的函數(shù)。如果對于繼承的這個事物而言,其某函數(shù)的實現(xiàn)與基類一致,那它就可以直接繼承基類的函數(shù);相反,它可以重載之。這種面向?qū)ο蟮脑O(shè)計思想極大地提高了代碼的可重用能力,是對現(xiàn)實世界事物間關(guān)系的一種良好呈現(xiàn)。

Linux內(nèi)核完全由C語言和匯編語言寫成,但是卻頻繁用到了面向?qū)ο蟮脑O(shè)計思想。在設(shè)備驅(qū)動方面,往往為同類的設(shè)備設(shè)計了一個框架,而框架中的核心層則實現(xiàn)了該設(shè)備通用的一些功能。同樣的,如果具體的設(shè)備不想使用核心層的函數(shù),它可以重載之。舉個例子:

return_type core_funca(xxx_device * bottom_dev, param1_type param1, param1_type param2)

{

if (bottom_dev->funca)

return bottom_dev->funca(param1, param2);

/* 核心層通用的funca代碼 */

...

}

上述core_funca的實現(xiàn)中,會檢查底層設(shè)備是否重載了funca(),如果重載了,就調(diào)用底層的代碼,否則,直接使用通用層的。這樣做的好處是,核心層的代碼可以處理絕大多數(shù)該類設(shè)備的funca()對應(yīng)的功能,只有少數(shù)特殊設(shè)備需要重新實現(xiàn)funca()。

再看一個例子:

copyreturn_type core_funca(xxx_device * bottom_dev, param1_type param1, param1_type param2)

{

/*通用的步驟代碼A */

...

bottom_dev->funca_ops1();

/*通用的步驟代碼B */

...

bottom_dev->funca_ops2();

/*通用的步驟代碼C */

...

bottom_dev->funca_ops3();

}

上述代碼假定為了實現(xiàn)funca(),對于同類設(shè)備而言,操作流程一致,都要經(jīng)過“通用代碼A、底層ops1、通用代碼B、底層ops2、通用代碼C、底層ops3”這幾步,分層設(shè)計明顯帶來的好處是,對于通用代碼A、B、C,具體的底層驅(qū)動不需要再實現(xiàn),而僅僅只關(guān)心其底層的操作ops1、ops2、ops3。圖1明確反映了設(shè)備驅(qū)動的核心層與具體設(shè)備驅(qū)動的關(guān)系,實際上,這種分層可能只有2層(圖1的a),也可能是多層的(圖1的b)。

這樣的分層化設(shè)計在Linux的input、RTC、MTD、I2 C、SPI、TTY、USB等諸多設(shè)備驅(qū)動類型中屢見不鮮。

二、主機驅(qū)動和外設(shè)驅(qū)動分離思想

主機、外設(shè)驅(qū)動分離的意義

在Linux設(shè)備驅(qū)動框架的設(shè)計中,除了有分層設(shè)計實現(xiàn)以外,還有分隔的思想。舉一個簡單的例子,假設(shè)我們要通過SPI總線訪問某外設(shè),在這個訪問過程中,要通過操作CPU XXX上的SPI控制器的寄存器來達到訪問SPI外設(shè)YYY的目的,最簡單的方法是:

copyreturn_type xxx_write_spi_yyy(...)

{

xxx_write_spi_host_ctrl_reg(ctrl);

xxx_ write_spi_host_data_reg(buf);

while(!(xxx_spi_host_status_reg()&SPI_DATA_TRANSFER_DONE));

...

}

如果按照這種方式來設(shè)計驅(qū)動,結(jié)果是對于任何一個SPI外設(shè)來講,它的驅(qū)動代碼都是CPU相關(guān)的。也就是說,當然用在CPU XXX上的時候,它訪問XXX的SPI主機控制寄存器,當用在XXX1的時候,它訪問XXX1的SPI主機控制寄存器:

return_type xxx1_write_spi_yyy(...)

{

xxx1_write_spi_host_ctrl_reg(ctrl);

xxx1_ write_spi_host_data_reg(buf);

while(!(xxx1_spi_host_status_reg()&SPI_DATA_TRANSFER_DONE));

...

}

這顯然是不能接受的,因為這意味著外設(shè)YYY用在不同的CPU XXX和XXX1上的時候需要不同的驅(qū)動。那么,我們可以用如圖的思想對主機控制器驅(qū)動和外設(shè)驅(qū)動進行分離。這樣的結(jié)構(gòu)是,外設(shè)a、b、c的驅(qū)動與主機控制器A、B、C的驅(qū)動不相關(guān),主機控制器驅(qū)動不關(guān)心外設(shè),而外設(shè)驅(qū)動也不關(guān)心主機,外設(shè)只是訪問核心層的通用的API進行數(shù)據(jù)傳輸,主機和外設(shè)之間可以進行任意的組合。

如果我們不進行上圖的主機和外設(shè)分離,外設(shè)a、b、c和主機A、B、C進行組合的時候,需要9個不同的驅(qū)動。設(shè)想一共有m個主機控制器,n個外設(shè),分離的結(jié)果是需要m+n個驅(qū)動,不分離則需要m*n個驅(qū)動。

Linux SPI、I2C、USB、ASoC(ALSA SoC)等子系統(tǒng)都典型地利用了這種分離的設(shè)計思想。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

CPU親和度通過限制進程或線程可以運行的CPU核心集合,使得它們只能在指定的CPU核心上執(zhí)行。這可以減少CPU緩存的失效次數(shù),提高緩存命中率,從而提升系統(tǒng)性能。

關(guān)鍵字: Linux 嵌入式

在電動汽車(EV)領(lǐng)域,牽引逆變器作為關(guān)鍵組件之一,扮演著至關(guān)重要的角色。它不僅影響電動汽車的驅(qū)動性能和效率,還直接關(guān)聯(lián)到整車的安全性和耐用性。本文將詳細介紹在選擇電動汽車牽引逆變器時需要考量的多個方面,包括其保護機制與...

關(guān)鍵字: 逆變器 電動汽車 驅(qū)動

在Linux系統(tǒng)性能優(yōu)化中,內(nèi)存管理與網(wǎng)絡(luò)連接處理是兩大核心領(lǐng)域。vm.swappiness與net.core.somaxconn作為關(guān)鍵內(nèi)核參數(shù),直接影響系統(tǒng)在高負載場景下的穩(wěn)定性與響應(yīng)速度。本文通過實戰(zhàn)案例解析這兩個...

關(guān)鍵字: Linux 內(nèi)存管理

對于LLM,我使用b谷歌Gemini的免費層,所以唯一的成本是n8n托管。在使用了n8n Cloud的免費積分后,我決定將其托管在Railway上(5美元/月)。然而,由于n8n是開源的,您可以在自己的服務(wù)器上托管它,而...

關(guān)鍵字: 人工智能 n8n Linux

在Linux系統(tǒng)管理中,權(quán)限控制是安全運維的核心。本文通過解析/etc/sudoers文件配置與組策略的深度應(yīng)用,結(jié)合某金融企業(yè)生產(chǎn)環(huán)境案例(成功攔截98.7%的非法提權(quán)嘗試),揭示精細化權(quán)限管理的關(guān)鍵技術(shù)點,包括命令別...

關(guān)鍵字: Linux 用戶權(quán)限 sudoers文件

Linux內(nèi)核中的信號量(Semaphore)是一種用于資源管理的同步原語,它允許多個進程或線程對共享資源進行訪問控制。信號量的主要作用是限制對共享資源的并發(fā)訪問數(shù)量,從而防止系統(tǒng)過載和數(shù)據(jù)不一致的問題。

關(guān)鍵字: Linux 嵌入式

在云計算與容器化技術(shù)蓬勃發(fā)展的今天,Linux網(wǎng)絡(luò)命名空間(Network Namespace)已成為構(gòu)建輕量級虛擬網(wǎng)絡(luò)的核心組件。某頭部互聯(lián)網(wǎng)企業(yè)通過命名空間技術(shù)將測試環(huán)境資源消耗降低75%,故障隔離效率提升90%。本...

關(guān)鍵字: Linux 云計算

在Linux內(nèi)核4.18+和主流發(fā)行版(RHEL 8/Ubuntu 20.04+)全面轉(zhuǎn)向nftables的背景下,某電商平臺通過遷移將防火墻規(guī)則處理效率提升40%,延遲降低65%。本文基于真實生產(chǎn)環(huán)境案例,詳解從ipt...

關(guān)鍵字: nftables Linux

在Linux設(shè)備驅(qū)動開發(fā)中,等待隊列(Wait Queue)是實現(xiàn)進程睡眠與喚醒的核心機制,它允許進程在資源不可用時主動放棄CPU,進入可中斷睡眠狀態(tài),待資源就緒后再被喚醒。本文通過C語言模型解析等待隊列的實現(xiàn)原理,結(jié)合...

關(guān)鍵字: 驅(qū)動開發(fā) C語言 Linux

在Unix/Linux進程間通信中,管道(pipe)因其簡單高效被廣泛使用,但默認的半雙工特性和無同步機制容易導致數(shù)據(jù)競爭。本文通過父子進程雙向通信案例,深入分析互斥鎖與狀態(tài)機在管道同步中的應(yīng)用,實現(xiàn)100%可靠的數(shù)據(jù)傳...

關(guān)鍵字: 管道通信 父子進程 Linux
關(guān)閉