15岁开始接触计算机编程,18岁学习C/C++编程,迄今已十多年有余,并参与大大小小几十个项目的开发及维护。涉及工业自动化、嵌入式计算机以及逆变器等领域。尤其擅长RTOS,如uC/OS-II、RTEMS,翻译RTEMS官方文档近千页,擅长测量电路和开关电源的设计,现在担任公司团队设计电池测试产品和大功率逆变器产品,看看这位资深人士的分享内容。
在嵌入式学习过程中,对于非常熟悉Windows这样的操作系统,但却不一定熟悉嵌入式系统中常用的RTOS,嵌入式和事实系统是一种什么样的?
嵌入式系统是为了特定应用高度定制的软件硬件计算机系统。从广义的去理解,只要被定制,都可以算作嵌入式系统。如今,在家用的x86系统上,跑一个类似VxWorks、RTEMS等操作系统,当成一个家庭网关都可算是嵌入式系统。有时候,同行认为真正的嵌入式系统硬件也必须按照应用去定制。操作系统就是个资源的管理器。管理计算机上的全部资源,如CPU的计算时间、内存、IO等。实时操作系统简单的说,计算结果不仅依赖于计算结果的正确性,还依赖于结果计算完成的时间。
嵌入式学习过程中,对于嵌入式系统实时性要求高,对于所有满足一定的速度是否都可称为实时系统?
很多厂家并不需要RTOS,前后台也能满足其需要,但他们还是用了RTOS。实时操作系统的高效是为嵌入式系统广为接受的一个很重要的原因。高效有两层意思,一是用任务可以封装开发的逻辑,使应用层代码逻辑更加完整,减小开发难度,代码的复用程度会变高;二是,RTOS代码都比较简洁,算法的空间杂度和时间杂度都很小,能将MCU的绝大部分资源都留给应用层。反过来,大量的应用促使RTOS更加的可靠、更加的精炼,实时性也会更好。当然,如医疗电子、航天电子和工业控制本身,有许多计算是依赖于时间的,对实时性要求非常苛刻。
嵌入式编程相比PC编程,具有哪些复杂性?在嵌入式学习中应当如何开始和深入?
嵌入式开发大的挑战是软件硬件同时成熟,出了问题容易踢皮球,影响开发时间。然而,对于软件开发者来说,大的问题莫过于软件代码的撰写。PC平台的封装非常完善,应用也非常广泛,没有明显的错误,极其稳定。嵌入式平台几乎没这样的资源和封装级别,且和一些寄存器相关。这些寄存器配置的顺序,值都有严格的规定,严格按照datasheet的要求做。嵌入式代码全新开发得太多,自身也有个成熟的过程,也存在着很多方面的问题。例如:代码的应用层和底层耦合、应用层的使用不当和造成底层顺序错误等等。嵌入式调试成本很高,调试手段相比PC也比较单一,对从业人员的要求更高,这都增加了嵌入式的复杂性。
对于嵌入式学习来讲,在嵌入式开发中,对于硬件开发平台来讲,FPGA,ARM,DSP等等,哪个更好,对于初学者来讲,想要学习ARM开发板,该如何去选购?
FPGA和MCU是嵌入式开发的两个不同领域:前者硬件多、后者软件多,应用的行业领域和背景知识差别很大。两者相互不能完全替代。一般来说,FPGA相对于MCU的市场,较为小众。至于DSP,它是以计算见长的一类MCU,并不适合跑调转指令太多的事务代码,会打断流水线,优势体现不出来。所以,DSP的应用和一般的MCU用法略有不同,比较侧重计算、优化。
在嵌入式学习中,嵌入式开发的开发板是否一定要买?是否有比较好的硬件模拟器?
可以直接在x86上做。我买过开发板,但是买了之后,就放在屋子里睡觉,因为可以直接使用x86平台做目标平台。虚拟平台差异很大。目前,x86是虚拟做得好的平台,可以在x86上实现所有的驱动。ARM的平台虚拟水平也要看具体型号。我曾今参加一个开源项目,将RTEMS移植到QEMU mini2440上,可惜QEMU mini2440 的虚拟器或多或少仍有点问题,但也可以解决大部分的问题。可对于学习操作系统的朋友,去解决虚拟平台的问题,有些不靠谱。所以,真心想学习的,就把x86当作嵌入式平台去写代码。毕竟,能比x86这种嵌入式还要复杂的系统,也是屈指可数的,其含金量毋庸置疑。
在嵌入式学习过程中,在这些常用的嵌入式系统中,如何来更好地选择适合自己的系统?
uC/OS,FreeRTOS、rt-thread、VxWorks、ThreadX、RTEMS、ECOS。不下上百种。在这些系统中选择自己的系统可不是件容易的事情。学习的朋友,我推荐uC/OS,有相关书籍,网上的资源也比较多。uC/OS仅仅是一个处理器时间的分配器,简单、易学。学好了,触类旁通,其他的也复杂不了多少。由于商业应用比较复杂,涉及工具链、商业授权、维护、可靠性、易用性等问题。商业应用的朋友我建议开源免费的就选择发展时间比较长的系统,如RTEMS、ECOS这种系统,或者直接选择有商业服务的系统。
嵌入式学习中,在众多实际操作系统中,你为什么选择RTEMS?现在还有开发用到RTEMS吗?如果初学者想精通一门RTOS , 应该从RTEMS开始,这种办法可行么?
RTEMS的内部数据结构设计非常精巧,是一个知识的宝库。举个例子,在数据结构里,双向空链表插入第一个元素时与插入第二个元素操作很不一样。在RTEMS里,用特殊的技巧使得不需要做这种判断,直接插入就好。又如堆的管理、重复释放申请的指针,不会产生任何问题。而在uC/OS里,这是致命的。虽然RTEMS是上个世纪80年代末开发的系统,数据结构和内部的组织从今天的角度来看,仍然是非常先进的,是个含金量非常高的系统。
RTEMS的代码量比Linux小,又比uC/OS这种系统大几个数量级。其开发难度和应用难度相对较高。初学者若是有坚实的基础,可以从RTEMS开始学习;基础较差朋友,若有RTEMS的熟手带,也是可以的。否则不建议这样做,会挫伤学习的积极性,形成恶性循环。