chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)中兩個(gè)重要思想

Q4MP_gh_c472c21 ? 來(lái)源:互聯(lián)網(wǎng) ? 作者:佚名 ? 2018-04-21 08:35 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

我們?cè)趯W(xué)習(xí)I2C、USBSD驅(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ì)中,可以為某一類相似的事物定義一個(gè)基類,而具體的事物可以繼承這個(gè)基類中的函數(shù)。如果對(duì)于繼承的這個(gè)事物而言,其某函數(shù)的實(shí)現(xiàn)與基類一致,那它就可以直接繼承基類的函數(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)方面,往往為同類的設(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ù)該類設(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ì)于同類設(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)類型中屢見(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總線訪問(wèn)某外設(shè),在這個(gè)訪問(wèn)過(guò)程中,要通過(guò)操作CPU XXX上的SPI控制器的寄存器來(lái)達(dá)到訪問(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í)候,它訪問(wèn)XXX的SPI主機(jī)控制寄存器,當(dāng)用在XXX1的時(shí)候,它訪問(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è)只是訪問(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ì)思想。


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5152

    文章

    19670

    瀏覽量

    317521
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11511

    瀏覽量

    213781

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

文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux驅(qū)動(dòng)開(kāi)發(fā):字符設(shè)備驅(qū)動(dòng)開(kāi)發(fā)理論

    大部分學(xué)習(xí)者的最終目的就是學(xué)習(xí) Linux驅(qū)動(dòng)開(kāi)發(fā)Linux的外設(shè)驅(qū)動(dòng)可以分為:字符
    發(fā)表于 10-26 09:53 ?1458次閱讀

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解

    #《Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》電子書(shū)連載#第5章 Linux文件系統(tǒng)與設(shè)備文件系統(tǒng),由于字符
    發(fā)表于 06-06 11:28

    Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) - Linux設(shè)備驅(qū)動(dòng)類型

    的基本思想就是盡量抽取設(shè)備特性的共同點(diǎn),把最復(fù)雜的設(shè)備驅(qū)動(dòng)架構(gòu)程序代碼交給Linux的內(nèi)核和驅(qū)動(dòng)
    發(fā)表于 04-16 14:31

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

    的主要是設(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ā),
    發(fā)表于 11-03 10:03

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

    的主要是設(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ā)
    發(fā)表于 11-07 14:43

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)兩個(gè)重要思想解析

    嵌入式Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)思想進(jìn)階之驅(qū)動(dòng)分層與驅(qū)動(dòng)
    發(fā)表于 02-19 06:40

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第9章、Linux設(shè)備驅(qū)動(dòng)的異步通知與異步IO

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第9章、Linux設(shè)備驅(qū)動(dòng)
    發(fā)表于 10-27 11:33 ?0次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>詳解》第9章、<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>中</b>的異步通知與異步IO

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第8章、Linux設(shè)備驅(qū)動(dòng)的阻塞與非阻塞IO

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第8章、Linux設(shè)備驅(qū)動(dòng)
    發(fā)表于 10-27 11:35 ?9次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>詳解》第8章、<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>中</b>的阻塞與非阻塞IO

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第7章、Linux設(shè)備驅(qū)動(dòng)的并發(fā)控制

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第7章、Linux設(shè)備驅(qū)動(dòng)
    發(fā)表于 10-27 11:37 ?10次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>詳解》第7章、<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>中</b>的并發(fā)控制

    Linux USB總線的兩個(gè)鏈表

    個(gè) USB 總線引出兩個(gè)首要 的鏈表,一個(gè)為 USB 設(shè)備鏈表,一個(gè)為 USB 驅(qū)動(dòng)鏈表。
    發(fā)表于 04-20 10:33 ?1104次閱讀

    Linux設(shè)備驅(qū)動(dòng)思想在STM32編程的應(yīng)用

    這幾天看了一下Linux設(shè)備驅(qū)動(dòng),發(fā)現(xiàn)這套思想其實(shí)也可以用在普通的單片機(jī)編程上。這種思想較好的分割了驅(qū)動(dòng)
    發(fā)表于 12-31 18:56 ?4次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>思想</b>在STM32編程<b class='flag-5'>中</b>的應(yīng)用

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解
    發(fā)表于 10-28 11:03 ?54次下載

    Linux如何比較兩個(gè)文件的差異?

    Linux 如何比較兩個(gè)文件的差異?答案是使用 diff 命令。
    的頭像 發(fā)表于 01-17 17:30 ?5640次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>中</b>如何比較<b class='flag-5'>兩個(gè)</b>文件的差異?

    冷鏈運(yùn)輸兩個(gè)重要環(huán)節(jié)

    冷鏈運(yùn)輸兩個(gè)重要環(huán)節(jié)
    的頭像 發(fā)表于 01-28 17:13 ?1441次閱讀
    冷鏈運(yùn)輸<b class='flag-5'>中</b>的<b class='flag-5'>兩個(gè)</b><b class='flag-5'>重要</b>環(huán)節(jié)

    Linux如何比較兩個(gè)文件的差異?

    Linux 如何比較兩個(gè)文件的差異?答案是使用 diff 命令。
    的頭像 發(fā)表于 01-30 16:04 ?1.2w次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>中</b>如何比較<b class='flag-5'>兩個(gè)</b>文件的差異?