msOS的需求来源-嵌入式微系统连载之三

2001年我大学毕业后去了中科院半导体所工作,第一次真正接触了MCU51下的C语言开发,项目组要求项目中的功能尽可能封装成一个个的功能子函数,便于维护,所以一个项目就是由各个功能子函数组成的。但我因为在所里时间较短,没有真正参与其中,只是接触了这个概念,觉得这个非常好,也在自己心中暗暗的下了一个决心,今后要建立自己的函数库,以方便项目开发。

 

2002年我来到深圳做手机软件开发,采用英飞凌手机解决方案,有一套标准的软件架构平台,RTOS采用Nucleus,GUI等其它部分都是英飞凌自己完成的,当时国内山寨手机行业还没有开始,所以这套手机解决方案还不是很完整,功能比较少,但就是因为不完整,功能少,很多还需要我们自己开发,所以让我有了更深入的了解整个软件架构的机会。

 

 

我负责的是手机驱动部分,所以可以比较清晰的了解整个手机的软件架构,代码是如何组织的,加上原本就是做硬件的,所以相对较快的完成了工作,在手机公司呆了半年之后就有比较多的空余时间,想着把MCU51熟悉一下,把基础打好,便于开发一些小项目,于是采购了一套周立功公司推出的MCU51开发板:DP-51开发板。
按DP-51开发板提供的例子如GPIO、串口、按键等走了一遍,基本上熟悉了MCU51芯片的特性,对MCU51的编程就不再神秘,但是这种一个个例子,一个个功能子函数的方式,已经瞧不上了,毕竟之前是做手机方案的,于是就想着如何借用手机的平台架构思想,把这些功能函数都整合起来,形成一套基于MCU51下的软件开发平台。
手机驱动开发中,经常用到RTOS提供的系统节拍,5ms一次,用来处理一些例行程序,觉得很好,于是把这个功能引入到软件平台中,把MCU51的定时器2作为系统时钟来处理。手机软件中还有一个非常好的东西就是软件定时器,因为硬件定时器只有非常有限的几个,比如MCU51一般只有三个硬件定时器,一个用于系统时钟,一个用于串口通讯,只有一个了,若需要处理超时、动画、闹钟等,根本不够用,所以需要用软件扩展出很多个软件定时器,一般基于系统节拍来扩展,所以把这个软件定时器功能引入平台。虽然手机中有Nucleus这个RTOS,但是被封装了看不到,所以那个时候对RTOS的特性并不了解,实际手机开发中也感受不到它的存在。而RTOS中常见的消息机制也不是从手机平台中认识的,而是源自大学时期的VB编程,觉得事件触发这种方式非常好,点一个按键,点一下鼠标,产生一个事件,于是把VB中的事件处理方式,也就是消息机制引入平台中。
消息机制、系统节拍、软件定时器,再加标准的前后台,构成了一个基于MCU51下的软件开发平台:实用单片机系统(McuSystem,缩写为MS)。第一版2003年放到网上共享。从今天角度来看,这个简陋的不能再简陋的,命名规范一塌糊涂的软件平台,竟然被不少MCU51初学者所喜欢,经常发邮件询问一些问题。这个事情让我明白,自己的水平虽然不怎么样,但接触的东西相对高端,还有太多的不如我水平的人,他们很需要指点入门。于是在经历几个项目进一步完善软件功能之后,对MS1做了精简、优化,去掉了指针等相对难一些的东西,专门针对初学者,让他们非常容易看懂,这就是MS2。在MS2的基础上丰富了功能,引入了指针,针对中级用户的,变成MS3,应该说MS3的客户群体最多,深受网友喜欢。

2011年,我设计了一款6KW高频感应加热设备(简称高频机),高频机是一款典型的中低端嵌入式项目需求,实时性要求高,工作要求稳定可靠,128*64黑白LCD屏显示界面,高速中断响应,高低速例行节拍处理,业务需求处理,如下图:

 


    
硬件上考虑到MCU51速度已经不够用了,所以升级为Cortex M3。软件上因为存在高低速处理需求,一开始想着引入uC/OS-II实现多任务处理,但那个时候对于RTOS了解不多,又没有用过,细节点太多,一个处理不好,可能会引起高频机炸机,所以心里没有把握,最后在同事的建议下放弃而选择了自己擅长的MS3,只是把MS3移植Cortex-M3中,增加了一些菜单界面编程的功能及多级速度系统节拍功能。
项目开发过程中开始感觉到MS3架构的设计已经无法满足这类功能相对较多,菜单界面相对复杂的需求,尤其是用传统的状态机或者是函数指针来实现的菜单界面编程已经超出了这个框架的能力范围,修改或者扩展功能相当复杂,有时候连自己都会搞晕,编程相当痛苦。虽然如此,这个项目还是一步步的完成,产品也稳定批量生产了。
项目转变为产品之后,需要找一个人来接手,解放自己去开发新的东西,这个时候却发现接手人虽然反复看了多遍,自己也跟他讲解了多遍,但当客户有需求需要微调整菜单界面的时候,他往往无从下手或者经常犯错误,传承性非常差。
在高频机市场化获得成功之后,客户对我们的研发信心非常之高,要求围绕客户的机械自动化设备开发周边的电子设备以降低成本,主要有电源类设备如高频机、火花机,传感器类设备如红外温度传感器、激光测距仪、接近开关,驱动类设备如步进电机、伺服电机等,控制类设备如PLC。面对这么多种类的不同需求,需要很多人协同开发,若还是按MS3架构设计,则已经无法满足客户需求,那么新的软件架构平台,该如何设计?

中低端嵌入式软件平台的困局-嵌入式微系统连载之二

嵌入式领域有不少操作系统,大致可以三类:第一类以Wince、Linux、Android为代表的,属于大型操作系统,拥有内核任务调度、菜单界面、多媒体、网络、文件存储、外设驱动等一系列完善的功能,但这类操作系统属于非实时操作系统,往往用于办公、娱乐、人机接口等对时间要求不高的场合。此外因为功能太完善,对硬件的要求很高,最低配置CPU需要ARM9 200MHz,内存需要32MByte,支持MMU内存管理单元,标配彩屏。
第二类以VxWorks为例,属于功能丰富的嵌入式实时操作系统,功能丰富。往往用于高实时、高可靠的军工、航空航天、工业自动化领域,对硬件要求也比较高。
第三类以uC/OS-II,FreeRTOS为例,只有一个抢占式多任务实时操作系统的任务内核,此外还提供一些内核管理的函数接口及必要的扩展功能,其它的功能库如菜单界面、网络等都需要自己扩展,这类操作系统主要应用于中低端小型的项目中,成本要求高,需求多样,但一般不是很复杂,实时性有要求,但不苛刻,往往都是消费类或者一般的工业自动化设备,比如白色家电的控制系统、小型监控、传感器的测试平台、仪器仪表、小型工业自动化领域取代PLC,降低成本等等。
中低端小型项目,一般都是基于MCU51、ARM7或者现在的CortexM3、M0开发。简单的项目,软件最常用的是前后台系统,也叫裸奔,紧急响应用中断,低速处理在main大循环中执行。稍微复杂一点的在前后台系统的基础上引入了系统节拍,执行一些例行的事件,这个也叫时间片编程方式。再进一步是引入消息机制,实现消息机制编程方式。再复杂一些就引入uC/OS-II等RTOS,实现多任务编程,简化编程难度,但同时因为引入了RTOS,需要充分了解RTOS的特性,所以对编程人员的水平要求比较高。

 


苛刻的成本、需求的多样性,导致目前没有一套比较完善的操作系统统一这一方面的开发编程,哪怕是uC/OS-II等RTOS内核,也需要根据实际项目需求来配置、裁剪,增减不必要的软件功能。
此外,中低端小型项目,技术难度相对较低,所以嵌入式人员的入门门槛较低,这个本身是好事,然而也就是因为入门门槛太低,又没有一套统一的编程规范,导致编程的随意性很大,一个公司十个编程人员,有十套不同的编程方式,相互之间检查、维护非常困难,而小型企业的人才流动相对较大,软件负责人离开后,继任者因为编程的思维方式不同,往往看不懂前人的程序而废弃再重新设计,这样导致代码质量一直在低质量的重复循环,也极大的提高了公司的软件成本。
项目继承性这种情况在高校、研究所中尤为突出。比如一所研究所的主业是做传感器,但为了测试这款传感器必须要搭建一套嵌入式测试平台,若用WINCE、Linux等开发平台,需要一个嵌入式团队来开发,投入很高,维护很难,副业变成主业了,若是自己搭建一套完善的通用测试系统,既没有这个能力,也没有这个精力,所以一般都是针对性的设计这款传感器的测试系统。因为高校、研究所的学生经常更换,后来者看不懂前人的代码,又不得不重新设计。
中低端小型项目,需求虽然多样,虽然无法用一套操作系统去统一开发,但是我们可以把这些分为几类,比如彩屏的消费类、黑白屏的工控类、数码管显示的微控制类等等。这几年国内有一款比较出名的开源嵌入式操作系统叫RT-Thread,编程风格类似Linux,在OS的基础上集成了GUI、文件系统和网络功能,不少用户把它应用于消费类行业。而最新发展起来的一款开源嵌入式微系统叫msOS,采用微软的C#风格,侧重于平台架构,可以灵活组合,简单易用,目前整合了uC/OS-II,集成了128*64黑白屏的GUI、参数日志存储、PID算法库和步进驱动库,定位于仪器、仪表、小型工业自动化领域,msOS的中文名就叫嵌入式微系统。

何为嵌入式微系统-嵌入式微系统连载之一

嵌入式微系统,顾名思义就是嵌入式微型操作系统,然而操作系统一词在嵌入式行业里往往专指uC/OS之类的带任务切换的系统,所以为了有别于这个专用名词,往往用开发平台一词来代替,所以嵌入式微系统更准确的名字为嵌入式微型开发平台。
大家肯定会问,uC/OS这样的嵌入式操作系统跟嵌入式微系统到底有什么区别,那么我们就要从项目需求开始说起。
某个公司需要在嵌入式芯片(MCU51或者STM32)上开发一个控制项目,涉及LCD界面、多种不同接口速度的外设、多种不同速度的业务逻辑控制,下图为常见的一种工业自动化项目需求。

 

    
作为项目负责人,首先要分析清晰项目需求,假设这个项目有点复杂,涉及多路采样及多路PWM输出,所以选择STM32之类的高性能处理器,之后再考虑软件设计。
这个项目设计到多路输入传感器及多路输出,有高速的业务逻辑控制,也有低速的菜单界面,为了把低速的菜单界面与高速的业务逻辑分开独立编程,所以引入嵌入式操作系统,比如uC/OS,会方便程序设计。
uC/OS除了任务切换功能等有限的功能外,没有别的,所以其它的东西还是需要我们自己添加,菜单界面就是一个。界面编程里面,简单的界面用状态机还比较容易编程,但若涉及到稍微复杂一点的界面,传统的状态机编程思想就完全不适合了,代码很难维护修改,为了提高可维护性,需要引入一个标准的菜单界面编程库(GUI),虽然现在网上也有不少,但适合自己的却很难找,往往需要自己编写一套菜单界面库,这个工作量很大,难度也很难,最后往往退回到传统状态机菜单编程方式。

其它的硬件相关的设备驱动库,都需要自己来完成,比如按键、串口、步进驱动等等。若这个项目需要多人协同开发、长期维护,则还需要制定架构标准,一些接口规范,命名标准,而这么多的要求,对于大部分的小、微型企业的嵌入式项目负责人来说,要求太高了。所以最后这个项目负责人,往往自己一个人埋头苦干,什么标准什么规范都没有,经过较长的一段时间开发加上后期的修修补补,项目勉强的交差了。然而当这个负责人离职的时候,面临着无人接手的窘境。
我们再看消费类电子产品的开发模式,以MTK6225功能手机为例,RTOS采用Nucleus,菜单界面软件库采用PlutoMMI,此外还需要多媒体、文件系统,电话本、短消息等中间件,之后是各种硬件设备驱动,整个软件架构类似ARM公司提倡的CMSIS架构。

 


MTK提供了整套硬件参考设计、PCB设计、生产流程、测试流程,软件开发标准。客户通过不长的时间培训即可掌握手机的开发设计,一般10来人的手机设计公司,在具有一定的手机设计经验的基础上,只需要2、3个月就可以设计出一款MTK提供的参考手机,之后公司基于这个参考手机做硬件上的机型改进及软件上的界面调整即可。到了Android时代更是简单了,因为Android软件属于通用软件,所以软件更是不需要培训了。
其他消费类电子,比如以前的VCD、DVD、MP3、MP4等等,都采用类似的方式,只有采用这种方式,源头厂家才可以快速的切入市场,并且可以同时管理、维护很多下游客户,比如MTK的下游山寨手机公司上千家,大的手机厂家也有近百家之多。因为采用了标准的设计模版,应用开发、客户维护人员都不是很多,尤其是维护人员,大大降低,获得高额的利润。而因为采用标准通用的软件架构平台,迅速的培养了大量的通用手机软件人员,而这些软件人员都可以在各个手机公司立即干活,不存在更换一个公司之后还需要培训的问题,这样下游厂家也不需要担心人才流动引起的工作交接问题。

 

从以上例子可以看到,通用标准化的开发设计,带来的好处是巨大的:提高了开发效率、缩短了开发周期、便于产品长期维护,容纳更多的下游客户。

本文为连载性质,每周一篇,总计十二篇,应与非网邀请撰写,首发于与非网。

msOS到今天已经完善,也有大量的实际使用例子,比如PID算法库、步进驱动库及扩展大屏幕串口屏等,非常适合于工业场合,形成了一个控制体系。很多网友基于msOS应用于自己的项目中了。

做自己该做的事情

经常听到很多企业负责人说自己一天到晚的忙、累,不否认创业初期的企业,确实是如此的,但是创业好多年了,公司人员也有好几十人的公司了,老板还是忙的跟牛一样,有些说不过去了。

有一句话叫:赚钱不辛苦,辛苦不赚钱。多年后还很忙的老板,是要拿这句话来反思一下。

我见过不少老板确实很忙,尤其忙着帮下属做事情,抢着帮下属做事情,因为怕出错,怕损失,怕效率低下,于是他就成了超级大忙人,所以能力也被锻炼的出类拔萃的,因为抢了这么多工作,不熟也熟了。这样一来,他本来就比下属强的能力,又进一步的加强,而下属因为没事做,只能原地踏步,甚至退化,两者的距离不停的拉大,于是老板见人就说:现在的年轻人啊,比以前的人差的太远了,太懒、不主动、不认真、也不好学,很是摇头,于是就更不敢招年轻人了,哪怕实在没办法找上一两个,也是很警惕的防着,怕出错。

老板这么的忙着,自己的能力不停的提高,环视公司一堆人,心中却无一人可用,暗暗叹气,世道的不好,教育的失败,尽显孤家寡人。

然而这类的公司有一个奇怪的特点,老板虽然这么的能干,业绩却很难提高,到了一定程度就停滞不前了,除了几个老板的亲信,其它的员工往往跟老板对着干,内耗很大,老板像防贼一样防员工。尽显猫和老鼠的游戏。

我从09年开始经营一家小公司,到现在五六十号人,虽然还不大,但一路过来,不曾感觉很累,反而觉得比较轻松,尤其最近2、3年,都在家里研究自己喜欢的技术,再写写文章、书,去学校讲座什么的。跟公司呢,定期见面沟通交流一下,其它就通过QQ群沟通,解决他们碰到的一些技术和管理问题,这样子大家都觉得比较舒服,管理上也显得宽松,没有人时刻盯着干活,大家的主动性很强,公司自然不会有大的问题。

这段时间我不停的反思,我为什么相对于其他类似的老板来说,可以做到轻松一点,虽然今天我也没有做的多大,但是轻松一点确实是做到了。

思考再三,我认为有两点:1、我不会去抢我下属的工作,是他们要做的东西,我尽可能的教会他们做,哪怕他们做错了,我还让他们继续做,直到他们会为止,公司为他们的失败和前期的低效买单。2、我自己不停的学习,包括各个部门的技能和相对前沿的技能,尤其是系统性的技能,自己去引入或者搭建平台架构,架构搭建的越好,可以容纳更多的同事来开发,效率大大提高。他们熟悉后,自己再去开拓新的平台架构。这些架构可以是进销存、财务、软件平台和硬件平台。

以上两点根本上讲,就是强调公司的培训,只有基于培训、教育,每个人的技能都提高,才能放手给别人做。技能的提升,也就是效率的提高,产品质量的提高,产品技术含量的提高,这些基本的因素提高了,公司也就自然壮大了。

从扩散角度看电磁场

下图为的平板电容器的电场模型图:

330457

红线为正极电板,下面黑线为负极电板,蓝色带箭头线为电场。那么,这个电场是怎么扩散出去的呢?

我们很自然的想到在我们生活中,存在各种各样的扩散现象,比如水滴落到地面的扩散,不同密度的气体的扩散等等,这些扩散,都是基于一个基本理论基础,牛顿定律:F = M * A,在力的作用下对水分子或者气体分子产生加速度。扩散的快慢取决于力的大小及质量的大小。

我们把这个平板电容器,接上电阻负载,如下图模型:

330458

         我们试着从电荷的扩散角度解释电路问题,正极因为缺少电子而表现为正电荷,负极因为有过多的电子,而表现为负电荷。越靠近电容端,电荷密度越高,同种电荷相互排斥,相反电荷相互吸引,所以存在扩散基础,通过扩散电荷实现了电流。

         以上这个解释,属于经典物理的解释,比较容易接受,实际上,这样的观点,也可以起很大的作用,起码让自己不惑,可以解释很多现象,比单纯的电路回路概念,提高了一个等级。因为这个扩散模型表达了信号是从源端到负载的过程,更接近电磁场理论了。常规的电路理论,脑子中,电子是从负极出来经过负载再回到正极,走一圈回去。

         但是,以上的电荷扩散模型存在一个致命的逻辑错误,那就是,电荷,也就是电子存在质量,而我们都知道,信号的建立是光速,而要想达到光速,质量必须为零,所以,基于电荷的扩散模型,跟理论冲突,不符合实际。

         那么这个模型中,那个东西是不存在质量的呢?那就是电场,电场是不存在质量的,所以具备达到光速的可能。但是又有一个逻辑问题,那就是,电场的质量为零,加速度应该是无限的,最终速度应该是无限的,为什么是光速定值呢?

         我们再看物理学,有一个很有意思的现象,所有的公式,都是一个“等式”,自然界不存在“极点”,无穷大,那么既然电场的质量为零而导致加速度无穷大,速度无穷大,这个不符合自然界特点,所以,自然界必须引入另一个质量也为零的场,而这个场与电场的特性恰好相反以解决无穷大问题,这就是磁场,电场与磁场满足安培定律和法拉第定律,相互约束。

         电场与磁场是一阴一阳,相生相克的,如同男女,相互支持,相互约束,以近20年为一代的速度繁衍生息,而电场与磁场呢,恰好以速度C向前推进的时候,电场与磁场取得平衡,可以理解为速度C就是电场与磁场推进的平衡点,这个很类似L、C谐振回路的谐振点,只是普通的L、C回路,电场和磁场分别约束在L与C中,能量在一个维度上来回震荡当电场能量最大时,磁场能量为0,当磁场能量最大时,电场能量为0,可以认为两者相位相差90度正交,而电磁场,电场与磁场分布在三维空间上,电场与磁场为90度正交场,运动方向在第三个维度上,因为空间上电场与磁场已经成正交90度了,所以运行时,两者同相位运行,同时最大,也同时最小,以正弦波的方式向前运行。