sharpxcb的笔记 https://bbs.21ic.com/?321853 [收藏] [复制] [RSS]

日志

“巨人的肩膀”之程式结构篇

已有 565 次阅读2010-9-13 10:02 |系统分类:单片机| 程式结构, 模块化, 操作, 任务

单片机程式设计中,其结构的演变关乎到算法的学问,此“算法”泛指广义的算法,但却又是有一个个小的算法的构造息息相关;一个整体的架构中,其主程式的多个task的分时指针,中断内多个事件计时合理掌控,可以说,在单片机的微秒级世界里,玩转指令间,全在掌控中:


关于任务:一个项目在立案之初,或在二次开发之前,对产品的详细功能要求,切实了解事在必行,从而有助于程式的全盘掌控;就拿一个简单的常用架构来说,一个主程式,一个中断程式,另一个是用户自定义的包含文件;主程式中放多少个任务,多个任务存放的先后顺序,前段对后段的交互,任务间时序的影响,是否是多个任务的盲目堆加,还是巧妙的利用主task指针来调用分任务的子程式,既照顾到最小任务的时序需求,又不会错过实际现实环境中任务的客观事件,等等这些,都是主程式思索的命题;对于中断内的处理,有人误以为只是突发的事件,其实不然,只要是时序要求紧急,即使是已知,为尝不可放在其中处理(如市电频率的模拟同步等),对于其多个AD采样、串口接收的判断、多点阵的LED或按键的扫描(非处理),巧妙组合,见缝插针,“瞬间的美丽也能成就神话”;


关于定义:笔者向来都主张自已创建一个用户自定义的包含文件,这个包含文件内呢,可放置常数、变量、系统寄存器、IO功能名、位操作旗标、RAM空间规划等等的定义,对于指令空间内的程式体,能不用就尽量不要用数字符号来表示,一来在程式后期的维护修改上,不用逐个去查找,相同的变化量,只在定义文档内修改一处就全盘搞定;二来在相近的程式体移置上,对于其IO功能的修改,事件判断的旗标等修改也容易,而不用花太多时间去关心读懂原来的程式(汇编本来就不好读识,时间长了也忘了);三是长期养成好的习惯,集累了多的定义名也是一笔编程的财富,对于其命名、格式一拖而就;对于定义的说明,在指令空间体也哆嗦一下,如标头,变量、常量或旗标等,其命名时最好是与你所处理的事件或程式体的意境相关联,这样在阅读理解上也更容易,而不是说,在命名上一塌糊涂,而程式旁又加一大堆注释(或有懒人干脆不加),效果显而易见(省时省力,立竿见影)!


关于位操作:位操作对于单片机来说,是它的强项,也正因为有了位操作,单片机的世界才那样精彩,归根究底,就是因为单片机与外界交互的IO口就是以位的方式存在的;好的、灵活的位操作(如旗标、计时计数器、指针等)可为单片机节省资源,减少指令操作,更重要的一点是,IO口位操作的唯一性,可有效杜绝单片机对外界的纷乱,减少很多不必要的误操作,所以在处理控制诸如继电器,可控硅,MOS管等重要的IO时,必须慎之又慎,在放置处理这样的IO的地方能少尽量少(防止程式跑飞),好的做法是一整个程式循环体里面只有一句ONOFF这样IO的地方(当然这样做的代价是必需预设好多判断的条件),这样做程式的严密性就得到了保障,毕竟单片机的世界有太多外界干扰的因素,人无完人,何况它呢!

关于模块化:提到模块化,就不得不拿汇编与C作一下比较,到目前为止,我还没有发现用C写的程式能比用汇编写的程式的优势在哪里(虽然我现在也在努力的向C靠拢),当然我这样说并不是指C一无是处,而是说在单片机的应用领域里,C语言还没有发挥出它的优势来,就目前各大网站或教材上公布的例程来看,真的还找不出很好的实用实效性的综合产品实例(恕我孤陋寡闻),现况是,往往一个AD采样例程,就是一个入口,一个出口,中间几乎没有什么全局变量,要知道,一次采样就这样50us没有了,中间没有做其他任何事情(悲唉!),换而来之就是整个程式内多个采集量的不精准,或牺牲掉了太多的时间,一次中断的事件处理却让人等到黄花菜都凉了,也难怪有那么多论坛上只会用C的菜鸟在叫:可控硅不受控、多个LED扫描时有闪烁嫌时序不够用呀等(中国的教育呀,严重误人子弟);叫啸了多年的结构化,模块化,最终是没有把这些任务细化,单片机的实时性与C语言的强大指针功能分了家,“人生中最大的痛苦莫过于此”!

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)