振南实战项目纪实(为天津某公司研制工业用信号延时器)
----(2)良好的设计模式
这个项目所要实现的功能,总体来说主要分为两个部分1、人机界面:参数的显示以及触摸设置延时参数;2、精确延时与信号输出。延时的精确度在任何情况下都不可以受到影响,精度要控制在1us以内,甚至是几百ns。但是同时单片机还要负责刷液晶,响应触摸等工作。因此我们需要一个良好的设计模式。
振南采用了前台后分工的低耦合度设计模式。外部信号的响应,定时,波形的产生,全部采用中部驱动;而液晶刷屏,检测触摸等工作而放入main大循环中。此项目选用STC15L2K60S2,它有很多路外部中断以及定时器中断,振南最大化的充分使用了这些硬件资源。每一路输出单独占用一套定时器,这使得两路信号输出之间毫无牵连。
STC15L2K60S2有5个外部中断(INT0~INT4),3个定时器(T0~T2)。
项目中振南使用了INT3-T2与INT4-T1,各自检测各自的信号输入(即检测下降沿),各自计算各自的延时,产生各自的输出。这样就实现了项目需求中所说的:
这个延时功能我一开始是交给另一个人来作的,他的作法是这样的:
这种作法也是一种前后台的开发方式,但是它的耦合度不理想。他设计在定时中断中通过counter自加来记录定时器中断的次数,从而实现较长时间延时。但是它对于counter的判断是在主循环中来完成的。这会导致一个问题:主循环的实时性并不是很好,它循环一次,可能会作很多事情。等到真正运行到判断counter时,原来所需要延时的时间已经过去了。尤其是我们如果不断得向主循环中加入其它大量的业务和功能代码,就会导致延时功能极不精准。
要让counter到时立即作出反应,即立即产生输出信号,我们必须把对它的判断和处理放在中断本身之中。
这样,只要定时器中断能够精准地被触发,信号的的延时精度就能得到极大的保障。主循环中的代码不管有多少拖沓,有多少复杂繁多,一次循环不管需要多长时间,都不会影响信号检测与延时响应输出的精确度。
接下来要说的就是代码工程的模块化设计,振南不管在硬件设计以及软件设计上一直秉承着尽可能模块化的思想,这一点从振南的ZN-X全模块化开发板的设计理念上就能看出来。
这个项目的代码简洁不拖沓,整洁而条理清晰。
模块化开发有百益而无害:
1、条理清晰,定位错误非常快;
2、便于团队协同开发,各负责各自的程序模块;
3、代码模块可单独保存,以便其它项目直接使用;
4、低耦合度的开发,对其它代码模块影响甚小,这使得代码替换和升级很方便。
......
鉴于项目原则,此项目源代码不宜开放,此文所讲到的开发模式和思想,希望对您有用!