[問題] 四軸程式化或模組化的問題

看板LinuxDev作者 (沒有存在感的人)時間9年前 (2016/02/12 21:40), 9年前編輯推噓2(204)
留言6則, 3人參與, 最新討論串1/1
四軸快要做完(用到SPI+I2C+GPIO),正在想要怎麼啟動所有硬體才好。 現在有兩個方案: 一個就是用程式啟動,在rc.local裡設定開機後自動載入, (程式不經由任何module直接控制SPI/I2C/GPI) 可是這邊有一個問題是,如果程式無故crash(雖然現在沒遇到過) 我需要一個機制讓程式重新啟動(當該程式已經不在執行狀態時) 請問有無建議? 程式我已經差不多寫好了,藉由RT linux kenel的幫助 latency可以穩定縮小到1ms內(控制週期為4ms,這樣算及格了) 另一個是模組化,變成我要寫一個module去控制I2C/SPI/GPIO modules 我不知道這要怎麼做到,我自己的理解是, 這好像用一個module去控制兩個usb device一樣, 手上的書有提到都是分別控制I2C/SPI的,沒提到合在一起怎麼解決。 因為I2C的control要隨著SPI讀到的數據改變,所以一定要有一個module兩邊都能溝通 不知道這兩種方案孰優孰劣,板上先進可否指教? 用第2種方案我有點怕因為module化而使latency變差就是 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 90.41.58.242 ※ 文章網址: https://www.ptt.cc/bbs/LinuxDev/M.1455284459.A.EB8.html ※ 編輯: wtchen (90.41.58.242), 02/12/2016 21:43:28

02/12 22:24, , 1F
一隻driver註冊I2C/SPI子系統,這兩個IP的IRQ應也是分開
02/12 22:24, 1F

02/12 22:25, , 2F
所以可以在driver裡面卡同步機制去sync資料
02/12 22:25, 2F

02/17 08:30, , 3F
第一個可以透過hardware watchdog,如果硬體有的話
02/17 08:30, 3F

02/17 08:31, , 4F
第二個的話你沒有一個rtos應該不容易做到
02/17 08:31, 4F

02/17 17:50, , 5F
用Preempt RT kernel也不行嗎?我現在用這個
02/17 17:50, 5F
我的設計是這樣: i2c : 4 devices spi : 2 devices 如果單純用程式控制不透過i2c/spi driver,用mmap讀寫address, 可以把modules的delay降到最低 可是如果要用i2c/spi driver,有兩種作法 一種是用程式作sync(我個人不喜歡這種作法,沒啥挑戰性) program -> i2c module -> program (-> spi modules -> program) -> i2c module (有括號是因為spi裝置不需要頻率太高的讀取) 一種是另加一個module作sync program -> module[->i2c module(-> spi module) -> i2c module] 也就是說程式只看的到sync module這個 "四軸驅動程式", sync module直接跟i2c/spi modules溝通 所有的控制都在sync module裏面完成,包括雜訊處理跟姿態運算。 我真正想做的是這個,但我不清楚在Preempt RT Linux的架構下能不能做到

02/17 17:51, , 6F
其實我不太懂watchdog跟用script監控有啥分別
02/17 17:51, 6F
我不是很懂watchdog的必要性 如果我在rc.local裏面加個script執行我要的程式,像這樣: #!/bin/bash while true; do ps cax | grep QUADCOPTER > /dev/null if [ $? -eq 0 ]; then echo "Process is running." else echo "Process is not running." /home/pi/work/build/src/QUADCOPTER -> 我的程式 fi sleep 10 done 看起來似乎也能達成我要的效果 只是不知道跟watchdog比起來哪種比較好 (RPi有支援watchdog,我很想用看看,只是不知道有沒比較好) ※ 編輯: wtchen (86.200.247.70), 02/17/2016 18:10:17
文章代碼(AID): #1MlU3hwu (LinuxDev)
文章代碼(AID): #1MlU3hwu (LinuxDev)