日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]嵌入式Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)之驅(qū)動(dòng)分層/分離思想 我們?cè)趯W(xué)習(xí)I2C、USB、SD驅(qū)動(dòng)時(shí),有沒(méi)有發(fā)現(xiàn)一個(gè)共性,就是在驅(qū)動(dòng)開(kāi)發(fā)時(shí),每個(gè)驅(qū)動(dòng)都分層三部分,由上到下分別是: 1、XXX 設(shè)備驅(qū)動(dòng) 2、XXX 核心層 3、XXX 主機(jī)控制器驅(qū)動(dòng)

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

我們?cè)趯W(xué)習(xí)I2C、USB、SD驅(qū)動(dòng)時(shí),有沒(méi)有發(fā)現(xiàn)一個(gè)共性,就是在驅(qū)動(dòng)開(kāi)發(fā)時(shí),每個(gè)驅(qū)動(dòng)都分層三部分,由上到下分別是:

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

2、XXX 核心層

3、XXX 主機(jī)控制器驅(qū)動(dòng)

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

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

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

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

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

再看一個(gè)例子:

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();

}

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

這樣的分層化設(shè)計(jì)在Linux的input、RTC、MTD、I2 C、SPI、TTY、USB等諸多設(shè)備驅(qū)動(dòng)類(lèi)型中屢見(jiàn)不鮮。

二、主機(jī)驅(qū)動(dòng)和外設(shè)驅(qū)動(dòng)分離思想

主機(jī)、外設(shè)驅(qū)動(dòng)分離的意義

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

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));

...

}

如果按照這種方式來(lái)設(shè)計(jì)驅(qū)動(dòng),結(jié)果是對(duì)于任何一個(gè)SPI外設(shè)來(lái)講,它的驅(qū)動(dòng)代碼都是CPU相關(guān)的。也就是說(shuō),當(dāng)然用在CPU XXX上的時(shí)候,它訪(fǎng)問(wèn)XXX的SPI主機(jī)控制寄存器,當(dāng)用在XXX1的時(shí)候,它訪(fǎng)問(wèn)XXX1的SPI主機(jī)控制寄存器:

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));

...

}

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

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

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

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

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

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

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

關(guān)鍵字: 逆變器 電動(dòng)汽車(chē) 驅(qū)動(dòng)

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

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

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

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

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

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

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

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

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

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

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

關(guān)鍵字: nftables Linux

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

關(guān)鍵字: 驅(qū)動(dòng)開(kāi)發(fā) C語(yǔ)言 Linux

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

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