91精品人妻系列动画无码 - 国产精品夜间视频香蕉 - 91丝袜人妻一区二区三区 - 久久伊伊香蕉精品网站

信盈達(dá)—您身邊的嵌入式&人工智能專家
全國(guó)免費(fèi)咨詢熱線:400-8788-909

嵌入式培訓(xùn): Linux設(shè)備樹詳解

時(shí)間:2018-08-24 00:00:00 來源:信盈達(dá) 作者:信盈達(dá)

ARM Linux社區(qū)為什么要引入設(shè)備樹

 

Linux之父Linus Torvalds閑來無事,在翻看ARM Linux代碼的時(shí)候,有一天終于忍不住了。他在2011317日的ARM Linux郵件列表中說道:“This whole ARM thing is a f*cking pain in the ass”。這句話迫使ARM Linux社區(qū)引入了設(shè)備樹。

 

Linus Torvalds為什么會(huì)發(fā)飆呢?ARM Linux社區(qū)的牛人為什么又乖乖地聽話了?你得首先理解Linux設(shè)備驅(qū)動(dòng)框架中一個(gè)非常好的設(shè)計(jì):設(shè)備信息和驅(qū)動(dòng)分離。

 

為了什么說明設(shè)備信息和驅(qū)動(dòng)分離的概念,先來看一個(gè)簡(jiǎn)單的模擬代碼實(shí)例:

 

【例-1】實(shí)現(xiàn)一個(gè)代碼,把要使用的信息簡(jiǎn)單寫死在代碼中:

 

int add() /*模擬驅(qū)動(dòng)代碼*/

 

{

 

return 3+5; /*模擬設(shè)備信息*/

 

}

 

優(yōu)點(diǎn):簡(jiǎn)單

 

缺點(diǎn):一旦加數(shù)和被加數(shù)發(fā)生變化就得改代碼

 

改進(jìn)設(shè)計(jì)如下:

 

【例-2】實(shí)現(xiàn)一個(gè)代碼,把要使用的信息和操作代碼分離開來:

 

struct dev{

 

int id;

 

int x;

 

int y;

 

}; /*模擬設(shè)備信息結(jié)構(gòu)*/

 

strcut drv{

 

int id;

 

int (*add)(struct dev *info);

 

}; /*模擬驅(qū)動(dòng)結(jié)構(gòu)*/

 

int add(struct dev *info) /*模擬驅(qū)動(dòng)代碼*/

 

{

 

return info->x + info->y; /*模擬設(shè)備信息-通過參數(shù)傳遞進(jìn)來*/

 

}

 

struct drv drv = {

 

.id = 1,

 

.add = add,

 

};

 

/*模擬設(shè)備信息*/

 

struct dev dev = {

 

.id = 1,

 

.x = 3,

 

.y = 5,

 

};

 

/*模擬總線初始化匹配設(shè)備信息和驅(qū)動(dòng)代碼*/

 

int bus()

 

{

 

if(dev.id == drv.id){

 

return drv.add(&dev);

 

}

 

...

 

}

 

優(yōu)點(diǎn):不管加數(shù)和被加數(shù)怎么變化,不需要修改代碼,僅需要修改信息

 

缺點(diǎn):結(jié)構(gòu)比較復(fù)雜

 

那這個(gè)設(shè)備信息和驅(qū)動(dòng)分離的設(shè)計(jì)跟驅(qū)動(dòng)有什么關(guān)系呢?熟悉硬件編程的同學(xué)都知道,硬件一般的構(gòu)成可以使用下圖簡(jiǎn)單表述:

 

 

 

操作外設(shè)的驅(qū)動(dòng)代碼邏輯,只要硬件是一樣的,就不會(huì)變化。但是外設(shè)掛到不同的主機(jī)上,可能會(huì)存在I/O地址的變化,如果有中斷也是一樣的,中斷號(hào)也可能不同。這些I/O地址和中斷號(hào)就是設(shè)備信息,使用這些信息來操作控制硬件的代碼就是驅(qū)動(dòng)。

 

如果采用【例-1】的設(shè)計(jì)方式,那么同一個(gè)硬件外設(shè)接到不同的主機(jī),或是換了地址線/中斷線,設(shè)備信息就變化了,得去修改驅(qū)動(dòng)。但是采用【例-2】的方式進(jìn)行設(shè)計(jì),問題就迎刃而解:不管同樣的外設(shè)硬件接到哪里或是那個(gè)平臺(tái),其驅(qū)動(dòng)代碼邏輯并不需要改動(dòng),而僅僅需要改變下設(shè)備信息,主要的就是I/O地址和中斷號(hào)。

 

說了這么半天,跟引入設(shè)備樹有什么關(guān)系呢?華清教學(xué)使用的開發(fā)板(A8/A9)都使用DM9000網(wǎng)卡芯片。DM9000驅(qū)動(dòng)是開源的,在主線內(nèi)核源碼中就有。我們每次基于A8/A9板子移植的時(shí)候,DM9000驅(qū)動(dòng)并沒有修改過,僅僅是選配了下,主要的工作是在板級(jí)文件中添加了設(shè)備信息。DM9000驅(qū)動(dòng)使用的是platform框架,所以添加了一份DM9000網(wǎng)卡芯片的platform_device信息。問題來了,如果使用C代碼的形式來描述設(shè)備信息,則在內(nèi)核源碼中,將會(huì)有多份DM9000platform_device設(shè)備信息,造成了內(nèi)核代碼冗余。

 

解決這個(gè)問題的辦法就是引入設(shè)備樹,改造【例-2】來說明設(shè)備樹的作用。

 

【例-3】實(shí)現(xiàn)一個(gè)代碼,不僅把要使用的信息和操作代碼分離開來,而且信息不是C代碼編寫的,而是文本配置文件保存的:

 

struct dev{

 

int id;

 

int x;

 

int y;

 

}; /*模擬設(shè)備信息結(jié)構(gòu)*/

 

strcut drv{

 

int id;

 

int (*add)(struct dev *info);

 

}; /*模擬驅(qū)動(dòng)結(jié)構(gòu)*/

 

int add(struct dev *info) /*模擬驅(qū)動(dòng)代碼*/

 

{

 

return info->x + info->y; /*模擬設(shè)備信息-通過參數(shù)傳遞進(jìn)來*/

 

}

 

struct drv drv = {

 

.id = 1,

 

.add = add,

 

};

 

/*模擬設(shè)備樹-一個(gè)特殊的配置文件,xxx.dtbs的文本文件*/

 

/{

 

......

 

Dm9000{

 

x = 3;

 

y = 5;

 

};

 

......

 

};

 

/*模擬總線初始化匹配設(shè)備信息和驅(qū)動(dòng)代碼*/

 

int bus()

 

{

 

/*模擬設(shè)備樹初始化處理*/

 

讀文件(xxx.dtbs);

 

解析文件內(nèi)容(根據(jù)設(shè)備樹的規(guī)則來解析);

 

生成struct dev設(shè)備信息;

 

if(dev.id == drv.id){

 

return drv.add(&dev);

 

}

 

...

 

}

 

如果像【例-3】這樣,就可以解決大量設(shè)備信息的代碼冗余問題。

 

推而廣之,系統(tǒng)的軟硬件信息都可以使用設(shè)備樹來描述。這樣的話,ARM Linux社區(qū)就不會(huì)因?yàn)橹С职遄雍万?qū)動(dòng)越來越多造成內(nèi)核源碼中出現(xiàn)很多冗余代碼(主要是板級(jí)文件),僅僅需要移植者,把系統(tǒng)的軟硬件信息通過設(shè)備樹提供出來,選配一下內(nèi)核代碼,就可以了。

信盈達(dá)2008年在深圳特區(qū)南山高新科技園成立。自成立至今近九年來專注為企業(yè)和個(gè)人提供高端方案設(shè)計(jì)、高端嵌入式/Android培訓(xùn)等服務(wù)。公司下設(shè)信盈達(dá)實(shí)訓(xùn)學(xué)院、信盈達(dá)研發(fā)中心、信盈達(dá)教學(xué)儀器三大業(yè)務(wù)板塊。九年來公司堅(jiān)持"技術(shù)領(lǐng)先、服務(wù)領(lǐng)先",以雄厚的實(shí)力和專業(yè)的品質(zhì)成為國(guó)內(nèi)唯一有實(shí)力從產(chǎn)品最底層研發(fā)到系統(tǒng)層開發(fā)的嵌入式實(shí)訓(xùn)、產(chǎn)品解決方案提供商。為中國(guó)IT行業(yè)提供最具價(jià)值的職業(yè)教育服務(wù)。專業(yè)訓(xùn)嵌入式、物聯(lián)網(wǎng)、人工智能、Java、單片機(jī)等課程,想了解更多信息點(diǎn)擊立馬咨詢