不知不觉现已出来作业一年,通过一年的作业,使我学了不少东西,从而使我认识到曾经许多不足之处,也想把自己的程序调试经历跟咱们共享下。
首先是软件的编写环境,挑选一个编译渠道关于编写代码功率是至关重要的,在实践开发中,根本上运用Source Insight这个软件上编写和根改程序代码,自己现在运用的的是Source Insight3.5,这个软件功用十分强壮,能够帮你快速定位代码、检查代码变量运用及各方位调用状况等信息。色彩办理也十分超卓,依据色彩能够判别各个信息,比方变量是否界说、是局部变量仍是全局变量等,能够说只需你运用过了就决不会再想在KEIL环境下编写代码了,当然程序很小有点感觉不出来,而关于程序量较大,且充沛运用程序模块化,便是头文件的运用,定位程序的速度能够到达想到哪里就定位到哪里。了解后根本是运用各个快捷键进行操作,到那时KEIL便是当作一个编译器运用了。
KEIL建工程仍是很有考究的,假设代码比较大时,而工程悉数又放在同一个文件里,那这个文件里的东西就像杂货间,找一个东西都难。如下树立一个工程简略keil工程,这样建的工程,在keil设置相关的头文件调用途径,清单与工程寄存文件等设置后,整个工程的程序代码就跟keil工程文件独立了,这样就对代码的移植及备份带来很大的便利,当然还有分得更细的工程了。这样一来Source Insight工程里增加文件,SVN版别办理代码就便利了。
变量及函数的界说在一个工程里命名习气是十分重要的,做到看到函数或变量名就能够知道变量和函数的含义及效果。我一般指令依据函数功用相关的要害字进行命名,而要害字与要害字之间用大小写区别,我英语也很差,但语法能够不明白,但专业英语的单词仍是要会运用的。而变量界说能用结构体的尽量运用,比方时刻就能够构建一个时刻结构体变量,里边包括年、月、日、时、分、秒、星期,这样界说了一个时刻就十分简单操作并且直观。
程序的调试是写程序最重要的环节,好的调试办法能够快速完结程序调试。曾经调试便是要在板上设置一盏灯,否则程序跑到哪里出了问题都不知道,所以曾经没灯都不知道怎么样去调试,但即便有灯调试,这样功率也是很低的并且实践中也不太实践。运用串口打印信息来调试程序,能够彻底跟TUBRO C 2.0下的printf函数格局进行信息打印,如运用%d,%s、%f、%c打印各类型变量值,而这个功用函数便是debug.c和debug.h模块文件,在这里预编译发挥着重要的效果,能够依据自己装备的界说去操控打印的信息,当程序调试完毕后就封闭打印信息,这样编译器就不会编译调试信息,这有就不必一个一个把调试代码删掉了,当要更改程序时,能够从头翻开编译信息,这就充沛运用了C言语里的预编译和DUBUG的运用,这便是为什么程序里存在调试版和开释版,而调试版程序运转时,往往在串口能够看到相关的信息。断语(assert (条件))也是检测程序里要害参数一个重要调试方法,但条件不成立时打印犯错地点的文件下的第几行和过错条件信息。串口调试环境构建当使能调试时要开支一部分资源,不过现在单片机根本上有外扩RAM,从而使串口调试在51单片机上调试成为可能。
附:自己调试keil51时遇到打印char 类型呈现了一些问题,比方char a=0X01,用printf(“a=%c”,a),串口会打印出a=0100, 用printf(“a=%d”,a),串口会打印出a=512,而keilARM里没呈现,应该是51keil规范库的问题。
程序的屏蔽,曾经最常用的是“ // ”和”/**/”来注释掉程序,//是屏蔽掉一行的代码,当要屏蔽一段代码时就会运用/**/来屏蔽,但往往一些注释也用/**/来注释,如果在屏蔽段代码中刚好用/**/的注释,那是问题就呈现了,曾经就会把代码段里/**/该成//注释。现在就咱们能够运用#if<条件>一段代码#endif来屏蔽一段代码,当条件为真时编译器编译代码,如为0则不编译代码,这样就简单多了。
前后台体系,写程序中处理单个使命在难的功用只算是一个功用,代码多简单写,当使命多个给且使命看似实时的,如数码管显现,按键操作、流水灯、点阵显现灯这样的使命放在一同的时分,就存在时刻分配问题。这些咱们按键按下时要立刻反响、数码显现、点阵显现、流水灯都是要实时处理的,比方按键按下不能及时反响,要麻处理按键时显现停在某个状况,而这些现象在实践中是彻底能够一起呈现的,而你是看不的上面的现象,而处理这样的事情往往是*前后台体系运转起来的,而前后台体系便是看定时器来构建这个程序的软中止相同,比方单片机里的中止便是一个机器周期去查询中止的状况位,如契合中止,程序就会放下当时代码去履行中止代码,但按键、数码显现、点阵这些对人来说是时刻很短的,但关于单片机来说是很长的,有了这样的思想后咱们就能够构建一个由咱们自己定的模仿软件中止查询周期,这个周期便是*定时器来设置中止间隔时刻,而这个在定时器里处理的事情最好是占用时刻短,比方计数、少数个赋值、状况判别及符号,然后后台(main()函数里的代码)就依据前台(TimerTnterrupt()函数里的代码)回来的符号状况进行处理相应事情。这就有点像操作体系的体系节拍,简称为体系的心脏。