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