(前情提要在LinuxDev板,#1M4NwTYZ)
改寫得差不多了,來分享一下後續
(正在等加了天線的RF module,拿到了再找好天氣試飛)
先給source code https://github.com/gnitnaw/RTPiDrone
(mkdir build; cd build; cmake ..
後 make doc可以看到編好的文件,記得要安裝doxygen)
講一下跟本板有關的事項:
- linked list很好用
去年的版本我已經發現週期會不定時突然暴增找不到原因。
今年這部份解決了,是卡在file i/o上。
每 1 or 2個 控制週期(4ms)我會將四軸當下的state存下來,
可是SD卡有時會突然不回應(idle快一秒)
四軸飛控如果半秒沒刷新state鐵掛。
(SD卡會有這樣的問題有可能是因為wear leveling的關係,
問題是你不可能不用wear leveling)
所以解決方案就是另開一個thread作file i/o
當有data要存下來時,把該data保存在linked list的最後,
然後叫醒(pthread_cond_signal)做file i/o的thread
該thread會從linked list最前面開始存入,直到該list只剩一個item。
(因為是thread,控制週期一到它會讓出CPU,就算i/o沒結束)
- 控制週期的問題
普通的non-RT Linux是不可靠的,你得用Preempt RT或Xenomai
使用以下的函式可以指定在某絕對時間Time醒來。
(不過建議先把ntp關掉就是)
clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &Time, NULL);
使用Xenomai的情況下,誤差差不多200us左右
Preempt_RT在priority max的情況下會比Xenomai更好。
- 通訊模組
我是用nRF24l01,支援SPI,可以把讀取時間降到最低(8Mbps)
如果改用UART介面會慢很多(最多115200bps)
(慢不要緊,可是Preempt RT/Xenomai都會導致系統吞吐量下降)
(CPU負擔增加,real time效果也會變差)
不過nRF24l01的問題是訊號太差,我最多只能離5公尺遠,不然收不到訊號。
其他的東西因為跟本板比較無關,就先不說了。
有問題推文問好了。
最後,感謝大家的協助,我從本板學到很多。