打印

小菜之单片机多任务系统"RTOS"与"裸奔"之论

[复制链接]
9944|47
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
singleywy|  楼主 | 2010-10-12 22:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 singleywy 于 2010-10-14 09:43 编辑

我发这个贴子,一想让自己的作品单片机多任务操作系统os_mini_short_v1.1(前一版本为os_mini_short_v1.0开源,让大家共同学习,单片机实时多任务思想,让裸奔单片机体现它的多任务优越性,尽管裸奔有它的好处,实时性似乎相对来说比较高,编写简单,但是裸奔中的任务具有时间的不确定性,以及运行形态的不确定性,我想大家用的大多系统莫过于前后台,像前后台这样的系统,切换速度快,没有任务来回调度那么麻烦,不过,大家都知道,既然是前后,那么前台的任务必须代码要小,速度要快,否则会影响后台的任务,其次是,一般情况下只有一个前台即必须依靠状态机思想来软件模拟多个前台(其后果是,前台的时间运行时间过长),或者使用多个定时器来创建多个前台),当然不排除这样的情况:很多人在一个项目中做的任务不多,相对简单的项目,根本没必要操作系统,直接裸奔,或者利用前后台就足矣!但,当我们遇到了多任务,又要保证任务之间相互影响较小,同时要保证任务的运行的确定性,我个人觉得还是用RTOS比较好,说到这里大家要拿砖头砸我了,会说你看那个什么LINUX,ucos,vxworks等等,那些东西,往单片机摞,就占了大半江山,你说还能运行什么任务,当然,那些系统是为了应用而全面设计的,然而我们在应用中有必要用到它的全部功能吗,至少,我们不肯能将所有的功能都用上吧,所以我们要做的是裁剪,或者,选择功能我们需要的,或者选择功能简单的RTOS,如果这样的话,系统生成的代码将大大缩小,因而一般人喊单片机上系统太占空间了,只是没有进行功能选择,或者代码优化,比如网上有关MSP430类UCOS的操作系统,按自己的需求,最后仿造编写成了尽有300左右的代码,仅占几十字节的RAM,而相对2KRAM,这几十字节的内存又算什么呢,当然还没有算术任务堆栈部分,不过即使加上了,又能增加多少,所以最后我想说的是,让单片机不在畏惧RTOS,重要在于个人,在于项目的复杂程度


另外说明一下:后面有我的测试图,请大家看看

相关帖子

沙发
singleywy|  楼主 | 2010-10-12 22:31 | 只看该作者
呵呵,个人己见,有所不对之处,请敬请指出,本不不爱砖,但带拍砖

使用特权

评论回复
板凳
X-Hawk| | 2010-10-12 23:00 | 只看该作者
这个我写的,开源免费:
http://code.google.com/p/tinythread/

支持芯唐NUC100的Cortex M0
Supports recursive mutex, semaphore, condition, message, thread priorities.
Can avoid priority inversion by mutex
Absolutely no dynamic memory allocation.
Small memory footprint ( little than 4K for a basic multithread program. )
Supported chips: Cortex M0

使用特权

评论回复
地板
xixihaha0| | 2010-10-12 23:01 | 只看该作者
赞同,如果项目复杂,可用RTOS,简单何必费那么大的劲?

使用特权

评论回复
5
c+++| | 2010-10-12 23:23 | 只看该作者
其实这个问题不在于 os 本身, 而是在于所用的 mcu 以及所要完成的项目本身。
     如果 mcu 具备了 2K 以上的内部 RAM, 而且项目具备了一定的事务复杂度, 那么可以考虑使用 rtos。 否则, 就必须考虑为了软件上的处理便利而牺牲一定的 ram 与 rom, 是否有必要。很多人使用的是 8051 系统, 8051极其有限的 ram 以及有限的硬件堆栈和效率低下的外部ram access, 不适合放入一个 os, 为了贪图一定的软件便利而去扩展外部存储或是使用特别型号的处理器, 并不是一个好主意。
    我不赞同 lz 裸奔中的任务具有时间的不确定性,以及运行形态的不确定性, 首先, 这样的的表述具有语义的不确定性, 其次具有认知的不明确性。一般人使用rtos 后的程序一般会比一般人使用裸奔更良好, 但这并不适用于高手, 在 mcu 层面上, 裸奔高手能设计出更良好的程序结构。 LZ 应该搜索以前的帖子, 看看裸奔高手们的设计思路。

使用特权

评论回复
6
ayb_ice| | 2010-10-13 08:36 | 只看该作者
如果对嵌入式软件任务的实时性要求高
一般直接在中断中完成

使用特权

评论回复
7
singleywy|  楼主 | 2010-10-13 12:47 | 只看该作者
5# c+++
我强调的也并不是OS本身(前面也已强调),而是针对的项目需求,单片机类型,以及个人需要,您依然在强调,当遇到的项目具备一定的复杂度,且MCU空间要满足一定的空间才能用OS,然而这两个条件本身并不存在着必然的联系,一般来说,当项目复杂时往往伴随着RAM的增加,但是,我在前面的言语中已经提及到,是否真的要把所有的OS,都搬移到MCU上来,全部搬来那运行起来肯定拖泥带水的,所以,我主要强调的是裁剪性与优化(在项目具备一定复杂度的大前提下,重点在这里),而不能单单拿来主义,那当然自讨苦吃继而喊道MCU运行OS真的不给力呀,因此在这样的大前提下,是否能够用OS,以及是否能否用好OS,这完全在于个人,而不是OS会占用多大的问题;其次,8051,真的不适合用系统么?不知您是否用过,或者直接拿来主义,说这么小的芯片用RTOS,未免太......然而事实的情况真的是这样的么,您自己是否针对项目亲自写过系统么?那为什么还有很多人在使用嵌入式操作系统呢,比如RTXTINY,FREERTOS,正因为它依然具有一定的优越性,操作系统可以针对项目情况,自己编写,或者将别人的进行裁剪,照样可以达到只占小部分空间的目的.....

使用特权

评论回复
8
singleywy|  楼主 | 2010-10-13 12:55 | 只看该作者
6# ayb_ice
恩,比如实时性要求高的串口通讯,外界中断处理等,这些可能要求系统要随时处理,必须要高的实时性,因而一般情况下放在中断中最合适,当然也存在弊端,当系统意外进入了临界区,或者优先级高的中断尚没有完成,呵呵,这里的矛盾很多,矛盾嘛,无处不在,只有减小矛盾的影响,但不能从根本上消除矛盾

使用特权

评论回复
9
singleywy|  楼主 | 2010-10-13 13:07 | 只看该作者
  我不赞同 lz 裸奔中的任务具有时间的不确定性,以及运行形态的不确定性, 首先, 这样的的表述具有语义的不确定性, 其次具有认知的不明确性。一般人使用rtos 后的程序一般会比一般人使用裸奔更良好, 但这并不适用于高手, 在 mcu 层面上, 裸奔高手能设计出更良好的程序结构。 LZ 应该搜索以前的帖子, 看看裸奔高手们的设计思路。
c+++ 发表于 2010-10-12 23:23

呵呵,我没说裸奔不好呀,裸奔高手无处不在,利用前后台,状态机思想,照样可以写出高效实时性高的代码,您误解我的意思了,我不是有意在比较这两者的优越性,因为这两者各有千秋,我上面说的只是裸奔的部分缺点,因为裸奔系统中的任务,覆盖的范围比较广,所以我用笼统的语义来涵盖了它,我在这里阐释一下,时间的不确定性,并不是宏观上的不确定,通过系统时钟来决定任务是否运行,这样的任务在一定意义上是确定的,但是,我说的不确定性是,比如在主程序的大循环中,什么时候运行到它的时间是不确定的,它什么时候能立刻响应是不确定的,当条件满足时能否立刻运行,是不确定的,不包括中断中的任务

使用特权

评论回复
10
singleywy|  楼主 | 2010-10-13 13:09 | 只看该作者
呵呵,再补充一句,两者是共存关系,不是互斥关系

使用特权

评论回复
11
singleywy|  楼主 | 2010-10-13 18:08 | 只看该作者
...........................?

使用特权

评论回复
12
aceice| | 2010-10-13 21:02 | 只看该作者
定时器设置各标志位,主程序根据标志位运行任务。
中断优先级设置好。
全局变量通过专用函数传递参数。
----------------------------------------------------
对于大多数项目都应该够用了吧。

使用特权

评论回复
13
singleywy|  楼主 | 2010-10-13 21:08 | 只看该作者
12# aceice
在没学OS之前就这样操作的,呵呵,不过我发现的是自从用了OS之后,一切都显得傻瓜化了,没有必要考虑更多的细节,将精力更集中地开发应用软件上

使用特权

评论回复
14
singleywy|  楼主 | 2010-10-13 21:09 | 只看该作者
同时,这也是状态机思想的一部分

使用特权

评论回复
15
xiepengchenghn| | 2010-10-13 21:17 | 只看该作者
mark

使用特权

评论回复
16
c+++| | 2010-10-13 21:59 | 只看该作者
我也不是说os不好, 只是想平衡一点。lz既然做过一个os, 想必清楚os在8051上不同任务转换过程中的耗时。8051的堆栈太小, 只支持到256, 如果把任务堆栈放到内部ram里, 会挤占任务的ram, 放到外部ram里, 又失去了push pop指令的性能, 更恼火的是8051的movx效率低下, 任务转换耗时可以达到毫秒级, 这样的os还有什么实际的意义。想问lz是如何处理任务转换耗时的问题?

使用特权

评论回复
17
fzu_csc| | 2010-10-13 22:03 | 只看该作者
汇编基础太差,看LZ的OS全是汇编,只能敬而远之....

各位大虾在51上用的OS都是自己写的么?如果用的是开源免费的,那么哪个能推荐下么?
陈明计的如何?如果是协作式OS,RAM应该会节省很多,有哪个可以推荐?

使用特权

评论回复
18
huangqi412| | 2010-10-13 22:16 | 只看该作者
全汇编,估计就木多少人又兴趣了。

使用特权

评论回复
19
singleywy|  楼主 | 2010-10-13 22:21 | 只看该作者
16# c+++
呵呵,任务切换做的好可以只有几十US,优化的不好需要进1MS,我试过多种任务堆栈的管理方式,一,动态任务堆栈管理,其中需要代码的搬迁,因而消耗了大部分时间,不过堆栈的利用率比较高,耗时一般在1MS左右,这会因任务的多少而增加或减少,二,固定的任务堆栈管理,每一个任务分配一个固定的私有堆栈,可以不相同,在设立一个任务队列来保存每个任务TASK_SP,其次是为中断独立分配一个堆栈INTERRUPT_SP,
这样任务切换时,直接切换SP,就可以了,所花费的时间仅在几十US,如果,任务进入中断中,SP指向中断的堆栈空间,返回任务再指向任务的SP就可以了,这样可以节省很大的空间

使用特权

评论回复
20
singleywy|  楼主 | 2010-10-13 22:22 | 只看该作者
17# fzu_csc
我在帖子中说明的是另一版本的RTOS,不是原先那一版本

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

295

帖子

3

粉丝