一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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ā)的基本知識(shí)

Wildesbeast ? 來(lái)源:今日頭條 ? 作者:嵌入式在左C語(yǔ)言在 ? 2020-02-24 15:03 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本篇文章將介紹Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)的基本知識(shí),帶你快速撥開(kāi)Linux驅(qū)動(dòng)這團(tuán)迷霧。文章分為如下3個(gè)小節(jié)進(jìn)行講解:

1、設(shè)備驅(qū)動(dòng)的概念和作用;

2、在無(wú)操作系統(tǒng)和有操作系統(tǒng)的情況下設(shè)備驅(qū)動(dòng)的設(shè)計(jì)開(kāi)發(fā);

3、Linux設(shè)備驅(qū)動(dòng)的重點(diǎn)、難點(diǎn)和學(xué)習(xí)方法。

文章最后會(huì)給出一個(gè)簡(jiǎn)單的LED驅(qū)動(dòng)在無(wú)操作系統(tǒng)和Linux操作系統(tǒng)下的實(shí)現(xiàn)示例。

好,Let's go

1、設(shè)備驅(qū)動(dòng)的概念和作用

大家都知道在Linux開(kāi)發(fā)中是一個(gè)分層的思想,也就是說(shuō)應(yīng)用層、操作系統(tǒng)層、驅(qū)動(dòng)層和硬件層分別獨(dú)立,然后為上一層提供API接口。對(duì)設(shè)備驅(qū)動(dòng)通俗一點(diǎn)的解釋就是:驅(qū)使硬件設(shè)備行動(dòng)。驅(qū)動(dòng)與底層硬件直接打交道,按照硬件設(shè)備的具體工作方式,讀寫(xiě)其寄存器,完成設(shè)備輪詢、中斷處理和DMA通信等。設(shè)備驅(qū)動(dòng)實(shí)際上充當(dāng)了硬件和應(yīng)用軟件之間的紐帶,在系統(tǒng)沒(méi)有操作系統(tǒng)的情況下工程師可以根據(jù)硬件設(shè)備的特點(diǎn)自行定義接口,如對(duì)串口定義SerialSend()、SerialReceive(),對(duì)繼電器定義RelayOn()、RelayOff()等。而在有操作系統(tǒng)的情況下,驅(qū)動(dòng)的架構(gòu)則由操作系統(tǒng)定義,因?yàn)轵?qū)動(dòng)架構(gòu)也屬于操作系統(tǒng)內(nèi)核的一部分,驅(qū)動(dòng)工程師必須按照相應(yīng)的架構(gòu)設(shè)計(jì)驅(qū)動(dòng),這樣的話驅(qū)動(dòng)才能融入操作系統(tǒng)內(nèi)核中,并正常運(yùn)行。

2、在無(wú)操作系統(tǒng)和有操作系統(tǒng)的情況下設(shè)備驅(qū)動(dòng)的設(shè)計(jì)開(kāi)發(fā)

2.1、無(wú)操作系統(tǒng)的情況下

事實(shí)上,在許多情況下我們的程序也運(yùn)行在無(wú)操作系統(tǒng)的環(huán)境中(裸機(jī)程序),因?yàn)閷?duì)于那些功能比較單一、控制并不復(fù)雜的系統(tǒng)不需要多任務(wù)調(diào)度和文件系統(tǒng)等復(fù)雜的功能,用單任務(wù)架構(gòu)完全可以很好的實(shí)現(xiàn)我們的需求,也就是在一個(gè)無(wú)限循環(huán)(單片機(jī)編程中的while(1)死循環(huán))中夾雜著對(duì)設(shè)備中斷的檢測(cè)或者對(duì)設(shè)備的輪詢。這一部分的知識(shí)相信有過(guò)單片機(jī)編程經(jīng)驗(yàn)的朋友一定非常熟悉了,下面是這種單任務(wù)軟件的架構(gòu):

主函數(shù)

在這樣的系統(tǒng)中,雖然不存在操作系統(tǒng),但是設(shè)備驅(qū)動(dòng)必須存在。一般情況下每一種設(shè)備驅(qū)動(dòng)都會(huì)定義成一個(gè)軟件模塊,包含.c文件和.h文件。

2.2、有操作系統(tǒng)的情況下

當(dāng)包含操作系統(tǒng)時(shí),我們還需要將驅(qū)動(dòng)融入內(nèi)核,為了實(shí)現(xiàn)這種融合,必須在所有設(shè)備的驅(qū)動(dòng)中設(shè)計(jì)提供給操作系統(tǒng)內(nèi)核的接口,這類接口由操作系統(tǒng)規(guī)定(這是一個(gè)復(fù)雜的過(guò)程,在后續(xù)更新的文章中會(huì)由淺及深的說(shuō)明)。所以,存在操作系統(tǒng)的時(shí)候,驅(qū)動(dòng)便成為了連接硬件和Linux內(nèi)核的橋梁。當(dāng)設(shè)備成功注冊(cè)到系統(tǒng)中,也就是讓系統(tǒng)知道了我們需要使用的設(shè)備的存在之后,Linux會(huì)將設(shè)備映射到文件系統(tǒng)的文件和目錄中,然后通過(guò)系統(tǒng)調(diào)用的接口open()、write()、read()、close()等即可訪問(wèn)我們的設(shè)備。

3、Linux設(shè)備驅(qū)動(dòng)的重點(diǎn)、難點(diǎn)和學(xué)習(xí)方法

Linux設(shè)備驅(qū)動(dòng)的學(xué)習(xí)是一項(xiàng)浩繁和長(zhǎng)久的過(guò)程,其中包含了如下重點(diǎn)和難點(diǎn):

1、編寫(xiě)Linux設(shè)備驅(qū)動(dòng)要求工程師有一定的硬件基礎(chǔ);

2、編寫(xiě)Linux設(shè)備驅(qū)動(dòng)要求工程師有非常好的C語(yǔ)言基礎(chǔ),能靈活的運(yùn)用C語(yǔ)言的結(jié)構(gòu)體、指針以及內(nèi)存動(dòng)態(tài)申請(qǐng)和釋放等;

3、編寫(xiě)Linux設(shè)備驅(qū)動(dòng)要求工程師有一定的Linux內(nèi)核基礎(chǔ),并不要求對(duì)內(nèi)核的各個(gè)部分有深入的研究,但至少我們要明白驅(qū)動(dòng)程序與內(nèi)核的接口;

4、編寫(xiě)Linux設(shè)備驅(qū)動(dòng)要求工程師有多任務(wù)并發(fā)控制和同步的基礎(chǔ),因?yàn)樵隍?qū)動(dòng)中會(huì)大量的使用自旋鎖、互斥、信號(hào)量和等待隊(duì)列等并發(fā)與同步機(jī)制。

看到這里,相信你已經(jīng)對(duì)Linux設(shè)備驅(qū)動(dòng)有了基本的認(rèn)識(shí),首先我們要明白,Linux驅(qū)動(dòng)程序是門(mén)檻最高難度最大的一部分,當(dāng)然薪資也是相對(duì)最高的,所以只要我們掌握了方法堅(jiān)持學(xué)習(xí)下去,一定可以撥開(kāi)這團(tuán)迷霧看見(jiàn)陽(yáng)光。筆者會(huì)定期更新關(guān)于嵌入式Linux和C語(yǔ)言在開(kāi)發(fā)和學(xué)習(xí)中的經(jīng)驗(yàn)和技巧。歡迎關(guān)注!

文章的最后,給出LED驅(qū)動(dòng)在無(wú)操作系統(tǒng)和Linux操作系統(tǒng)下的實(shí)現(xiàn)示例,以供大家作以比較。LED一般直接由CPU的GPIO口控制,GPIO一般由兩組寄存器控制,即一組控制寄存器和一組數(shù)據(jù)寄存器。控制寄存器可設(shè)置GPIO口的工作方式為輸入或輸出。當(dāng)引腳被設(shè)置為輸出時(shí),向數(shù)據(jù)寄存器的對(duì)應(yīng)位寫(xiě)入1和0分別在引腳上產(chǎn)生高電平和低電平;當(dāng)引腳設(shè)置為輸入時(shí),讀取數(shù)據(jù)寄存器的對(duì)應(yīng)位可獲得引腳上的電平高低。

在無(wú)操作系統(tǒng)時(shí)的LED驅(qū)動(dòng)如下:

上述程序中的LedInit()、LedOn()、LedOff()都直接作為驅(qū)動(dòng)提供給應(yīng)用程序使用。

在Linux下,我們使用字符設(shè)備驅(qū)動(dòng)的框架來(lái)編寫(xiě)對(duì)應(yīng)于上圖中的LED驅(qū)動(dòng)程序,為了遵循Linux編程的命名習(xí)慣,重新將其命名為led_init()、led_on()、led_off(),注意:你現(xiàn)在并不需要能夠讀懂下圖中的這些代碼,我在后續(xù)的文章更新中會(huì)繼續(xù)講解說(shuō)明。

Linux操作系統(tǒng)下的LED驅(qū)動(dòng)程序:

在這里,我們只需要有一個(gè)感性的認(rèn)識(shí)即可,那就是上圖中陌生的結(jié)構(gòu)和元素都是Linux內(nèi)核為設(shè)備定義的,在后面的學(xué)習(xí)中,我們只需要會(huì)使用即可(都是套路)。

聲明:本文內(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)投訴
  • led
    led
    +關(guān)注

    關(guān)注

    242

    文章

    23843

    瀏覽量

    674041
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11511

    瀏覽量

    213783
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1617

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(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)可以分為:字符設(shè)備
    發(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)開(kāi)發(fā) Linux 設(shè)備驅(qū)動(dòng)
    發(fā)表于 09-10 13:10 ?82次下載
    嵌入式<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>

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)入門(mén)

    本文以快捷而簡(jiǎn)單的方式講解如何像一個(gè)內(nèi)核開(kāi)發(fā)者那樣開(kāi)發(fā)linux設(shè)備驅(qū)動(dòng). 要開(kāi)發(fā)
    發(fā)表于 03-19 14:57 ?600次下載

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第23章、Linux設(shè)備驅(qū)動(dòng)的移植

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第23章、Linux設(shè)備驅(qū)動(dòng)
    發(fā)表于 10-27 10:58 ?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>詳解》第23章、<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>的移植

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第17章、Linux音頻設(shè)備驅(qū)動(dòng)

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第17章、Linux音頻設(shè)備驅(qū)
    發(fā)表于 10-27 11:14 ?17次下載
    《<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>詳解》第17章、<b class='flag-5'>Linux</b>音頻<b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第16章、Linux網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第16章、Linux網(wǎng)絡(luò)設(shè)備驅(qū)
    發(fā)表于 10-27 11:17 ?5次下載
    《<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>詳解》第16章、<b class='flag-5'>Linux</b>網(wǎng)絡(luò)<b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第14章、Linux終端設(shè)備驅(qū)動(dòng)

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第14章、Linux終端設(shè)備驅(qū)
    發(fā)表于 10-27 11:22 ?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'>開(kāi)發(fā)</b>詳解》第14章、<b class='flag-5'>Linux</b>終端<b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>

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

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第13章、Linux設(shè)備驅(qū)動(dòng)
    發(fā)表于 10-27 11:24 ?18次下載
    《<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>詳解》第13章、<b class='flag-5'>Linux</b>塊<b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>

    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>中的異步通知與異步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>中的阻塞與非阻塞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>中的并發(fā)控制

    嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)基礎(chǔ)知識(shí)總結(jié)免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)基礎(chǔ)知識(shí)總結(jié)免費(fèi)下載 嵌入式Linux
    發(fā)表于 10-23 16:10 ?13次下載

    Linux用戶態(tài)開(kāi)發(fā)驅(qū)動(dòng)教程及基礎(chǔ)知識(shí)

    Linux用戶態(tài)開(kāi)發(fā)驅(qū)動(dòng)教程及基礎(chǔ)知識(shí)
    發(fā)表于 07-14 10:06 ?7次下載

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

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