« 上一篇下一篇 »

系统观的培养

一、系统观

系统观就是指看待问题要从全局出发,而不是仅仅纠结于局部

不要仅仅只是写代码,一定要知道你写的代码需要多久的执行时间,哪些地方还可以优化,哪些地方速度已经上不去了,比如一个测量系统,你的测量上下限在哪?误差在哪?是什么导致了这些误差?是软件原因还是硬件原因?可否改进?怎么去改进?

做单片机这样的硬件控制,每时每刻都要清楚的知道你的工作流程需要消耗多少的时间?比如,普通的延时程序:

for(i = 0; i < n; i++)

for(i = n; i > 0; i--)

上述两条代码的执行时间是不一样的,前者所要花费的时间比后者要久,为什么呢?答案很简单,这是由CPU的指令执行方式决定的,“DJNZ”,这是8051中的循环跳转指令:相应的对象减1,不为0则转移。可见,它的执行方式是每次减1,然后与0位进行比较,如果不为0则转移,为0则不转移。好了,现在我们回到上面两条for()循环语句,前者是累加,后者是累减,但不管高级语言的代码是怎么写的,它最后都会被编译器编译成汇编指令,即上面所说的“DJNZ”类型的代码,所以,前一个for()循环虽然是累加的,但是它最后还是被编译成累减,然后与0相比较的一种执行方式,但在这个过程中,它就比后一个for()循环多了一个转换的过程,而这个过程所用的时间就是多消耗的时间。两条循环语句的执行时间不一样其实以前就听说过,但是并不明白为什么会这样?现在被老张这么一提点,恍然大悟!

还有一点,那为什么它的指令执行不是累加上去再比较呢?这么做当然也有设计者的道理,因为如果把执行方式改成向上累加再比较,那显然,需要多一个寄存器来存储这个比较的值,而如果往下减的话,就可以直接与“0”标志位比较,从而就免去一个寄存器。

二、一个例子

四轴飞行器,假如已经确定了它的一套控制流程需要的时间,但是它并没有其他的附加功能。而如果现在客户要求添加相应的附加功能,如测温、测高、拍照等,而又不能影响到飞行器的正常飞行特性,那么该怎么做呢?

1、预留执行时间

意思是原来的控制流程里在做完飞行控制后,还有一部分时间是多余的,那么这部分时间就可以留给其他的附加功能,但这种方式显然太浪费时间。

2、采用双CPU

一个CPU用做飞行控制,另一个CPU用做附加功能实现,两个CPU同时运行,但显然,这种方式需要更高的成本。

3、采用通用接口

就是说不管是飞行控制也好,还是附加功能也好,都使用同一个接口。如果没有附加功能的数据,就不处理,如果有了附加功能的数据,则对数据进行处理,这就相当于把问题转换成了硬件层面,而并不是通过软件来解决它了。

总之,上面所有的话都是说:你要对你的系统做到心知肚明,清楚知道它的缺陷以及优点,这些远远比写代码重要的多。引用老张的那句话,“你不要把自己看做是一个程序员,而要把自己看做是系统设计师!”。