原文发表此处blog.csdn.net/Eterlove/ar…
Keil5的调试技巧
调试手段是教不会的,而是自己亲身实践出来的。那笔者撰写这篇文章的意义何在?一个人的发展始终会受限于自己的眼界,会当凌绝顶,一览众山小,笔者想要带你们览下群山风景,至于最终能不能攀登上来就看你们各自的本事和毅力,本文只是起到一个抛砖引玉的作用罢了。
在笔者的经历中,用到Keil5调试的板子当属STM32单片机,当然,Ti芯片的集成调试环境CCS这方面也不错,当时的快速查看函数定义和显示函数调用层次比Keil5更胜一筹。本文主要结合Keil5工具讲一下调试技巧。当初学到一定阶段,苦于找不到问题之处及如何验证自己的想法而烦恼不已,后来偶得机缘,幸得良师指点,通宵调试加上后天实践才有了自己一些浅谈技巧,后来我有了想写下这篇博客的想法。
1.注释//
此方法简单且效果明显,十分的好用。当你不知道这段代码的作用,先别急着看源码,不如注释掉,编译下载到开发板看看效果,这一招注释//我屡试不爽,虽谈不上高深,却胜在实用。
//Gui_DrawFont_GBK16(9,5,BLUE,GRAY0,"AD TEST: ");
Gui_DrawFont_GBK16(10,25,BLACK,GRAY0,"Light:");
Gui_DrawFont_GBK16(115,25,BLUE,GRAY0,"%");
DisplayButtonUp(5,25,80,45); //x1,y1,x2,y2
DisplayButtonUp(85,27,125,45); //x1,y1,x2,y2
2.既然板子在手,不如软硬结合
调试以笔者而言,简单分为软件调试和硬件调试及软硬结合调试
- 硬件调试:简单下载程序,观察板子现象,常常与第一条技巧注释结合使用,如果程序写的是这个现象,下载板子上亦是这个现象,则程序正确。
- 软件调试:在没有开发板得情况下,利用模拟环境(Keil5,CCS都具备)进行调试获得结果,脑补出板子现象。例如:假设板子LED是高电平点亮,软件中我们能知道这个值为1,则我们认定(脑补)LED灯点亮。
- 软硬结合调试:程序在集成环境中(如Keil5/CCS)运行,同步测试开发板,常通过单步调试,“一步一程序,对应一步一现象”。现在笔者常用的便是此种细腻的方法,归根结底是此方法可简单使用,亦可加入各种调试手段融入其中,使其极具调试性,快速找到问题所在。———–>既然板子在手,不如软硬结合
- 还有一点,算是笔者看程序的喜好,接手别人项目,看源码时,总喜欢在main函数中用单步调试来快速理清程序的脉络。毕竟“一动不动的看”容易打瞌睡,精神不集中。不如“当成调试程序的看源码”,看看程序一步步动起来,眼光也跟着动,慢慢的就’‘钻进去了’‘,专注起来。
3.善用调试小工具
Keil5集成开发环境中给了许多的调试工具和查看窗口,其实调试这方面有很多值得注意的,但确实不是拿来直接说教的,任何教学手段不如你的亲身实践,带我学习嵌入式的大学老师,给我的建议就是“多折腾”
3.1 这八个基本调试按键应该都很熟悉吧,如何不知道如何进入调试及这些按钮含义请自行百度,调试怎么能不动手呢。
3.2 断点的设置要学会,把断点设置到你认为当前问题所在之处,运行程序来验证
/* 核心板的PA1连接到WIFI模块的A2 状态:PC8指示灯闪烁提示系统运行 屏幕上显示光照百分比 屏幕接线: GND 电源地 VCC 接5V或3.3v电源 SCL 接PA5(SCL) SDA 接PA7(SDA) RES 接PB0 DC 接PB1 CS 接PA4 BL 接PB10 */
#include "stm32f10x.h"
#include "main.h"
#include "delay.h"
#include "usart1.h"
#include "timer2.h"
#include "led.h"
#include "global.h"
#include "stdio.h"
#include "math.h"
#include "string.h"
#include "LCD_calculate.h"
#include "Lcd_Driver.h"
#include "usart1.h"
#include "adc.h"
int main(void) {
u8 adcx=0;
char txt[20];
Delay_Init(); //延时功能初始化
Usart1_Init(9600); //串口1功能初始化,波特率9600
LED_Init(); //LED初始化
TIM2_Init(); //定时10mm
Lcd_Init();
Lcd_Clear(RED); //清屏
LCD_LED_SET; //通过IO控制背光亮
Adc3_Init();
Lsens_Init();
Gui_DrawFont_GBK16(9,5,BLUE,GRAY0,"AD TEST: ");
Gui_DrawFont_GBK16(10,25,BLACK,GRAY0,"Light:");
Gui_DrawFont_GBK16(115,25,BLUE,GRAY0,"%");
DisplayButtonUp(5,25,80,45); //x1,y1,x2,y2
DisplayButtonUp(85,27,125,45); //x1,y1,x2,y2 //TO
while(1)
{
if(timecount>30) //300毫秒刷新一次
{
timecount=0;
adcx=Lsens_Get_Val();
sprintf(txt, "%d", adcx);
Gui_DrawFont_GBK16(90,25,BLUE,GRAY0,txt);
LED1=!LED1;
}
}
}
3.3 会用窗口来观察变量的值变化(如图adcx),甚至可以观察数组每个元素的值变化,软硬结合调试的方式会发现变量的值在不断的变化。 窗口的位置可以根据自己喜好移动和缩放
3.4其他的还有一些串口窗口也是我们经常调试程序的手段。 我们常常用printf函数来打印一些信息来帮助我们调试。写C语言时,打印信息是直接显示在PC命令行窗口上,但注意在单片机调试中则不行,需要串口重定向,原理相同,具体代码请百度(STM32和MSP432的串口重定向代码不同)
4.休息一下,出去走走,理清程序思路
当上面方法没有找到问题所在时,先不要着急,如果情绪变得越来越烦躁,建议即刻停下工作,出去走走,先让自己的脑子冷静下来—->脑袋很混乱,你发现和解决问题的能力会严重下降,不如出去看看风景!
该文章为原创,转载请注明出处和作者
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/18423.html