日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

本篇文章將介紹linux設備驅動開發的基本知識,帶你快速撥開Linux驅動這團迷霧。文章分為如下3個小節進行講解:

1、設備驅動的概念和作用;

2、在無操作系統和有操作系統的情況下設備驅動的設計開發;

3、Linux設備驅動的重點、難點和學習方法

文章最后會給出一個簡單的LED驅動在無操作系統和Linux操作系統下的實現示例。

好,Let's go

 

1、設備驅動的概念和作用

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

Linux設備驅動概述

 

2、在無操作系統和有操作系統的情況下設備驅動的設計開發

2.1、無操作系統的情況下

事實上,在許多情況下我們的程序也運行在無操作系統的環境中(裸機程序),因為對于那些功能比較單一、控制并不復雜的系統不需要多任務調度和文件系統等復雜的功能,用單任務架構完全可以很好的實現我們的需求,也就是在一個無限循環(單片機編程中的while(1)死循環)中夾雜著對設備中斷的檢測或者對設備的輪詢。這一部分的知識相信有過單片機編程經驗的朋友一定非常熟悉了,下面是這種單任務軟件的架構:

Linux設備驅動概述

主函數

在這樣的系統中,雖然不存在操作系統,但是設備驅動必須存在。一般情況下每一種設備驅動都會定義成一個軟件模塊,包含.c文件和.h文件。

2.2、有操作系統的情況下

當包含操作系統時,我們還需要將驅動融入內核,為了實現這種融合,必須在所有設備的驅動中設計提供給操作系統內核的接口,這類接口由操作系統規定(這是一個復雜的過程,在后續更新的文章中會由淺及深的說明)。所以,存在操作系統的時候,驅動便成為了連接硬件和Linux內核的橋梁。當設備成功注冊到系統中,也就是讓系統知道了我們需要使用的設備的存在之后,Linux會將設備映射到文件系統的文件和目錄中,然后通過系統調用的接口open()、write()、read()、close()等即可訪問我們的設備。

3、Linux設備驅動的重點、難點和學習方法

Linux設備驅動的學習是一項浩繁和長久的過程,其中包含了如下重點和難點:

1、編寫Linux設備驅動要求工程師有一定的硬件基礎;

2、編寫Linux設備驅動要求工程師有非常好的C語言基礎,能靈活的運用C語言的結構體、指針以及內存動態申請和釋放等;

3、編寫Linux設備驅動要求工程師有一定的Linux內核基礎,并不要求對內核的各個部分有深入的研究,但至少我們要明白驅動程序與內核的接口;

4、編寫Linux設備驅動要求工程師有多任務并發控制和同步的基礎,因為在驅動中會大量的使用自旋鎖、互斥、信號量和等待隊列等并發與同步機制。

看到這里,相信你已經對Linux設備驅動有了基本的認識,首先我們要明白,Linux驅動程序是門檻最高難度最大的一部分,當然薪資也是相對最高的,所以只要我們掌握了方法堅持學習下去,一定可以撥開這團迷霧看見陽光。筆者會定期更新關于嵌入式Linux和C語言在開發和學習中的經驗和技巧。歡迎關注!

 

文章的最后,給出LED驅動在無操作系統和Linux操作系統下的實現示例,以供大家作以比較。LED一般直接由CPU的GPIO口控制,GPIO一般由兩組寄存器控制,即一組控制寄存器和一組數據寄存器。控制寄存器可設置GPIO口的工作方式為輸入或輸出。當引腳被設置為輸出時,向數據寄存器的對應位寫入1和0分別在引腳上產生高電平和低電平;當引腳設置為輸入時,讀取數據寄存器的對應位可獲得引腳上的電平高低。

在無操作系統時的LED驅動如下:

Linux設備驅動概述

 

上述程序中的LedInit()、LedOn()、LedOff()都直接作為驅動提供給應用程序使用。

 

在Linux下,我們使用字符設備驅動的框架來編寫對應于上圖中的LED驅動程序,為了遵循Linux編程的命名習慣,重新將其命名為led_init()、led_on()、led_off(),注意:你現在并不需要能夠讀懂下圖中的這些代碼,我在后續的文章更新中會繼續講解說明。

Linux操作系統下的LED驅動程序:

Linux設備驅動概述

 

 

Linux設備驅動概述

 

 

Linux設備驅動概述

 

在這里,我們只需要有一個感性的認識即可,那就是上圖中陌生的結構和元素都是Linux內核為設備定義的,在后面的學習中,我們只需要會使用即可(都是套路)。

筆者會定期更新嵌入式Linux、C語言在開發和學習中的經驗和技巧。歡迎關注,我們共同學習共同進步

分享到:
標簽:驅動 設備 Linux
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定