分享一年的程序调试经验

发布者:phi31最新更新时间:2015-07-27 来源: 51hei关键字:程序调试  编写环境 手机看文章 扫描二维码
随时随地手机看文章
   不知不觉已经出来工作一年,经过一年的工作,使我学了不少东西,从而使我认识到以前很多不足之处,也想把自己的程序调试经验跟大家分享下。
   首先是软件的编写环境,选择一个编译平台对于编写代码效率是至关重要的,在实际开发中,基本上使用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()函数里的代码)返回的标记状态进行处理相应事件。这就有点像操作系统的系统节拍,简称为系统的心脏。

关键字:程序调试  编写环境 引用地址:分享一年的程序调试经验

上一篇:用uboot调试裸机C语言
下一篇:stc单片机内部扩展RAM大小检测程序

推荐阅读最新更新时间:2024-03-16 14:26

Eclipse开发调试ARM裸机程序(七)LCD
原本想这个LCD应该很难做,但是一个小时搞出来了,2个小时整理下,让自己代码好看一点。这个次不能像I2C一样,用最简的代码来实现了,显示一个图片都要很大,4k的sdram根本不够用,就要用到SDRAM了。启动用的nand,sdram,clock,wathc_dog都是以前的模块,基本上拿来就能用,并没有太难。为了让代码同时具有调试和运行的特性。我想起来了u-boot对这个问题的解决方法,并照做了,效果不不错。原理很简单就是在copy_to_ram_from_nand前边进行一下判断。如果_start的运行地址就是链接地址说明是在调试,那么就不进行拷贝了;如果不是则进行拷贝。具体的代码如下: relocate: /* r
[单片机]
Eclipse开发<font color='red'>调试</font>ARM裸机<font color='red'>程序</font>(七)LCD
调试好的nRF24L01库文件 单片机源程序
单片机源程序如下: #include nRF24L01Drv.h #include USART.h #include stdio.h #include config.h #include intrins.h #include spi.h /** * 1.改多路方法: * NUM_USED_PIPE 改为使用的路数, RX_ADDRESS 分别指定 RX的地址, * RX_PLOAD_WIDTH 改为每一路的PAYLOAD * NRF24L01_RxPacket 里面知道是哪一路在接收 * * * 2. 发送时自动将CONFIG 备份,然后切换TX后再切换回去 * 并且备份RX_ADDR_P0 * * 3. 通道0,
[单片机]
不复位MCU直接调试运行程序,让bug闻风丧胆
1 调试窘境 经常有朋友在开发中遇到这样的窘境,当单片机程序运行异常以后,由于调试信息做得并不是很全面,导致相应的问题场景非常难分析。当时的你肯定会叹息道: 要是我一直插着仿真器就好了,这个bug还不是分分钟的事~ ,每个人都想有颗“后悔药”可吃,然而遇到这种场景也并非绝路。主要是因为大部分朋友插上仿真器以后,调试器在启动时会发出硬件重置信号,应用程序当前的状态都会丢失,包括内存变量、状态等等,对于一些长时间的偶发故障调试更不太友好。此时此刻有一种调试需求是朋友们非常想要的:一旦程序出了问题,我只需要插上仿真器,目标硬件不会复位,而是与我当前所调试的程序同步,类似于仿真程序的时候的“全速运行”,然而通过添加断点,便可查看程序具体的
[单片机]
LPC2378-Jlink 能下载程序,但是调试出现各种奇怪问题
现象如下: 1、Jlink(d版的没有关系)不能下载程序? 把下载速率设置到500Khz及以下的速率。 2、Jlink能在500Khz的速率下载程序,但是不能调试?添加一个断点,就提示说断点太多!没有添加断点,直接按F10,出现信息****Jlink error xx 寄存器不能访问, core ID等错误!在debug下看memory,看到的很多0xAA,预先编写的程序,在指定地址下也没有正确的数据,都是0xAA这样的数据,非常奇怪! 解决办法: 第一种方法: 把下载速率(JTAG Speed)设置到50Khz或者更小,这主要是一般通用常规的ARM调试设置,就可以了(这时Reset Strat
[单片机]
单片机9g舵机调试程序
******************************************************************************* * 程序名称:9g舵机控制 * 硬件说明:VCC-----------------4-6V * GND---------------- GND * PWM----------------IO口 *软件说明: 舵机的转动需要时间的,因此,程序中值的变化不能太快,不然舵机跟不上程序。 * 该舵机属于模拟舵机(非数字),锁定某一角度需要持续给PWM信号 * *编写时间:2020.07.12 * *特别说明:在工作精度高和快速系统中,该舵机转
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved