原创 裸奔的双任务系统-嵌入式微系统连载之十一

2014-8-24 17:21 2034 16 6 分类: 消费电子

2014年春节里的一天上午,msOS QQ群里面讨论的很激烈,“传说中的火*手”认为msOS-Mcu51已经很好了,对于msOS-Stm32引入uC/OS-II意见比较大。虽然他也用过uC/OS-II,但并不喜欢,有一种不确定感,所以很喜欢裸奔。但他的观点受到群内不少RTOS用户网友的反驳,以“独钓千古愁”为代表,持续了将近半个多小时,我一直在旁围观。


通过这次辩论,双方都把各自的观点表达的非常清晰、明了。RTOS有它的优点,但确实存在很明显的缺点,这个无可争议,尤其是大家提出RTOS的几个问题:


1、 带RTOS系统,不便于移植,这个对msOS的跨硬件平台推广是很不利的。
2、 嵌入式工程师,往往有强烈的掌控欲,而理解透彻RTOS有一定的难度,有一种把握不住的感觉而拒绝RTOS。
3、 现实中绝大多数嵌入式项目,只要通过合理的设计,不需要RTOS。
4、 带RTOS的系统,在任务调度时进入临界态,这个时候无法响应中断,不适合应用于实时性要求高的地方。


以上四个原因,让我认识到需要推出一个msOS的无RTOS版本,但还要实现类似RTOS的双任务功能,把业务逻辑与菜单界面分离。在讨论中,“传说中的火*手”有一句话提醒了我,他提到他自己有一套类似MS3(msOS的前身)的架构,他用了一个中断处理各种消息,而这个时候,我也在想着如何改造uC/OS-II的任务切换软中断,实现双任务,思路完全一致,他的话说明了这个方案是可行的。


后来的一段时间,忙着msOS文档,进一步完善msOS代码,一直没有着手写。直到三月份才开始按照软中断方式,粗粗的写了一个无OS的双任务版本msOS,实现了这个功能,但因为当时对Stm32的中断系统理解不深,所以放到群内让大家一起分析,寻找bug,这个时候,“独钓千古愁”对无OS版本msOS提出了很多建议,并且直接在这个版本基础上修改,完全的丢弃了汇编代码,移植非常容易,其中部分处理方式引用了他跟“传说中的火*手”交流时提供的代码。我再在“独钓千古愁”提供的版本基础上进一步优化,统一风格,定型后在群内发布,当“传说中的火*手”看到最终版本,就觉得有他的影子存在。


这个无OS版本的msOS,最终的命名是“Tomsu”起的,他参考软件的命名习惯,因为这是一个无OS简化版本,所以推荐为msOS-Lite版本,Lite的意思是“精简”。可以说,msOS-Lite版本,是整个msOS群大家参与讨论出来的,虽然有几个相对重要的网友积极推动,但其它网友的贡献是不能抹杀的,集体的力量是强大的。我对这个版本非常满意,因为它准确的反应了msOS理念:简单、易用。


无RTOS实现双任务,甚至多任务,本质上讲跟RTOS方法类似的,只是RTOS是把一个main大循环斩成多个具有优先级的小循环,消息触发决定在最高优先级的小循环中执行。因为是小循环,死循环,一直循环下去,所以必须要有触发进入条件和等待资源挂起条件,否则这个小循环一直执行下去,别的小循环就执行不了了。


无RTOS版本多任务,把中断看作是任务,因为中断优先级高于main大循环,建立一个最低优先级的,可以被消息触发的软中断来实现任务,但因为在中断中,所以建立的这个任务不是一个死循环,而是执行完毕就跳出的。而这一点恰好符合msOS的业务逻辑中的消息机制,执行完消息就退出的特点,不需要死循环等待在哪儿。


多个中断,就实现多个任务,尤其是systick系统节拍中断,有很多事务在系统节拍中例行处理,类似任务,虽然这个任务不是严格意义上的,功能不强大,但够我们用了,尤其是对msOS来说,只需要两个任务,恰好合适。


为了跟uC/OS-II兼容,选择了软中断PendSV,把优先级设置为最低。
            

53a3d2a08d27f-thumb.jpg


其次,宏定义形式定义软中断PendSV的触发指令,只要EnterInterrupt这个宏指令被调用,就激活PendSV中断。这部分代码“独钓千古愁”和“传说中的火*手”提供的,写的非常好,原来这部分在汇编中的,移到了C语言中,这样子msOS-Lite就没有了汇编代码。
           

53a3d2a0a20a9-thumb.jpg


再次,编写PendSV的中断响应代码,考虑到有多个消息源同时抛出消息,但响应中断只有一次,所以在中断响应中必须要把消息队列中的消息处理完,否则会导致后续的消息因为中断此前被占用而不会再次产生中断标记而无法重入的问题。这儿增加了CheckMessage函数来实现。

 

53a3d248ec634-thumb.jpg         


最后,改写抛出消息入队列函数,调用EnterInterrupt触发PendSV中断。

 

53a3d2a0a1fdd-thumb.jpg          


至此,无RTOS的msOS-Lite版本完成,非常感谢msOS QQ群的所有网友的支持与合作

文章评论4条评论)

登录后参与讨论

用户1406868 2014-9-14 22:20

把这个东西搞好的话, 51的内核就好玩了。

用户1166758 2014-8-26 16:58

瞧瞧

用户1678053 2014-8-26 09:55

看看

用户1602177 2014-8-25 15:21

好有气氛~~有这样一个群,相信博主很骄傲吧~~

用户1657263 2012-11-12 14:04

教你如何分析和排除电缆故障

用户1657263 2012-7-27 09:44

电缆故障排除方法

用户1657263 2012-7-23 09:22

电缆故障排除方法
相关推荐阅读
凤舞天 2019-01-20 20:07
运放的压摆率与增益带宽积,到底是怎么个关系?
今天在ADI上寻找一颗高速运放,但是看了ADI的运放列表,把我弄闷了,到底是选择压摆率高的还是增益带宽积大的。如下图:LT6275是40M增益带宽积,但是压摆率却到2.2K,非常高,相反LT6203X...
凤舞天 2019-01-13 12:53
雨滴慧目图像识别项目的产品定义过程详解!
需求来源:      俊知焊齿机的合金刀头上料机构,采用基恩士的光纤激光识别,对于一些对称性比较强的合金刀头,容易误判,所以高端的焊齿机采用价格昂贵的图像识别系...
凤舞天 2019-01-01 19:50
半导体空穴到底怎么导电的?
我们熟悉的半导体材料,常用的是P、N类型的,硅(SI)中掺杂元素硼(B),因为B三价,相对于SI的4价来说,缺少一颗电子,把这个缺失的部分叫做空穴,这类掺杂B的叫P型材料。对应的,掺杂了元素磷(P),...
凤舞天 2018-12-22 22:13
孩子的教育不应该只是学习,更应该是去挑战
大家会发现,很多优秀的知识分子,自己水平很高,但是自己的孩子却教不好,很多老师的孩子,小学成绩很好,初中也不错,但是到了高中,大学之后,很多走向平庸,这个似乎违背我们的认知。现在自己有小孩了,也面临知...
凤舞天 2018-12-01 11:34
MOS管应用概述(四):基本参数
mos管的基本参数,大家熟悉的必然是Ids电流,Ron导通电阻,Vgs的阈值电压,Cgs、Cgd、Cds这几项,然而在高速应用中,开关速度这个指标比较重要。上图四项指标,第一项是导通延时时间,第二项是...
凤舞天 2018-12-01 10:36
努力之前请先学会思考
公司这么多年下来,有一些人一直很努力,也很听话,让他做什么就做什么,然而一直以来他们很少自己主动做事,挑头做事,往往都是打个下手,听命令行事,一天无忧无虑,看看手机上上网,乐呵呵的,估计睡觉很容易睡着...
我要评论
4
16
关闭 站长推荐上一条 /2 下一条