PX4中ESC的驅動框架

2022-04-07 12:57:04 字數 2787 閱讀 4524

cdev繼承的是device,然後i2c又是繼承的cdev,然後esc又是繼承的i2c,device---->cdev---->i2c---->esc。

escinit函式裡面:首先會呼叫i2c的init函式。然後配置rst管腳,然後配置電調的i2c位址,包括兩個方面,乙個是設定飛控程式裡面的匯流排位址,另乙個是motor端的i2c位址。

i2cinit函式裡面:_dev----px4_i2c_dev_t----i2c_dev_s----i2c_ops_s,在i2c的init函式裡面,首先是乙個up_i2cinitialize函式,還要呼叫i2c_setfrequency函式設定頻率,然後就是呼叫cdev的init函式。

cdevinit函式裡面:首先呼叫device的init函式,然後主要就是乙個register_driver函式,這個register_driver函式把/dev/esc傳進去,還有fops結構體,還有this指標,這裡的this應該是g_esc,也就是esc物件的首位址。

qesc.cpp624行裡面的open函式是怎樣一級一級的到達底層的?

a:這個open是在fs_open.c裡面的88行的open,open的時候要把路徑path傳進去,在open裡面inode= inode_find(path, &relpath);根據路徑返回乙個裝置節點,再往下,open裡面還有fd= files_allocate(inode, oflags, 0, 0);根據裝置節點再返回乙個檔案陣列的下標,這個下標就是相當於檔案描述符。

然後在fs_open.c裡面的187行還有乙個inode->u.i_ops->open函式,這個open函式就是inode的fops結構體裡面的open函式,然後在cdev.cpp裡面80行可以看到,fops結構體裡面的open函式實際上就是cdev_open,在cdev.cpp的410行有cdev_open,在cdev_open 裡面又指向了另乙個open,你用sourceinsight查詢的時候它指向了cdev.cpp的180行,實際上是不對的,在cdev.cpp裡面進行了乙個強制型別轉換,然後sourceinsight沒有那麼智慧型,這裡的open函式實際上是filp->f_inode->i_private裡面的open函式,這裡的i_private就是this,具體實現就是在cdev的init函式裡面有乙個register_driver函式,在這個register函式裡面把this賦值給了i_provate,這裡的this就是esc,所以最後呼叫的是esc裡面的open函式,只不過esc裡面用不到自己的open函式了,所以esc裡面就沒有弄自己的open函式,只需要呼叫乙個頂層的open函式返回乙個檔案陣列的下標就可以了。

fs_files.c的323行就是找空下標的,那個for迴圈就是去找乙個空的下標,然後把它放在裡面。

nuttx實際上用了乙個偽檔案系統,用的是全域性的檔案陣列,然後每個檔案

裡面包含有f_inode。

然後在inode裡面又包括u和i_private,

然後在u裡面又包含file_operation結構體。

q:在i2c_nuttx.cpp的146行有乙個i2c_setfrequency函式,這個就是在i2c.h裡面的108行,最後就是在i2c.h的250行的ops結構體裡面的setfrequency函式指標,最後就是stm32_i2c.c裡面的1566行的stm32_i2c_setfrequency函式,那麼這個ops裡面的setfrequency是怎麼和stm32_i2c_setfrequency聯絡到一起的呢?

裡面有乙個rcs的指令碼,這個應該就是啟動指令碼,網上可以搜到,

幾個名詞  q:esc.cpp的86,schedule_interval是什麼意思,

這個是傳送速度訊號的時間間隔

q:esc.cpp的113,iox_mode

這個模式沒有用到,

q:esc.cpp的120,actuator_armed_s,

遙控器有乙個動作之後,飛機解鎖,結構體裡面的armed=1,就表示解鎖了,然後電機就可以轉動。

q:在i2c_nuttx.h的47行,__exprot右鍵ctrl之後是哪個,然後是什麼意思。

讓別的檔案可以使用。

複習完之後的總結:實際上在px4裡面是有乙個全域性的檔案陣列,當你用open去開啟乙個裝置的時候,它實際上會去找乙個空的陣列元素,然後把相關的資訊儲存在這個陣列元素中,然後返回的是這個陣列的下標,這個陣列元素的下標就相當於檔案描述符,

那麼問題來了,在這個陣列元素中儲存的是什麼東西呢,

陣列元素中儲存的是乙個file,乙個file就是乙個結構體,結構的元素在上面的中有介紹。

PX4中sbus在主控中配置

px4韌體fmu.c檔案中存在sbus的 只是沒開啟,這裡僅僅只是開啟sbus在px4的主控中的配置,不涉及sbus原理的分析。也適用於在主控中如何接收sbus遙控器資料。硬體 基於px4的v5的硬體的修改,移除掉io從控晶元 軟體 px4中v1.8.2版本 路徑 firmware cmake co...

PX4的Firmware版本設定

之後 選擇穩定版本或制定需要的版本 git reset hard 版本號版本號 檢視版本號 例如安裝1.11版本 git reset hard 94e0536然後執行 git submodule update init recursivegit clone cd firmware git check...

PX4新增新的應用

研究了四天怎麼新增新的應用程式,前幾天都嘗試著新增.cpp檔案的應用程式,跟著網上的方法都失敗了,結果今天試著新增乙個.c檔案的應用程式居然成功了。先把.c的新增方法寫一寫,以後學會了怎麼新增.cpp了再來修改吧。這是官方手冊給的新增方法,也是我參考的 在src下想要的資料夾 如 src modul...