国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

嵌入式Linux設備驅動開發思想進階之驅動分層與驅動分離

發布時間:2017-11-3 10:04    發布者:ludi
關鍵詞: 嵌入式 , linux , 驅動
我們在學習I2CUSBSD驅動時,大家有沒有發現一個共性,就是在驅動開發時,每個驅動都分層三部分,由上到下分別是:
1XXX 設備驅動
2XXX 核心層
3XXX 主機控制器驅動
而需要我們編寫的主要是設備驅動部分,主機控制器驅動部分也有少量編寫,二者進行交互主要時由核心層提供的接口來實現;這樣結構清晰,大大地有利于我們的驅動開發,這其中就是利用了Linux設備驅動開發中兩個重要思想,今天我們來仔細解析一下。
一、設備驅動的分層思想
在面向對象的程序設計中,可以為某一類相似的事物定義一個基類,而具體的事物可以繼承這個基類中的函數。如果對于繼承的這個事物而言,其某函數的實現與基類一致,那它就可以直接繼承基類的函數;相反,它可以重載之。這種面向對象的設計思想極大地提高了代碼的可重用能力,是對現實世界事物間關系的一種良好呈現。
Linux內核完全由C語言和匯編語言寫成,但是卻頻繁用到了面向對象的設計思想。在設備驅動方面,往往為同類的設備設計了一個框架,而框架中的核心層則實現了該設備通用的一些功能。同樣的,如果具體的設備不想使用核心層的函數,它可以重載之。舉個例子:
[cpp] view plain copy
1. return_type core_funca(xxx_device * bottom_dev, param1_type param1, param1_type param2)  
2. {  
3.     if (bottom_dev->funca)  
4.     return bottom_dev->funca(param1, param2);  
5.     /* 核心層通用的funca代碼 */  
6.     ...  
7. }  
上述core_funca的實現中,會檢查底層設備是否重載了funca(),如果重載了,就調用底層的代碼,否則,直接使用通用層的。這樣做的好處是,核心層的代碼可以處理絕大多數該類設備的funca()對應的功能,只有少數特殊設備需要重新實現funca()
再看一個例子:
[cpp] view plain copy
1. return_type core_funca(xxx_device * bottom_dev, param1_type param1, param1_type param2)  
2. {  
3.     /*通用的步驟代碼A */  
4.     ...  
5.     bottom_dev->funca_ops1();  
6.     /*通用的步驟代碼B */  
7.     ...  
8.     bottom_dev->funca_ops2();  
9.     /*通用的步驟代碼C */  
10.     ...  
11.     bottom_dev->funca_ops3();  
12. }  
上述代碼假定為了實現funca(),對于同類設備而言,操作流程一致,都要經過通用代碼A、底層ops1、通用代碼B、底層ops2、通用代碼C、底層ops3”這幾步,分層設計明顯帶來的好處是,對于通用代碼ABC,具體的底層驅動不需要再實現,而僅僅只關心其底層的操作ops1ops2ops3。圖1明確反映了設備驅動的核心層與具體設備驅動的關系,實際上,這種分層可能只有2層(圖1a),也可能是多層的(圖1b信盈達嵌入式要領吧五六領悟四五吧
這樣的分層化設計在LinuxinputRTCMTDI2 CSPITTYUSB等諸多設備驅動類型中屢見不鮮。
二、主機驅動和外設驅動分離思想
主機、外設驅動分離的意義
Linux設備驅動框架的設計中,除了有分層設計實現以外,還有分隔的思想。舉一個簡單的例子,假設我們要通過SPI總線訪問某外設,在這個訪問過程中,要通過操作CPU XXX上的SPI控制器的寄存器來達到訪問SPI外設YYY的目的,最簡單的方法是:
[cpp] view plain copy
1. return_type xxx_write_spi_yyy(...)  
2. {  
3.     xxx_write_spi_host_ctrl_reg(ctrl);  
4.     xxx_ write_spi_host_data_reg(buf);  
5.     while(!(xxx_spi_host_status_reg()&SPI_DATA_TRANSFER_DONE));  
6.     ...  
7. }  
如果按照這種方式來設計驅動,結果是對于任何一個SPI外設來講,它的驅動代碼都是CPU相關的。也就是說,當然用在CPU XXX上的時候,它訪問XXXSPI主機控制寄存器,當用在XXX1的時候,它訪問XXX1SPI主機控制寄存器:
[cpp] view plain copy
1. return_type xxx1_write_spi_yyy(...)  
2. {  
3.     xxx1_write_spi_host_ctrl_reg(ctrl);  
4.     xxx1_ write_spi_host_data_reg(buf);  
5.     while(!(xxx1_spi_host_status_reg()&SPI_DATA_TRANSFER_DONE));  
6.     ...  
7. }  
這顯然是不能接受的,因為這意味著外設YYY用在不同的CPU XXXXXX1上的時候需要不同的驅動。那么,我們可以用如圖的思想對主機控制器驅動和外設驅動進行分離。這樣的結構是,外設abc的驅動與主機控制器ABC的驅動不相關,主機控制器驅動不關心外設,而外設驅動也不關心主機,外設只是訪問核心層的通用的API進行數據傳輸,主機和外設之間可以進行任意的組合。
file:///C:\Users\郭曉娟\AppData\Local\Temp\ksohtml\wps1C9.tmp.png
如果我們不進行上圖的主機和外設分離,外設abc和主機ABC進行組合的時候,需要9個不同的驅動。設想一共有m個主機控制器,n個外設,分離的結果是需要m+n個驅動,不分離則需要m*n個驅動。
Linux SPII2CUSBASoCALSA SoC)等子系統都典型地利用了這種分離的設計思想。

本文地址:http://m.qingdxww.cn/thread-518903-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 利用SAM E54 Xplained Pro評估工具包演示CAN轉USB橋接器以及基于CAN的主機和自舉程序應用程序
  • 使用SAM-IoT Wx v2開發板演示AWS IoT Core應用程序
  • 使用Harmony3加速TCP/IP應用的開發培訓教程
  • 集成高級模擬外設的PIC18F-Q71家族介紹培訓教程
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 美国大片在线观看 | 日韩高清在线播放 | 在线欧洲成人免费视频 | 久久女| 综合色在线 | 天堂网2021| 国内偷自拍对白视频 | 精品免费在线视频 | 日韩免费福利视频 | 一级片日韩 | 99自拍视频 | 久久99国产这里有精品视 | 老司机在线精品 | 国产日韩欧美一区二区 | 力王国语在线观看完整国语版免费 | 热re91久久精品国产91热 | 欧美区视频 | 亚洲欧美日韩高清专区一区 | 国产极品美女网站在线观看 | 四虎地址8848在线观看 | 一区二区三区四区在线观看视频 | 精品国产高清久久久久久小说 | 91四虎国自产在线播放线 | 国产精品黄页网站在线播放免费 | 色婷婷综合激情视频免费看 | 免费一级毛片在播放视频 | 久久久久久久国产视频 | 久久久亚洲精品蜜桃臀 | 在线观看成年美女黄网色视频 | 欧洲欧洲黄页网址免费 | 国产成人精品日本亚洲语言 | 欧美日韩一级片在线观看 | 中文字幕在线精品视频入口一区 | 免费人成网站在线播放 | 91国在线啪| 欧美三区在线观看 | 日本一区二区三区四区视频 | 火辣福利视频 | 131美女一区二区三区视频 | 国产中日韩一区二区三区 | 男人天堂网在线播放 |