作者wtchen (没有存在感的人)
看板LinuxDev
标题[问题] 四轴程式化或模组化的问题
时间Fri Feb 12 21:40:57 2016
四轴快要做完(用到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://webptt.com/cn.aspx?n=bbs/LinuxDev/M.1455284459.A.EB8.html
※ 编辑: wtchen (90.41.58.242), 02/12/2016 21:43:28
1F:推 askacis: 一只driver注册I2C/SPI子系统,这两个IP的IRQ应也是分开 02/12 22:24
2F:→ askacis: 所以可以在driver里面卡同步机制去sync资料 02/12 22:25
3F:推 cobrasgo: 第一个可以透过hardware watchdog,如果硬体有的话 02/17 08:30
4F:→ cobrasgo: 第二个的话你没有一个rtos应该不容易做到 02/17 08:31
5F:→ wtchen: 用Preempt RT kernel也不行吗?我现在用这个 02/17 17:50
我的设计是这样:
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的架构下能不能做到
6F:→ wtchen: 其实我不太懂watchdog跟用script监控有啥分别 02/17 17:51
我不是很懂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