亲:给 arduino 装个操作系统吧~~~~~
本帖最后由 SS15 于 2011-12-28 09:35 编辑官网的 playground 简直是个宝藏啊
1、Event:http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1279102180/2
一个非常简洁很容易懂的事件驱动程序框架,使用了函数指针和事件队列来实现事件驱动,但是在事件队列里面没有对事件优先级做出处理。对于要开发自己事件驱动框架的同学,这个例子很具有参考价值。
2、Dduinos:http://code.google.com/p/duinos/
一个基于 freeRTOS 面向 arduino 体系的开源 RTOS。支持多线程和线程调度。我在328和2560下面初步测试通过。文档很少,不过貌似这已经是Arduino平台上最普遍的RTOS。值得深入研究 {:soso_e102:}这两个都很帅 本帖最后由 SS15 于 2011-12-28 15:56 编辑
悲剧了,今天测试了一下Duinos对OneWire库的支持,因为Duinos文档里面说至今未实现对它的支持。一试,果然如此,调用OneWire库后程序就凌乱了...
要么加入到开发改进Duinos的行列中去、要么自己重新实现 OneWire,要么等别人的改进
开源的东西,最大问题还是在兼容性上。比较复杂一点的东西,用起来心里还是没底... 在ourdev上看过一个RTOS,但8位机,还是忍了~~~有时序要求的操作,太难调了~ 事件驱动做起来比较简单,这个问题倒不大。
问题是有的情况下还真是需要多线程,比方说辅助线程负责界面维护,主线程负责处理运算。
线程间的数据共享,即使放在MFC下面编程也是个麻烦事要小心对待。单片机的多线程尽量不要跟这个有瓜葛
Duinos 不知道是不是停止开发了,从去年去到现在就没有动静了。Duinos实际上已经把arduino的内核设计完全给替换成它自己的了,所以和arduino体系的库可能存在较多的兼容性问题。但是 Duinos的好处在于实现多线程非常简洁明了。
不甘心又去playground当中去翻,找到个 os_wrap,这个直到目前还一直在更新维护着。粗粗看了一下,它似乎是通过对现有arduino内核的封装来实现多任务、事件驱动、消息队列以及内存管理的。程序实现略显繁琐晦涩。功能似乎比Duinos强,但是消耗arduino系统资源比较厉害。
用328的孩纸们悲剧了,os wrap 本身运行所需的RAM大概是 1.5 K,328有多少RAM呢?2048 byte。
作者也说了,等ARM核心的arduino出来就有足够的运行空间了...:lol
原以为 Duinos 出生于 FreeRTOS 是系出名门,没想 os wrap 来头更大,先是DOS环境中对 VxWork 的封装,然后又导入到 Arduino 当中
源代码注释非常详细规范! SS15 发表于 2011-12-28 22:04 static/image/common/back.gif
用328的孩纸们悲剧了,os wrap 本身运行所需的RAM大概是 1.5 K,328有多少RAM呢?2048 byte。
作者也说 ...
328有2K,不是够了吗 回楼上的,OS wrap 本身用掉大约 1.5K,那么供你程序用的就只有500来byte了...
不过还好,它还有另外两个精简版本:OS wrap Min 和 OS wrap Mini,328没准可以用
-----------------------------------------------------------------------------------
2560上,OS wrap Min 加上 OneWire库,利用 DS018测量温度,多线程测试通过。 Duinos的代码我看了,是重写了Arduino的内核部分,库也是重新写的,所以要是有新的库,就得重新实现。
从这条路上来说,工作量太大,不现实,再加上它2010年就停止更新了……
OS_Wrap再去看看,按SS15的描述,我觉得它应该是最好的选择。 额,悲剧了....:'(
前面说错了,OS_Wrap 不是来源于 VxWork,而是为了将代码移植到dos或是VxWork上的一个封装。现在,OS_Wrap又来到了 Arduino上
但是,上面所说的不是悲剧,真正的悲剧是:OS_Wrap按照我的理解,并不是一个真正的RTOS,OS_Wrap开两个线程(task)、其中一个是具有阻塞性质,非常耗时的操作,结果:整个程序就挂掉了...:'(粗略看了下OS_Wrap的实现,其多线程(它称之为task)的实现其实就是靠通过函数指针依次调用函数来实现的,这不是真正的多线程!
当然啦,如果对实时性的要求不严格,我觉得OS_Wrap还算是一个非常完善的程序框架,具备了很多诸如Windows系统中具有的特性,将会给程序总体框架设计带来很多方便,除了实时性!
Duinos的悲剧在于,它在实现它的时间片轮换机制时,应该是占用Atmel芯片中的Timer1(我没仔细研究),但是Timer1在Arduino体系当中的重要性是不言而喻的,这就造成了Duinos和N多Arduino库产生严重的冲突。甚至,Duinos在面对1280/2560这两种极其相近的芯片时也存在兼容性问题,因为它们的计时器位数是不一样的。
可能,将Duinos当中使用的Timer1换作其他定时器,可能可以解决兼容性问题,但只是可能而已。
前天用了大半天时间看了看 OS_Wrap,看了它的消息、消息队列、优先级、多任务(task)、事件、定时器,信号量没看,反正一时半会用不上。总体感觉 OS_Wrap是一个简洁、轻量级、相对安全的应用程序框架。功能很强大,使用很简单。:lol:lol
但是,它本质上还是一个传统单线程应用程序框架。它只是在应用程序级别实现了“多任务”的封装,而不是在内核级别。这样做的好处是相对安全可靠,对Arduino软件体系的兼容性非常好。缺点是它不能实现真正意义上的多线程。
我觉得,如果只是需要实现清晰优美的程序总体结构,降低程序结构设计难度,那么 OS_Wrap是一个非常好的选择。但如果对真正意义上的多线程非常渴求,那么OS_Wrap是不适合的。 难道如有的人所言,真正意思上的RTOS与Arduino就无缘了吗?我也一度如此认为。直到碰见了ChibiOS(http://www.chibios.org/dokuwiki/doku.php?id=start)
初步测试,在Arduino 2560下,ChibiOS建立两个线程,主线程点亮/熄灭LED,写串口;Idle线程实现各串口读写、OneWire总线读 DS018温度传感器、看门狗定时器、进入Idle休眠状态及唤醒、1602液晶显示、按钮读取等。
初步测试通过
相对轻量级的 OS_Wrap,ChibiOS恐怕可以用博大精深来形容了,目前我正在进一步研究中。
SS15 发表于 2011-12-31 01:36 static/image/common/back.gif
难道如有的人所言,真正意思上的RTOS与Arduino就无缘了吗?我也一度如此认为。直到碰见了ChibiOS(http://ww ...
楼主能否写一写如何将该os移植至arduino的?进程堆栈的切换怎样实现的? 大顶楼主
正郁闷A板抢占式带优先级任务的设计问题
好好研究下 SS15 发表于 2011-12-31 01:36 static/image/common/back.gif
难道如有的人所言,真正意思上的RTOS与Arduino就无缘了吗?我也一度如此认为。直到碰见了ChibiOS(http://ww ...
nil 就很不错了。
页:
[1]
2