日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 公眾號精選 > IOT物聯(lián)網(wǎng)小鎮(zhèn)
[導讀]作?者:道哥,10年嵌入式開發(fā)老兵,專注于:C/C、嵌入式、Linux。關(guān)注下方公眾號,回復【書籍】,獲取Linux、嵌入式領(lǐng)域經(jīng)典書籍;回復【PDF】,獲取所有原創(chuàng)文章(PDF格式)。目錄學習的困惑實踐環(huán)境編譯進內(nèi)核編譯為驅(qū)動模塊資料下載別人的經(jīng)驗,我們的階梯!大家好,我是道哥...

作  者:道哥,10 年嵌入式開發(fā)老兵,專注于:C/C 、嵌入式、Linux。


關(guān)注下方公眾號,回復【書籍】,獲取 Linux、嵌入式領(lǐng)域經(jīng)典書籍;回復【PDF】,獲取所有原創(chuàng)文章( PDF 格式)。


目錄


  • 學習的困惑


  • 實踐環(huán)境


  • 編譯內(nèi)核


  • 編譯為驅(qū)動模塊


  • 資料下載


別人的經(jīng)驗,我們的階梯!


大家好,我是道哥。今天給大家分享一些筆記本里的一些存貨: Linux 系統(tǒng)中的驅(qū)動和中斷相關(guān)。


大概會用 6~7 篇的文章,由淺入深的為大家介紹Linux中驅(qū)動程序的編寫方法。


文章的順序,也是我之前自己學習時的順序。


以前的學習記錄比較零散,現(xiàn)在只是把它們按照一定的順序重新梳理一下。


這幾篇文章,理論知識會少一些,更注重實際的操作


我會把操作用引導的代碼,全部上傳到網(wǎng)盤上,在文末有下載說明。


只要根據(jù)文中介紹的步驟進行操作,就一定可以操作成功。


學習的困惑

記得以前我在開始學習驅(qū)動開發(fā)的時候,找來很多文章、資料來學習,但是總是覺得缺少了點全局視角。


就好像:我想看清一座山的全貌,但總是被困在一個、又一個山谷中一樣。


主要的困惑有 3 點:


  1. 每一篇文章的介紹都是正確的,但是如果把很多文章放在一起看,就會發(fā)現(xiàn)怎么說的都不一樣啊?


  2. 有些文章注重函數(shù)的介紹,但是缺乏一個全局的視角,從整體上來觀察驅(qū)動程序的結(jié)構(gòu);


  3. 對于一個新手來說,能夠邊學習、邊實踐,這是最好的學習方式,但是很多文章不會注意這方面。雖然文章內(nèi)容很漂亮,但是不知道怎么去實踐、驗證。


因此,這幾篇文章我們就從最簡單的驅(qū)動模塊編譯開始,然后介紹字符設備驅(qū)動程序。


在這部分,會以 GPIO 為例子,重點描述其中的關(guān)鍵節(jié)點。


最后再介紹在中斷處理程序中,如何利用信號量、小任務、工作隊列,把內(nèi)核事件傳遞到應用層來處理。


作為第一個開篇文章,從最簡單的內(nèi)核編譯開始。


實際操作一下:如何把一個最簡單的驅(qū)動程序(hello),按照 2 種方式進行編譯:


  1. 編譯進內(nèi)核;


  2. 編譯為一個獨立的驅(qū)動模塊;


實踐環(huán)境

為了便于測試,以下操作都是在 Ubuntu16.04 操作系統(tǒng)里完成的。


編譯Linux驅(qū)動程序,肯定需要內(nèi)核源碼,這里選擇的是 linux-4.15 版本,可以在官網(wǎng)下載。


文末有下載方式。


下載之后,把linux-4.15.tar.gz解壓到Ubuntu中任意目錄即可,例如:解壓到~/tmp/目錄下:


$ tar -zxvf linux-4.15.tar.gz -C ~/tmp/

編譯進內(nèi)核

創(chuàng)建驅(qū)動程序目錄

linux中的驅(qū)動,一般都放在 linux-4.15/drivers/ 目錄下,因此在這個目錄中創(chuàng)建一個hello文件夾。


$ mkdir linux-4.15/drivers/hello
對于一個驅(qū)動來說,最重要的就是3個文件:


  1. 源代碼


  2. Kconfig


  3. Makefile


只要按照固定的格式來編寫這3個文件,linux內(nèi)核的編譯腳本就可以確保把我們的驅(qū)動程序編譯進去。


創(chuàng)建源文件

首先是源碼,在hello文件夾中創(chuàng)建源文件hello.c:


$ cd linux-4.15/drivers/hello
$ touch hello.c
源文件hello.c的內(nèi)容是:


#include

  • #include


  • // 當驅(qū)動被加載的時候,執(zhí)行此函數(shù)
    static int __init hello_init(void)
    {
    printk(KERN_ALERT "welcome, hello"\n");
    return 0;
    }

    // 當驅(qū)動被卸載的時候,執(zhí)行此函數(shù)
    static void __exit hello_exit(void)
    {
    printk(KERN_ALERT "bye, hello\n");
    }

    // 版權(quán)聲明
    MODULE_LICENSE("GPL");

    // 以下兩個函數(shù)屬于 Linux 的驅(qū)動框架,只要把驅(qū)動兩個函數(shù)地址注冊進去即可。
    module_init(hello_init);
    module_exit(hello_exit);
    有兩個小地方注意一下:


    1. 在內(nèi)核中,打印函數(shù)是 printk,而不是 printf;


    2. 打印信息的級別有好幾個,從 DEBUG 到 EMERG,這里使用的是 KERN_ALERT,方便查看打印信息。


    創(chuàng)建 Kconfig 文件

    這個文件是用來對內(nèi)核進行配置的,當執(zhí)行 make menuconfig 指令的時候,這個文件就被解析。


    先創(chuàng)建文件:


    $ cd linux-4.15/drivers/hello
    $ touch Kconfig
    添加如下內(nèi)容:


    config HELLO
    tristate "hello driver"
    help
    just a simplest driver.
    default y
    第一行內(nèi)容 config HELLO ,在執(zhí)行配置的時候,將會生成一個變量 CONFIG_HELLO ,而這個變量,將會在編譯的時候,被 Makefile 引用。


    最后一行的 default y ,就表示把 CONFIG_HELLO 的值設置成 y,從而讓這個驅(qū)動被編譯到內(nèi)核中。


    現(xiàn)在,hello驅(qū)動中的KConfig配置文件已經(jīng)準備好了,但是還需要這個配置文件登記到Linux內(nèi)核的整體配置文件中。


    也就是把它登記在 linux-4.15/drivers/Kconfig 文件的末尾:


    source "drivers/hello/Kconfig"

    endmenu // 加在這一句的上面
    現(xiàn)在,可以來執(zhí)行下面指令,看一下具體的配置界面:


    $ cd linux-4.15/
    $ make distclean
    $ make ARCH=x86_64 defconfig
    $ make ARCH=x86_64 menuconfig
    第2條指令,是用來把默認的配置保存到當前目錄下的 .config 配置文件,也就是把一個默認的配置文件復制過來,作為我們自己的配置文件。


    以后再修改配置參數(shù)時,修改的內(nèi)容就會存儲在 .config 文件中,


    第3條指令,是用來配置內(nèi)核的,可以進入Device Drivers菜單,然后在最底層看到我們的hello driver被標記成星號, 這表示被編譯進內(nèi)核。


    按向下方向鍵,把高亮定位到 Device Drivers ---> ,然后敲回車鍵,進入到 Device Drivers 的配置界面。


    按向下方向鍵,一直到最后一個條目,就可以看到我們的 hello 驅(qū)動了,如下:


    可以看到 hello driver 前面顯示的是型號 *,這表示:該驅(qū)動將會編譯進內(nèi)核。


    我們可以按下空格鍵試一下,會在三種標記中切換:型號,M,空值。M 標記意思是編譯成驅(qū)動模塊。


    我們這里選擇星號(編譯進內(nèi)核),然后按下右方向鍵,最下方的幾個按鍵的焦點移動到按鈕上:


    按下回車鍵,就會彈出保存對話框,選擇默認保存文件 .config 即可,然后在按鈕高亮的時候,按下回車鍵即可保存。


    此時,在彈出的確認窗口中,選擇 ,按下回車鍵即可:


    此時,返回到 Device Drivers 的配置界面,在最下面的按鈕中,選擇讓 高亮,然后一路退出即可。


    創(chuàng)建 Makefile 文件

    Makefile文件是make工具的腳本,首先創(chuàng)建它:


    $ cd linux-4.15/drivers/hello
    $ touch Makefile
    其中的內(nèi)容只有一行:


    obj-$(CONFIG_HELLO) = hello.o
    1. CONFIG_HELLO 可以看做一個變量,在編譯的時候,這個變量的值可能是:y, n 或者 m。


    2. 在剛才的 Kconfig 參數(shù)配置中,CONFIG_HELLO 被設置為 y,于是這句話就被翻譯成:obj-y = hello,表示把 hello 驅(qū)動編譯進內(nèi)核。


    現(xiàn)在,hello驅(qū)動程序的Makefile已經(jīng)創(chuàng)建好了,我們還要讓linux內(nèi)核的編譯框架知道這個文件才行。


    在文件 linux-4.15/drivers/Makefile 中的末尾,添加如下內(nèi)容:


    obj-$(CONFIG_HELLO) = hello/

    編譯

    萬事俱備,只欠編譯!依次執(zhí)行如下指令:


    $ cd linux-4.15/
    $ make -j4
    make指令執(zhí)行結(jié)束之后,編譯得到的內(nèi)核中(vmlinux)就包含了我們的hello驅(qū)動。


    編譯為驅(qū)動模塊

    編譯為驅(qū)動模塊,也有兩種 操作方式:


    編譯所有的驅(qū)動模塊

    1. 在執(zhí)行 make ARCH=x86_64 menuconfig 指令的時候,把 hello 配置成 M;


    2. 然后在 linux-4.15 中執(zhí)行編譯模塊指令:make -j4 modules。


    編譯成功之后,就可以得到文件: linux-4.15/drivers/hello/hello.ko


    這樣的編譯指令,是把所有的模塊都編譯了一次(在輸出信息中,可以看到編譯了很多模塊)。


    只編譯 hello 這一個驅(qū)動模塊

    另外一種編譯驅(qū)動模塊的方式是:進入hello目錄,只編譯這一個驅(qū)動模塊。


    這種編譯方法,就需要修改hello目錄下的Makefile文件了,內(nèi)容如下:


    可以把 hello 目錄下的所有文件刪除,只保留源文件 hello.c,然后新建 Makefile 文件。


    ifneq ($(KERNELRELEASE),)
    obj-m := hello.o
    else
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build
    PWD := $(shell pwd)
    default:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
    clean:
    $(MAKE) -C $(KERNEL_PATH) M=$(PWD) clean
    endif
    然后,在hello文件夾中執(zhí)行make指令,即可得到驅(qū)動模塊 hello.ko


    驗證一下

    加載驅(qū)動:


    $ cd linux-4.15/drivers/hello
    $ sudo insmod ./hello.ko
    此時終端窗口是沒有任何輸出的,需要輸入指令 dmesg | tail ,可以看到 hello_init 函數(shù)的輸出內(nèi)容:


    卸載驅(qū)動:


    $ sudo rmmod hello
    再次輸入 dmesg | tail ,可以看到 hello_exit 函數(shù)的輸出內(nèi)容:


    資料下載

    在公眾號【IOT物聯(lián)網(wǎng)小鎮(zhèn)】的后臺回復關(guān)鍵字:1112,獲取下列文件的網(wǎng)盤地址:


    linux-4.15.tar.gz


    hello文件夾壓縮包



    ------ End ------
  • 本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
    換一批
    延伸閱讀

    北京2022年10月11日 /美通社/ -- 在四川大涼山深處,有一只"涼山黑鷹"少年籃球隊:隊員平均年齡12歲,平均身高1米3,球隊剛成立時,連個像樣的球場都沒有。然而,憑著一腔熱情和驚人天賦,這只...

    關(guān)鍵字: 網(wǎng)絡 BSP 內(nèi)核 騰訊

    (全球TMT2022年9月27日訊)新思科技近日宣布推出業(yè)內(nèi)首款基于其ZeBu? EP1硬件仿真系統(tǒng)的硬件仿真與原型驗證統(tǒng)一硬件系統(tǒng),致力為SoC驗證和前期軟件開發(fā)提供更高水平的性能和靈活性。新思科技ZeBu...

    關(guān)鍵字: 硬件仿真 新思科技 硬件系統(tǒng) 編譯

    ARM的全稱為Advanced RISC Machines,直譯為高級精簡指令集處理器;RISC即為精簡指令集,那么對應的就存在CISC,其為復雜指令集。

    關(guān)鍵字: ARM 內(nèi)核 SoC

    上海2022年9月8日 /美通社/ -- 中國家居人齊聚滬上,點亮行業(yè)高質(zhì)量發(fā)展之光。9月6日,家居行業(yè)盛事——家居產(chǎn)業(yè)高質(zhì)量發(fā)展大會暨"月星之夜"在上海月星國際家居生活MALL舉行,數(shù)百位...

    關(guān)鍵字: BSP HID 內(nèi)核 大賽

    上海2022年8月25日 /美通社/ -- 新茶飲下半場,從價格戰(zhàn)、產(chǎn)品戰(zhàn)、渠道戰(zhàn)上升至品牌內(nèi)核的競爭,打動年輕消費者更需要在審美和品牌價值上做文章。新一代年輕人的...

    關(guān)鍵字: 美團 IP MIDDOT 內(nèi)核

    一直以來,CPU中央處理器都是大家的關(guān)注焦點之一。因此針對大家的興趣點所在,小編將為大家?guī)鞢PU的相關(guān)介紹,詳細內(nèi)容請看下文。

    關(guān)鍵字: CPU 中央處理器 內(nèi)核

    南京2022年8月8日 /美通社/ -- 2022年8月5日,BSiEE本澀于"2022聯(lián)商網(wǎng)大會"榮獲"2021年度高成長連鎖品牌"獎項,為品牌發(fā)展再賦成長印記。正值契...

    關(guān)鍵字: 美的 IP 數(shù)字化 內(nèi)核

    上海2022年8月5日 /美通社/ -- 日本院線級精準護膚品牌TAKAMI強勢布局中國,品牌天貓官方旗艦店于7月1日重磅亮相,以便捷的線上購買渠道為中國消費者提供更豐富、沉浸的購物體驗,持續(xù)傳遞品牌的美肌哲學。這是TA...

    關(guān)鍵字: OS OTA 內(nèi)核 大數(shù)據(jù)

    廣州2022年7月27日 /美通社/ -- 7月24日晚11:08,功能性護膚品牌溪木源官宣樸樹為品牌代言人。品牌卡點樸樹生日11·08官宣,心意滿滿。以官宣為契機,溪木源也迎來品牌升級,以全新品牌理念、全...

    關(guān)鍵字: HEART 內(nèi)核 創(chuàng)始人 大眾

    (全球TMT2022年6月9日訊)作為全球第二的服務器廠商,浪潮信息宣布加入Arm SystemReady™ 計劃,并通過了Arm?最高級SystemReady SR認證,為行業(yè)樹立新標桿。 浪潮...

    關(guān)鍵字: ARM SYSTEM AD 內(nèi)核

    IOT物聯(lián)網(wǎng)小鎮(zhèn)

    42 篇文章

    關(guān)注

    發(fā)布文章

    編輯精選

    技術(shù)子站

    關(guān)閉