我們接著上一節的內容來學習驅動程序的開發,本節要學習的是用應級驅動的開發:
與系統級驅動不同的是,應用級驅動只需要對已存在的設備節點進行操作,並與上層應用程序做交互即可。也就是說,應用級驅動的作用是將已存在的設備與上層應用建立起一個鏈接。通常可以使用任何方式的數據通訊,但在PX4里採用的方式是uORB機制。例如:我們在/dev下有一個串口設備結節/dev/ttyS2,我們將一個GPS設備接入到這個串口節點上,然後就可以通過標準的驅動程序調用(open、close、read、write、seek、ioctl等)來對這個設備節點/dev/ttyS2來操作了。下面我們來通過一個簡單的例子來實現這樣的一個應用級驅動程序。
1.配置編譯選項:在cmake/configs/nuttx_px4fmu-v3_default.cmake中config_module_list列表中加入gps驅動的編譯選項:
2.創建驅動程序:在src/drivers/目錄下創建一個叫gps的文件夾src/drivers/gps,並在其中創建兩個文件CMakeLists.txt和gps.c(這裡作者是採用C語言來編寫的驅動程序,如果使用C++的話需要創建gps.cpp不再贅述):
3.編寫入口函數:在gps.c中聲明並實現一個叫gps_main()的主函數,在這裡我們通過對argv[1]參數來判斷用戶的兩個操作:start和stop,即為啟用/停用gps驅動程序,在啟用時調用start()函數,在停用時調用stop()函數:
4.創建後台運行進程:關於創建進程和線程或是工作隊列的相關知識,我們在後續章節中來學習,這裡讀者只需要知道我們是通過px4_task_spawn_cmd()函數創建了一個進程即可:
程序中定義了一個靜態變數static int _running = 0;在start()函數中將其賦值為1,表示運行;在stop()函數中將其賦值為0,表示停止,這個_running在下面的核心函數中的while(_running)作為循環的條件。
5.驅動核心函數:在這裡我們將核心函數命名為gps_core(),在它內部通過一個while(_running),來循環讀取/dev/ttyS2中的數據,並顯示出來:
這樣我們就通過對/dev/ttyS2的讀取操作,將gps設備中的數據顯示出來,結果如下:
此測試結果不是在戶外運行的結果,所以沒有經度緯度和速度內容,但基本數據的格式已經顯示出來,說明我們的驅動程序已經可以正常工作了。
6.發布uORB:通過上面的程序可以將gps的數據顯示出來,但我們的目的是通過uORB機制將數據提供給上層應用使用,所以還需要將數據組織成uORB的msg格式,並用「公告」、「發布」的方式向上層應用發布uORB:
關於uORB的原理與使用我們已經在前面的章節中學習過了,這裡不再贅述。
PS:由於源代碼文字在手機上查看有大量對齊和縮進的問題,所以採用了圖片的方式,如想使用源代碼請訪問:
《問渠網》
http://www.askpure.com
TAG:無人機(UAV) | 科技 |