《程序是调试出来的》嵌入式Keil5的调试技巧

《程序是调试出来的》嵌入式Keil5的调试技巧调试手段是教不会的,而是自己亲身实践出来的。那笔者撰写这篇文章的意义何在?一个人的发展始终会受限于自己的眼界,会当凌绝顶,一览众山小,笔者想要带你们览下群山风景

原文发表此处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

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注