(特价书)嵌入式微系统
嵌入式微系统基于通用程序架构的思想平台,总结了MCU级嵌入式编程方法。
作者从嵌入式软件工程师、产品经理等多个维度,围绕“msOS”平台,系统揭示了嵌入式产品创业必备的技能和知识。
基本信息
- 作者: 王绍伟 郑德智 吴玉勇
- 丛书名: 电子与嵌入式系统设计丛书
- 出版社:机械工业出版社
- ISBN:9787111539124
- 上架时间:2018-1-23
- 出版日期:2016 年7月
- 开本:16开
- 版次:1-1
- 所属分类:计算机 > 计算机组织与体系结构 > 嵌入式计算机

编辑推荐
内容简介
目录
引言
第1章 前后台软件架构 1
1.1 MCU51的发展历史 1
1.2 前后台软件架构 3
1.2.1 大循环扫描类型 3
1.2.2 中断触发类型 3
1.2.3 节拍触发类型 4
1.2.4 综合性类型 4
1.3 实用单片机系统 5
1.3.1 目录结构 5
1.3.2 三要素实例 7
1.3.3 消息机制 9
1.3.4 软件定时器 13
1.3.5 按键扫描 17
1.3.6 串口通信 20
1.3.7 计时时钟 23
1.3.8 界面设计 24
1.4 小结 28
第2章 软件基础 30
前言
在研究所工作了近半年之后,在周庆国教授的介绍下我来到了深圳市经纬科技有限公司,跟周荣洁博士做手机设计,因为周博士负责公司软件开发,于是我就从硬件设计人员转变成了一名软件设计人员,主要负责驱动,比如LCD、MIDI音频。那个时候刚进入经纬,C语言没有真正写过,却直接面对大规模的手机软件,难度可想而知,是周博士手把手教我如何看代码,如何理解每一句话的含义,尤其是字库显示部分代码分析,这个场景现在还历历在目。
因为有周博士的帮助,加上自身对硬件的理解,我很快上手并获得了公司的认可,这样日子就轻松很多,有了空闲时间。因为掌握了C语言,加上之前接触过MCU51,这时我想把以前建立一套软件库的想法实现,于是在2002年11月左右从周立功公司购买了一套MCU51开发板,型号为DP51,按照参考示例逐个练习,这就是子函数的应用。学了半个月之后,觉得这些太简单了,管理也很麻烦,因为一个个例子、子函数各自独立,无法合在一起,还需要专门给这些子函数建目录,时间一长可能会丢失。因为做过了手机软件,其技术层次远远高于单片机,尤其是平台思想,于是我想引入平台概念,把可能会用到的例子、子函数都在这个平台下管理起来,形成一个有机的整体,这也就是“实用单片机系统”(McuSystem,简称MS)思想的来源。
实现的难度往往远大于想法。虽然那时身边有一群软件高手,但他们都不做单片机开发,所以只能靠我自己独立完成MS。如何构建这个平台,把这些例子衔接起来,则基于大学时期学的VB开发,因为它是典型的消息驱动方式,简单、易用,于是我设计了一套消息机制作为核心。在做手机驱动的时候,经常用到系统节拍、软件定时器、串口调试。系统节拍固定时间有一个中断回调,可以实现按键、数码管等例行扫描程序。软件定时器可以用在一些功能超时处理方面,比如进入某个菜单超时退出、按键音、闹钟或者一些游戏、动画,尤其是可以实现一定时间间隔的自我循环,类似一种伪任务。串口调试是因为手机平台过于庞大,需要实时运行,运行无法通过仿真器调试,所以一般用串口来打印信息了解运行情况。后来随着FlashROM技术的成熟,尤其是STC的单片机,支持在线编程ISP,根本不需要用仿真器,那么串口调试就显得很有价值。依靠以上想法,经过两三个月的开发,MS第一版本基本上成型。
MS出来的时候,恰好祝教授有测量激光器特性的项目要做,于是基于MS做了两个项目,也进一步完善了细节。过了一年在周立功深圳分公司认识了一位客户,他需要开发基于CAN通信的轮胎硫化设备,但因为资金问题,只让我帮他完成框架,具体的他自己来实现。我基于MS完成框架后让他自己设计,本来以为他不可能实现,最后还会来找我,没想到只懂一点点C语言的他竟然自己搞定了,这让我意识到MS的价值:简单、易用。后来我把MS分享给身边人,尤其是当时还在周立功深圳分公司的陈茂华先生,他对MS大加赞赏,认为MS简单易用,非常适合入门,很有价值,有了他的认同让我感觉到需要进一步完善,并且通过网络分享给大家,2003年我将MS放在21IC电子网站的FTP上共享。
2006年来到深圳市华禹高科技有限公司,因为是研发负责人,需要招聘,所以经常在21IC出没。过了一年“程序匠人”搞了一个侃单片机版面的竞选版主活动,我一时兴起,也去参加,竞选的作品是MS3(当时升级为第三个版本)。当时,为了提高MS3的代码质量,还专门让妻子刘颖优化代码(她是计算机系研究生,曾在华为手机部门工作,编程基础远比我强)。竞选活动很是激烈,参与者众多,大家对MS印象较深,感觉不错,受到多数人的肯定与支持,但MS3跟21IC的一个元老级网友“农民讲习所”的一个“通用处理程序”不相上下,双方都有较多的支持者,于是免不了一番激烈的竞争,这进一步推动了MS的扩散。客观地讲,“通用处理程序”跟MS理念有一定的相似性,但出发点完全不同。“通用处理程序”的基本思想来自于RTOS方面,属于主流技术派。相反,MS源自手机的平台思想,是一个开发平台架构,并且因为MS中很少用高难度的技术,甚至都没用指针,编写的代码都很简单、易用,架构清晰明了,让人一目了然,所以很适合入门的嵌入式群体,也获得他们的最大支持。所以在后来的推广中,MS胜出。陈永强(一位后来跟我们一起创业的股东)在看到MS3后,很惊讶原来MCU51还可以这么写程序,于是就这么入了伙。
有了这些基础后,我经常收到询问MS3问题的邮件,也有人加我QQ问一些问题,在这个过程中,有个别网友很好奇我是如何把这些元素融合起来的,他们在溯源我当时的想法是什么,但可惜的是,刨根问底的只有很个别的几个网友,而大部分网友只是看代码而已。在询问过程中,我发现大部分网友做的项目过于简单,没有接触复杂的需求,尤其是软件定时器,他们无法理解它是干什么用的,为什么要加入这个功能,而这些问题导致今后的文档注重讲解功能的来源及我当时的想法。后来,我经常把MS3作为公司内部软件招聘和培训之用,一些单片机项目也都以它为基础开发,可以说整个公司都熟悉MS3,这带来了较大的沟通便利性。
作为第一版本,MS1还很不成熟,尤其是那个时候,代码写得不多,所以很多细节处理显得幼稚,甚至包括编写规范性,但其思想已经体现。MS2把一些没必要的东西都去掉了,甚至都不包含指针,只需要一颗MCU51即可,可以在Keil仿真器下直接运行。通过UART模拟仿真,最好从MS2入手。MS3是比较成熟的版本,尤其是3.20版本,因为竞选版主打下的基础,所以客户群体比较广泛,实际使用最多,2011年高频感应加热电源项目初期就基于MCU51,用的就是MS3。
随着高频感应加热电源的深入,涉及高速信号例行处理(10k/s),这个时候被迫放弃MCU51而迁移到Cortex M3平台,于是基于NXP的LPC1343把MS3升级为MS4,除了保留原来的功能外,主要引入了函数指针做界面设计,对于简单的项目来说,比较容易实现。此外,根据项目需求把系统节拍按需求细分为10 k/s、1 k/s、100/s、10/s,紧急响应采用中断,I/O状态检测、高速执行用10 k/s,水压、数码管扫描显示之类的用1 k/s,按键扫描用100/s,LCD屏、数码管数据显示用10/s。这样处理可以很好地把低速节拍分散到高速系统节拍中,不堆积在一个节拍中执行,避免单个系统节拍占用时间过长的问题。外部采样检测,一般不建议用中断,尽可能用扫描方式的原因是:一是没有这么多中断口;二是中断容易因为毛刺,导致多次中断无法识别;三是可以采用滤波处理提高抗干扰能力。高频感应加热电源曾经一度想上RTOS实现实时响应,但遭到大家反对,因为那个时候我们对RTOS都不太熟悉,虽然有所了解,但没有真正深入,尤其是实时这个概念都不是很清晰,所以认为深入分析透彻项目需求才是出路,后来准确分析项目需求后,提出了系统节拍的速度分级,很好地解决了实时性问题,系统稳定可靠。
MS4基本上没对外宣传,只是在博客中发布过,主要是因为本人精力有限。随着高频感应加热电源的深入,需求越来越复杂,而这些需求大部分都来自界面设计,原有的架构体系不足以支撑复杂的界面,写着写着代码自己都晕,不仅要设计业务逻辑,还要花很多时间设计界面,而这个界面设计又干扰了正常的业务逻辑设计,处理得不好甚至会导致系统混乱,而这不是我想看到的,于是就想要改变了。
对于小项目来说,界面设计不复杂,但对于稍微大一些的项目,界面一多,尤其是一些动态数据需要显示,参数需要设置,界面设计就变得相当复杂。此外,黑白LCD驱动一般总线速度不高,显示刷新还不能太快,不然动态数据无法看清,这些导致界面显示必须要与业务逻辑独立分离。复杂的界面需求没有一个简单、统一的标准开发模板,导致在大部分嵌入式项目中,界面部分的代码最难被别人看懂,传承性差。虽然现在有μC/GUI等标准化的界面设计库,但它适合于彩色点阵屏,消耗资源较大,并且系统过于复杂。而很多工业类嵌入式项目一般都用黑白屏,黑白屏具有简单可靠、开发难度低、对处理器要求也低的特点,毕竟工业控制的重点不是界面的色彩,而是系统本身的性能。高频感应加热电源就采用128×64点阵的黑白字库屏,支持8×4个汉字或者16×4个字母。
因为界面的这些需求,导致项目越做越复杂,时间长了自己都迷糊,而现实又逼着自己抽身离开高频感应电源项目组去开拓新的业务:机械自动化的可编程逻辑控制器(PLC),所以必须要让继承者掌握这些软件,而继承者基本没有软件基础,虽然在我的指点下,加上他对高频感应电源本身的熟悉,能看懂一些业务逻辑并且能稍做修改,但对于界面设计基本上一头雾水。这些都促使我不得不重新设计全新的系统,解决界面问题,再加上PLC的软件需求,想把两者的需求统一起来一并解决。
MS4是基于NXP的LPC1343芯片,这是因为我有朋友出售NXP,容易采购,但NXP的通用性、资料性毕竟没有ST强,客户群体也没有ST广泛,所以在设计新系统的时候,就考虑基于ST最常用的STM32F103来设计。基于驱动库把MS4移植上来,再增加一些高频感应电源上用到的功能。升级后的版本为MS5,属于过渡版本,在2012年年底发布,也没推广。
为了解决业务逻辑与菜单界面的分离问题,2012年年底着手学习RTOS,参考了多家RTOS,最终选择客户群体最为广泛的μC/OS-II,因为有资料可以参考。很多网友向我抱怨μC/OS看都看不懂,关于应用,心里抵触感很强。经过一番分析,我发现他们主要是被过多的宏定义、数据结构、指针、不常用的附属功能所困扰,严重地影响了对程序的阅读,他们甚至不知道哪些函数是重点。对我来说,这个问题同样头疼,导致思维不清晰,于是我从精简入手,先把跟系统关系不大的、一些不常用的附属功能去掉,再去掉一些没用的宏,甚至把任务数从64个变成了8个,去掉了复杂的优先级计算,去掉了复杂的链表结构而改用数组,去掉了很多不常用的函数,如删除任务、删除事件之类,这样一个μC/OS只剩下最核心的内核和必要的功能函数,只有3个文件,看起来简单易懂,语法非常简单。之后把MS5与初步精简化的μC/OS整合为一个版本,MS5作为μC/OS的最低优先级任务,因为这个结合了MS,所以就叫msOS,但考虑到种种原因,尤其是有把两个东西强行合在一起的感觉,所以基本上没有推广。
做到这儿,自己都迷惑了,如何把MS5的优点与μC/OS完美地结合起来,既解决菜单界面与业务逻辑的分离问题,又保留简单易用的前后台系统?但第一版的msOS这种生硬的结合很不协调,没有解决分离问题,还需要深入分析菜单界面编程到底是怎么回事,于是跟雨滴科技公司的几位软件负责人沟通,我把我的需求告诉了苏鹏,他长期做Linux,曾师从RT-Linux/GPL维护人Nicholas McGuire教授,对开源和互联网具有天然的敏感性。因为他长期负责MTK手机开发和Java设计,所以对界面有非常深入的理解,我们讨论之后,他建议我在MS4下重新构建高频感应加热电源的程序,实践一下菜单界面与业务逻辑的分离。在MS4的消息机制下,把菜单界面用一个低速定时的消息来激活,以更新显示内容,有一点点类似后来的面向对象编程风格,但这种方法会导致一个问题,那就是每次刷屏显示都要从头到尾来一次完整的程序执行,中间不能打断退出,这会导致业务逻辑响应速度降低,所以开发完成之后没有实际使用,但为后来的菜单界面设计奠定了基础。
有了这次实践经验,加深了我对菜单界面编程的理解,于是我开始寻找当前主流的菜单界面编程方式。在PC编程中菜单界面技术非常成熟,早期有VB、Delphi、VC等,现在流行的有Java、C#。恰好雨滴科技公司有WinCE项目,用C#开发,而C#则是微软总结了自己这么多年的开发经验,吸收了VB、Delphi、Java、VC的优点整合起来的接近C语言的一门新语言,特点是简单、易用、接地气,这符合我的理念,于是同事向我推荐采用C#,并且做了演示,当时就让我感受到,这正是我想要的东西:一是语法来自于C语言,具有兼容性;二是它的命名法非常好,长命名看词识意,提高了阅读性;三是整个架构设计非常完美,命名空间给我留下很深的印象,可以很好地解决一些大项目的重名问题,尤其是全局变量;四是面向对象设计,可以很好地解决菜单界面问题;五是按照C#模板设计,可以同时把上位机C#编程也学了,之后公司内部可以有很好的语言统一性,而C#跟Java又类似,这些都可以水到渠成。
有了C#作为参考模板,接下来的问题就是如何把C语言写成C#风格。C语言没有命名空间这一说法,如何表达?C语言没有直接的面向对象概念,如何建立?于是我把这些问题跟软件人员交流沟通,最后确定下来选择结构体为核心解决命名空间和面向对象设计,代码写作规范一律参考C#,这样便于标准化,再结合精简化的μC/OS,基础框架就搭起来了。与此同时,与其配套的硬件平台msPLC-DEMO也已经开发完成,2013年6月正式开始在其上开发软件全新的msOS。
因为准备工作做得比较充足,前期开发比较顺利,并且遵循ARM Cortex微控制器软件接口标准CMSIS提出的分层结构(如下图所示)。
把整个系统分为App和System两层,分别存放在两个目录中。
App是应用层,存放具体项目的需求;System是系统层,提供各种应用接口,支撑应用层运行。System下一般包含三部分:Device、OS及GUI,也可以扩展其他的中间件,比如Modbus、PID等。
序言
我也一直被这种无序的现状困扰着,在开发高频感应加热电源的时候,很希望找到一套比较简单易用的嵌入式软件架构帮助自己完成设计,尤其是GUI部分,可惜事与愿违。为了整个公司的代码统一性、与PC编程接轨的可行性及操作维护的长效性,必须找到一套标准和公认的模板,同时把嵌入式行业出现的优秀元素(如RTOS、GUI、面向对象设计、分层设计等思想)引入这个架构中,通过合理的组织形成完整的系统。
这个系统不能复杂,必须要简单易用,因为嵌入式面对的应用场合千千万万,各不相同,无法提供所有的需求,即使提供了,也会因ROM容量有限、CPU性能有限而受限,所以必须给出一个可让使用者容易读懂,且自己容易修改、增删的系统,每个功能提供一两个实例,用户根据实际项目的情况进行修改、增删。
虽然我曾做过一段时间软件,但长期负责硬件,后来创业,管理公司,可以说软件对我来说是弱项,正因为是弱项,让自己不拘泥于软件技术本身,而是用硬件尤其是企业管理者的思维来看待软件,从需求入手建立自己想要的软件系统,即嵌入式微系统(msOS)。msOS成型后,我认识到这就是我日常的企业管理思维:分层设计,各模块独立运作,实现高内敛低耦合思想。这些思想都是日常管理中的基本常识,所以msOS文档的描述将更多的是基于常识的讲解,淡化一些专用名词、专用术语,卸下包袱,让常识自然融入其中。
msOS开发完成后,获得了同事的普遍认可,他们认为msOS用代码方式总结了嵌入式行业多年来的发展成果。现把它编写成书,尤其是把它的需求、历史写出来,让更多的嵌入式人员从中找到自己想要的东西,而不仅仅是代码。
学习msOS,目的是应用,尽可能地降低学习费用,把精力放在快速开发产品上。
最后感谢各位合作伙伴,在开发msPLC/msOS的4年多时间里,你们不仅支撑了公司的发展,还积极参与改进msPLC/msOS的各种缺陷,让它更加完美。
为msPLC/msOS做出重要贡献的人员如下。
妻子刘颖:接管家庭事务,协助公司事务,并完善部分代码,参与部分章节写作、修订。
周庆国教授:在学业和工作上给予我很大帮助,尤其是在人生的几次重要转折点上。
郑德智、吴玉勇:接手我原来的工作,并全力支持msPLC/msOS开发。
孔海文、朱志惠:提供各种工业产品参考,设计上给予指导。
陈永强、皮云仙、苏鹏、田飞峰、高茂光:积极协助开发,并多次提出改进意见。
易艳辉、彭娟、李小龙:基于msPLC/msOS开发各种设备,并报告一些msPLC/msOS的缺陷。
感谢msPLC/msOS QQ群的各位网友对msPLC/msOS的支持和改进。
王绍伟
2016年4月