新書推薦:
《
泰山:一种中国信仰专论(法国汉学经典译丛)
》
售價:NT$
380.0
《
花外集斠箋
》
售價:NT$
704.0
《
有兽焉.8
》
售價:NT$
305.0
《
大学问·明清经济史讲稿
》
售價:NT$
330.0
《
中国国际法年刊(2023)
》
售價:NT$
539.0
《
西班牙内战:秩序崩溃与激荡的世界格局:1936-1939
》
售價:NT$
990.0
《
基于鲲鹏的分布式图分析算法实战
》
售價:NT$
495.0
《
夺回大脑 如何靠自己走出强迫
》
售價:NT$
299.0
|
內容簡介: |
本书共分为6章,从MCU51单片机的软件架构入手,讲解当前软件编程的几种模式。重温重点软件基础知识,并讲解了工业控制体系。着重介绍了嵌入式微系统的设计需求,及整个研发的过程。应用案例详实丰富,并包含软件代码分析、重要模块分析等内容。
|
目錄:
|
目录自序引言第1章 前后台软件架构 11.1 MCU51的发展历史 11.2 前后台软件架构 31.2.1 大循环扫描类型 31.2.2 中断触发类型 31.2.3 节拍触发类型 41.2.4 综合性类型 41.3 实用单片机系统 51.3.1 目录结构 51.3.2 三要素实例 71.3.3 消息机制 91.3.4 软件定时器 131.3.5 按键扫描 171.3.6 串口通信 201.3.7 计时时钟 231.3.8 界面设计 241.4 小结 28第2章 软件基础 302.1 Source Insight 302.2 C#编程风格 332.3 Keil-C51 332.4 MDK-ARM 352.5 结构体 362.6 临界态 372.7 临界态保护 382.8 数据存储对齐 392.9 指针 402.10 宏定义 412.11 字符编码 422.12 小结 44第3章 小型工控系统 453.1 嵌入式设备分类 453.2 可编程控制器 473.2.1 起源 473.2.2 体系结构 483.2.3 编程语言 493.2.4 可靠性设计 503.2.5 易用性 523.3 人机界面 533.3.1 硬件介绍 533.3.2 软件编程 533.4 传感器 563.4.1 无源开关 563.4.2 接近开关 583.4.3 模拟传感器 603.5 驱动器 633.5.1 继电器 643.5.2 电磁阀 663.5.3 直流电动机 663.5.4 交流电动机 673.5.5 变频器 683.5.6 直流无刷电动机 693.5.7 伺服电动机 693.5.8 步进电动机 703.5.9 振动盘 713.5.10 工业电源类设备 723.6 Modbus协议 733.6.1 需求分析 733.6.2 UART收发器 743.6.3 帧模式 743.6.4 校验 753.6.5 接口标准 783.6.6 数据交换协议 803.7 PID 823.7.1 P算法 823.7.2 I算法 833.7.3 D算法 843.8 小结 84第4章 msPLCmsOS设计过程 854.1 需求来源 854.2 项目背景 874.2.1 工作原理 884.2.2 硬件设计 914.2.3 软件设计 914.3 开发评估板 944.3.1 msPLC来源 954.3.2 msPLC-Demo 974.3.3 电路分析 974.4 八任务μCOS-II 1024.4.1 选择μCOS-II 1034.4.2 精简μCOS-II 1034.5 选择C# 1054.5.1 C#命名规范 1074.5.2 变量函数重名 1084.5.3 分层分块 1094.5.4 CMSIS 1104.5.5 寄存器组 1114.5.6 命名空间 1134.5.7 抽象封装 1144.5.8 优雅的编程风格 1154.5.9 结构体System和App 1164.5.10 引入设备层 1164.5.11 文件目录建立 1184.5.12 两大结构体 1204.5.13 引入数据库 1224.5.14 平台架构图 1244.6 菜单界面 1244.6.1 C#界面编程 1254.6.2 控件 1274.6.3 页面 1314.6.4 控件链表 1344.6.5 创建界面 1364.6.6 解析界面 1384.6.7 按键处理 1414.7 业务逻辑 1434.7.1 按键处理 1444.7.2 访问机制 1454.8 设备 1474.8.1 Systick 1494.8.2 ADC 1504.8.3 DI 1524.8.4 DO 1524.8.5 Timer 1534.8.6 USART1 1544.8.7 Key 1554.8.8 LCD 1554.8.9 Storage 1554.9 小结 161第5章 定制双任务内核 1635.1 处理器架构 1645.2 工作原理 1655.2.1 FlashROM 1655.2.2 RAM 1665.2.3 内核 1685.2.4 动态变量与栈 1695.2.5 函数调用 1705.2.6 中断处理 1715.3 内核切换 1725.3.1 抢占 1735.3.2 切换内容 1735.3.3 如何切换 1745.3.4 任务结构体 1755.3.5 内核切换代码 1765.3.6 栈初始化 1785.3.7 创建任务 1795.3.8 任务启动 1805.4 消息机制 1815.5 小结 182第6章 应用 1846.1 浮点类型显示 1846.1.1 浮点类型数据存储结构 1846.1.2 sprintf函数 1856.1.3 水压控件初始化 1866.2 数据库指针 1876.3 界面定时刷新 1886.4 msPLC-100C 1896.4.1 接线端口 1906.4.2 端口 1906.4.3 RTC时钟电路 1936.4.4 RS485接口 1936.4.5 DC-DC 1956.5 万年历 1956.6 Modbus 1966.6.1 HMI屏 1966.6.2 主从机 2006.6.3 从机代码 2016.6.4 主机代码 2056.7 小结 214后记 215
|
內容試閱:
|
引言2001年大学毕业后,经兰州大学周庆国教授介绍我进入中科院半导体所工作,师从祝宁华教授、谢亮研究员,第一次真正接触到了MCU51的C语言开发(大学时期接触过单片机汇编)。听谢研究员讲解C语言的优点,尤其是可以写成很多子函数,形成一个个库,便于今后复用,我就想应该设计一套属于自己的C语言库。研究所里的学术氛围很好,对于很多技术问题的讨论都很开放,大家也很看重我的观点,这让我的自信心得到了极大的提升。在研究所工作了近半年之后,在周庆国教授的介绍下我来到了深圳市经纬科技有限公司,跟周荣洁博士做手机设计,因为周博士负责公司软件开发,于是我就从硬件设计人员转变成了一名软件设计人员,主要负责驱动,比如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。随着高频感应加热电源的深入,涉及高速信号例行处理(10ks),这个时候被迫放弃MCU51而迁移到Cortex M3平台,于是基于NXP的LPC1343把MS3升级为MS4,除了保留原来的功能外,主要引入了函数指针做界面设计,对于简单的项目来说,比较容易实现。此外,根据项目需求把系统节拍按需求细分为10 ks、1 ks、100s、10s,紧急响应采用中断,IO状态检测、高速执行用10 ks,水压、数码管扫描显示之类的用1 ks,按键扫描用100s,LCD屏、数码管数据显示用10s。这样处理可以很好地把低速节拍分散到高速系统节拍中,不堆积在一个节拍中执行,避免单个系统节拍占用时间过长的问题。外部采样检测,一般不建议用中断,尽可能用扫描方式的原因是:一是没有这么多中断口;二是中断容易因为毛刺,导致多次中断无法识别;三是可以采用滤波处理提高抗干扰能力。高频感应加热电源曾经一度想上RTOS实现实时响应,但遭到大家反对,因为那个时候我们对RTOS都不太熟悉,虽然有所了解,但没有真正深入,尤其是实时这个概念都不是很清晰,所以认为深入分析透彻项目需求才是出路,后来准确分析项目需求后,提出了系统节拍的速度分级,很好地解决了实时性问题,系统稳定可靠。MS4基本上没对外宣传,只是在博客中发布过,主要是因为本人精力有限。随着高频感应加热电源的深入,需求越来越复杂,而这些需求大部分都来自界面设计,原有的架构体系不足以支撑复杂的界面,写着写着代码自己都晕,不仅要设计业务逻辑,还要花很多时间设计界面,而这个界面设计又干扰了正常的业务逻辑设计,处理得不好甚至会导致系统混乱,而这不是我想看到的,于是就想要改变了。对于小项目来说,界面设计不复杂,但对于稍微大一些的项目,界面一多,尤其是一些动态数据需要显示,参数需要设置,界面设计就变得相当复杂。此外,黑白LCD驱动一般总线速度不高,显示刷新还不能太快,不然动态数据无法看清,这些导致界面显示必须要与业务逻辑独立分离。复杂的界面需求没有一个简单、统一的标准开发模板,导致在大部分嵌入式项目中,界面部分的代码最难被别人看懂,传承性差。虽然现在有CGUI等标准化的界面设计库,但它适合于彩色点阵屏,消耗资源较大,并且系统过于复杂。而很多工业类嵌入式项目一般都用黑白屏,黑白屏具有简单可靠、开发难度低、对处理器要求也低的特点,毕竟工业控制的重点不是界面的色彩,而是系统本身的性能。高频感应加热电源就采用12864点阵的黑白字库屏,支持84个汉字或者164个字母。因为界面的这些需求,导致项目越做越复杂,时间长了自己都迷糊,而现实又逼着自己抽身离开高频感应电源项目组去开拓新的业务:机械自动化的可编程逻辑控制器(PLC),所以必须要让继承者掌握这些软件,而继承者基本没有软件基础,虽然在我的指点下,加上他对高频感应电源本身的熟悉,能看懂一些业务逻辑并且能稍做修改,但对于界面设计基本上一头雾水。这些都促使我不得不重新设计全新的系统,解决界面问题,再加上PLC的软件需求,想把两者的需求统一起来一并解决。MS4是基于NXP的LPC1343芯片,这是因为我有朋友出售NXP,容易采购,但NXP的通用性、资料性毕竟没有ST强,客户群体也没有ST广泛,所以在设计新系统的时候,就考虑基于ST最常用的STM32F103来设计。基于驱动库把MS4移植上来,再增加一些高频感应电源上用到的功能。升级后的版本为MS5,属于过渡版本,在2012年年底发布,也没推广。为了解决业务逻辑与菜单界面的分离问题,2012年年底着手学习RTOS,参考了多家RTOS,最终选择客户群体最为广泛的COS-II,因为有资料可以参考。很多网友向我抱怨COS看都看不懂,关于应用,心里抵触感很强。经过一番分析,我发现他们主要是被过多的宏定义、数据结构、指针、不常用的附属功能所困扰,严重地影响了对程序的阅读,他们甚至不知道哪些函数是重点。对我来说,这个问题同样头疼,导致思维不清晰,于是我从精简入手,先把跟系统关系不大的、一些不常用的附属功能去掉,再去掉一些没用的宏,甚至把任务数从64个变成了8个,去掉了复杂的优先级计算,去掉了复杂的链表结构而改用数组,去掉了很多不常用的函数,如删除任务、删除事件之类,这样一个COS只剩下最核心的内核和必要的功能函数,只有3个文件,看起来简单易懂,语法非常简单。之后把MS5与初步精简化的COS整合为一个版本,MS5作为COS的最低优先级任务,因为这个结合了MS,所以就叫msOS,但考虑到种种原因,尤其是有把两个东西强行合在一起的感觉,所以基本上没有推广。做到这儿,自己都迷惑了,如何把MS5的优点与COS完美地结合起来,既解决菜单界面与业务逻辑的分离问题,又保留简单易用的前后台系统?但第一版的msOS这种生硬的结合很不协调,没有解决分离问题,还需要深入分析菜单界面编程到底是怎么回事,于是跟雨滴科技公司的几位软件负责人沟通,我把我的需求告诉了苏鹏,他长期做Linux,曾师从RT-LinuxGPL维护人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#,这样便于标准化,再结合精简化的COS,基础框架就搭起来了。与此同时,与其配套的硬件平台msPLC-DEMO也已经开发完成,2013年6月正式开始在其上开发软件全新的msOS。因为准备工作做得比较充足,前期开发比较顺利,并且遵循ARM Cortex微控制器软件接口标准CMSIS提出的分层结构(如下图所示)。把整个系统分为App和System两层,分别存放在两个目录中。App是应用层,存放具体项目的需求;System是系统层,提供各种应用接口,支撑应用层运行。System下一般包含三部分:Device、OS及GUI,也可以扩展其他的中间件,比如Modbus、PID等。Device是设备层,为OS、GUI及App提供底层设备接口,它包含了ST提供的硬件驱动标准库。OS为COS-II的精简版本,支持8个任务,去掉了很多动态连接的链表而以数组代替,代码精简明了、非常易懂。GUI是为App层提供菜单设计的标准设计库,目前硬件支持12864点阵黑白字库屏,控件支持页面背景字体(BackText)、表(Chart)、标签(Label)及文本框(TextBox)。后期开发过程中,GUI部分(尤其是TextBox)让我花了将近一个月时间才真正分析透彻,首先,因为TextBox涉及太多需求,比如显示数据、按键响应、光标移动、焦点闪烁等。其次是因为起初我对分层设计和一些指针的用法理解得不是很准确,当完成整个软件开发后,有一种豁然开朗的感觉。msOS初步开发完成后,建立了一个QQ群推广,因为有之前MS奠定的基础,QQ群迅速扩大到上千人。考虑到要方便很多初学者,尤其是高校学生,特意把基于MCU51的MS3按msOS的风格统一,重新命名为MS推出,衔接msOS。此外,在群友的建议及启发下,msOS不断完善,考虑到msOS实际需求只有菜单界面和业务逻辑两个任务,不需要八任务的COS,业务逻辑抢占菜单界面,只要有业务逻辑消息,就需要执行业务逻辑,这样子都可以去掉任务优先级表,其OS演化为与COS 无关的专用版本,这个版本因其任务切换非常简单、易学易用,深受大家喜爱。因为msOS是针对工控行业开发的,所以需要扩展工业相关的库,比如Modbus协议扩展了HMI串口屏,解决了大彩屏问题。扩展TMC262步进电动机驱动,让步进开发更加容易。扩展PID算法,用于温控等场合。msOS可以说是完全基于自身的需求推动的,因为自己需要这些功能,所以不停地寻找,而在解决这些的过程中,受到了很多人帮助、肯定与支持,尤其是周庆国教授把msOS推荐给清华大学第二届开源操作系统技术年会,让它在众多操作系统中,获得好评。广西河池学院彭建盛教授看到msOS的价值,专门成立一个重点实验室,跟我公司合作开发、推广msOS,在此对所有为msOS做出贡献的朋友表示深深的感谢。开源推广msOS,我希望对后来者有参考作用,更希望这个作用不仅仅限于代码方面,更多的应该是这种思维方式,因为这种思维方式很务实。最后,特别感谢我的妻子刘颖,在开发msOS的4年中,她不仅承担了所有的家庭事务,还主动梳理公司事务,让我安心做好msOS。作为一个创业家庭,四年的时间里不赚钱去做开源项目,这是很难被家人所理解的,但她做到了,作为一个丈夫,深深地表示感谢!欢迎加入msPLCmsOS技术交流QQ群,群号为291235815,或登录交流论坛http:bbs.huayusoft.comforum.php的msPLCmsOS版面下载最新资料。王绍伟2016年4月
|
|