本文轉自迅為4412精英版群: 本期實驗比較簡單,就是寫一個簡單的應用程序調(diào)用前面寫的驅(qū)動。 硬件工具 1)iTOP4412 開發(fā)板 2)U 盤或者 TF 卡 3)PC 機 4)串口 9.1.1.2軟件工具 1)虛擬機 Vmware 3)超級終端(串口助手) 4)實驗配套源碼文件夾“invoke_hello” 視頻資源 本節(jié)配套視頻為“視頻 09-編寫簡單應用調(diào)用驅(qū)動” 學習目標 本章需要學習以下內(nèi)容: 學會調(diào)用設備節(jié)點 實驗操作 本期實驗很簡單,在前面 Linux 應用中就已經(jīng)學習過設備節(jié)點的調(diào)用。需要用到函數(shù) extern void printf(const char *format,...);定義在標準 C 語言頭文件 stdio.h 中。 下面幾個頭文件在應用中一般一起調(diào)用。 頭文件 #include 包含基本系統(tǒng)數(shù)據(jù)類型。系統(tǒng)的基本數(shù)據(jù)類型在 32 編 譯環(huán)境中保持為 32 位值,并會在 64 編譯環(huán)境中增長為 64 位值。 頭文件包含系統(tǒng)調(diào)用文件的函數(shù)?梢哉{(diào)用普通文件、目錄、管道、socket、 字符、塊的屬性。 定義了 open 函數(shù) 定義了 close 函數(shù) 定義了 ioctl 函數(shù) 另外提醒一下,這些頭文件是和編譯器在一起。 這里使用,如下圖所示,進入目錄“/usr/local/arm/arm-2009q3”。 使用查找命令“find ./ -name stat.h”,如下圖所示,使用的頭文件是目錄 “/arm-none-linux-gnueabi/libc/usr/include/sys/stat.h”中的. 其它幾個頭文件可以采用類似的方法查找,這里給大家提醒這一點,因為有時候拿到源碼 之后,可能編譯器版本和源碼不完全對應,這個時候就有可能需要修改和處理一下頭文件。不過這種問題一般都可以通過網(wǎng)絡查找錯誤提示的方法一個一個解決。 如下圖所示,是一個簡單的調(diào)用程序。 新建“invoke_hello”文件夾,將上圖的中的文件拷貝進入,進入新建的“invoke_hello” 目錄,使用編譯命令 “arm-none-linux-gnueabi-gcc -o invoke_hello invoke_hello.c -static” 編譯,如下圖所示。 將 “invoke_hello” 拷貝到 U 盤, 啟動開發(fā)板, 加載前一期的 “devicenode_linux_module” 驅(qū)動,如下圖所示,使用 invoke_hello 調(diào)用設備節(jié)點“/dev/hello_ctl123”。 先使用命令“mount /dev/sda1 /mnt/udisk/”加載 U 盤; 使用命令“insmod /mnt/udisk/devicenode_linux_module.ko”加載驅(qū)動; 使用命令“./mnt/udisk/invoke_hello”,運行 invoke_hello。 如上圖所示,運行“invoke_hello”之后,會打印以下內(nèi)容” hello open cmd is 1,arg is 6 hello release 如下圖所示,設備節(jié)點 open、close、ioctl 分別對應打印信息 printk(KERN_EMERG "hello open\n"); printk(KERN_EMERG "hello release\n"); printk("cmd is %d,arg is %d\n",cmd,arg);ioctl 會打印第二個和第三個參數(shù)。 通過前面的分析,可以看到上層應用對設備節(jié)點 open、close、ioctl 分別對應驅(qū)動層的 open、release、unlocked_ioctl。
|