||
单片机程式设计中,其结构的演变关乎到算法的学问,此“算法”泛指广义的算法,但却又是有一个个小的算法的构造息息相关;一个整体的架构中,其主程式的多个task的分时指针,中断内多个事件计时合理掌控,可以说,在单片机的微秒级世界里,玩转指令间,全在掌控中:
关于任务:一个项目在立案之初,或在二次开发之前,对产品的详细功能要求,切实了解事在必行,从而有助于程式的全盘掌控;就拿一个简单的常用架构来说,一个主程式,一个中断程式,另一个是用户自定义的包含文件;主程式中放多少个任务,多个任务存放的先后顺序,前段对后段的交互,任务间时序的影响,是否是多个任务的盲目堆加,还是巧妙的利用主task指针来调用分任务的子程式,既照顾到最小任务的时序需求,又不会错过实际现实环境中任务的客观事件,等等这些,都是主程式思索的命题;对于中断内的处理,有人误以为只是突发的事件,其实不然,只要是时序要求紧急,即使是已知,为尝不可放在其中处理(如市电频率的模拟同步等),对于其多个AD采样、串口接收的判断、多点阵的LED或按键的扫描(非处理),巧妙组合,见缝插针,“瞬间的美丽也能成就神话”;
关于定义:笔者向来都主张自已创建一个用户自定义的包含文件,这个包含文件内呢,可放置常数、变量、系统寄存器、IO功能名、位操作旗标、RAM空间规划等等的定义,对于指令空间内的程式体,能不用就尽量不要用数字符号来表示,一来在程式后期的维护修改上,不用逐个去查找,相同的变化量,只在定义文档内修改一处就全盘搞定;二来在相近的程式体移置上,对于其IO功能的修改,事件判断的旗标等修改也容易,而不用花太多时间去关心读懂原来的程式(汇编本来就不好读识,时间长了也忘了);三是长期养成好的习惯,集累了多的定义名也是一笔编程的财富,对于其命名、格式一拖而就;对于定义的说明,在指令空间体也哆嗦一下,如标头,变量、常量或旗标等,其命名时最好是与你所处理的事件或程式体的意境相关联,这样在阅读理解上也更容易,而不是说,在命名上一塌糊涂,而程式旁又加一大堆注释(或有懒人干脆不加),效果显而易见(省时省力,立竿见影)!
关于位操作:位操作对于单片机来说,是它的强项,也正因为有了位操作,单片机的世界才那样精彩,归根究底,就是因为单片机与外界交互的IO口就是以位的方式存在的;好的、灵活的位操作(如旗标、计时计数器、指针等)可为单片机节省资源,减少指令操作,更重要的一点是,IO口位操作的唯一性,可有效杜绝单片机对外界的纷乱,减少很多不必要的误操作,所以在处理控制诸如继电器,可控硅,MOS管等重要的IO时,必须慎之又慎,在放置处理这样的IO的地方能少尽量少(防止程式跑飞),好的做法是一整个程式循环体里面只有一句ON和OFF这样IO的地方(当然这样做的代价是必需预设好多判断的条件),这样做程式的严密性就得到了保障,毕竟单片机的世界有太多外界干扰的因素,人无完人,何况它呢!