keil调试问题
Keil5调试过程中遇到的一些警告和错误
Keil5调试过程中遇到的⼀些警告和错误最近⽤keil5调试代码出了⼀些警告与错误,整理如下:1.warning: #1295-D: Deprecated declaration run_c - give arg typesvoid run_c();//原函数void run_c(void);//改正后对⽐前⾯声明的函数,发现是括号少了⼀个void,因为我的函数是不带参的,不加void会有警告的,往括号⾥加了void之后,重新编译之后警告消失。
2.warning: #940-D: missing return statement at end of non-void function "Gray_Delay_Run40"int Gray_Delay_Run40(u16 i)//原函数{while(i -- ){delay_ms(1);Gray_Run40();}}int Gray_Delay_Run40(u16 i)//改正1{while(i -- ){delay_ms(1);Gray_Run40();}return 0;}void Gray_Delay_Run40(u16 i)//改正2{while(i -- ){delay_ms(1);Gray_Run40();}}因为我函数是int型的,是需要有返回值,但是我没有return,加⼊return 0;之后重新编译警告消失。
或者直接把int改成void,同样编译后警告消失。
3.warning: #177-D: variable "a" was declared but never referenceds32 a = 50;//原函数//s32 a = 50;//改正后因为我定义了⼀个变量准备在后⾯⽤到,但是后⾯直接⽤数字代替了,没有⽤到,将这个变量注释后,重新编译警告消失。
4.warning: #177-D: function "Delayms" was declared but never referencedstatic void Delayms(u16 i){...}//static void Delayms(u16 i) //改正后//{// ...//}这⾥和第3个错误差不多,因为我定义了⼀个函数准备在后⾯⽤到,但是后⾯没有⽤到,将这个函数注释后,重新编译警告消失。
keil c 的在线调试与断点设置
Keil 的调试命令、在线汇编与断点设置上一讲中我们学习了如何建立工程、汇编、连接工程,并获得目标代码,但是做到这一步仅仅代表你的源程序没有语法错误,至于源程序中存在着的其它错误,必须通过调试才能发现并解决,事实上,除了极简单的程序以外,绝大部份的程序都要通过反复调试才能得到正确的结果,因此,调试是软件开发中重要的一个环节,这一讲将介绍常用的调试命令、利用在线汇编、各种设置断点进行程序调试的方法,并通过实例介绍这些方法的使用。
一、常用调试命令在对工程成功地进行汇编、连接以后,按Ctrl+F5 或者使用菜单Debug->Start/Stop Debug Session 即可进入调试状态,Keil 内建了一个仿真CPU 用来模拟执行程序,该仿真CPU 功能强大,可以在没有硬件和仿真机的情况下进行程序的调试,下面将要学的就是该模拟调试功能。
不过在学习之前必须明确,模拟毕竟只是模拟,与真实的硬件执行程序肯定还是有区别的,其中最明显的就是时序,软件模拟是不可能和真实的硬件具有相同的时序的,具体的表现就是程序执行的速度和各人使用的计算机有关,计算机性能越好,运行速度越快。
进入调试状态后,界面与编缉状态相比有明显的变化,Debug 菜单项中原来不能用的命令现在已可以使用了,工具栏会多出一个用于运行和调试的工具条,如图1 所示,Debug 菜单上的大部份命令可以在此找到对应的快捷按钮,从左到右依次是复位、运行、暂停、单步、过程单步、执行完当前子程序、运行到当前行、下一状态、打开跟踪、观察跟踪、反汇编窗口、观察窗口、代码作用范围分析、1#串行窗口、内存窗口、性能分析、工具按钮等命令。
接着执行下一行程序,中间不停止,这样程序执行的速度很快,并可以看到该段程序执行的总体效果,即最终结果正确还是错误,但如果程序有错,则难以确认错误出现在哪些程序行。
单步执行是每次执行一行程序,执行完该行程序以后即停止,等待命令执行下一行程序,此时可以观察该行程序执行完以后得到的结果,是否与我们写该行程序所想要得到的结果相同,借此可以找到程序中问题所在。
Keil MDK3.20 在ULINK下调试stm32方法
Keil MDK3.20 在ULINK下调试stm32方法1. 程序在RAM中运行要点:(1)程序的下载地址改到RAM空间中(2)程序的debug之前要设定SP,PC指针到Ram空间新建工程,选择STM32 的具体型号,我买的万利的开发板,选择stm32f103Vb。
?设定程序下载地址,如下图所示,IROM1的地址指向了STM32的ram空间。
?空间大小如何分配取决于自己的需求。
本款处理器内部ram大小为20K,分配16K给只读区,4K给可读可写区。
这样IROM设定的大小为0x4000,IRAM1的起始就变为0X20004000,大小只剩下0X1000。
Debug标签选择ULINK1 Cortex Debugger(软件采用yjgyiysbcc兄crack 方法)。
不选Load Application at Start,在Initialization中加入启动脚本RAM.ini。
?RAM.ini中具体内容如下:FUNC void Setup (void) {SP = _RDWORD(0x20000000); // Setup Stack PointerPC = _RDWORD(0x20000004); // Setup Program Counter_WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table OffsetRegister}LOAD XXX.axf INCREMENTAL // Download,红色代表工程文件名.axfSetup(); // Setup for Runningg, mainUtilities下Update Target before Debugging不选这样添加后就可以在RAM中调试了。
>>>>>>我们需要在代码中设置正确的中断向量表位置。
中断向量表通常被放置在用户程序的开始,所以flash中运行时,向量表位于0x08000000处,而当代码被放置在SRAM中运行时,他的位置就成了0x20000000。
单片机Keil软件仿真与调试技巧
图5程序调试运行 调试程序时的程序运行控制按钮从左到右依次 为复位、连续运行,暂停、单步、过程单步、执行 完当前子程序、运行到光标当前行。复位按钮模拟 芯片的复位,它将使程序回到最开头处执行。当程 序处于停止状态时复位才有效,程序处于运行状态 时停止按钮才有效。 ①为了方便观察程序调试过程中各变量和
琵稳焉击——————————]Ⅲ阴
单片机Keil软件仿真与调试技巧
一、引言
弹出图1窗口.自动进入编辑工作模式。
单片机软件开发过程中,软件调试遇到的各种 问题常令初学者感到不知所措。实际上.各种仿真 开发软件的程序调试基本方法和技巧大同小异,掌 握正确的程序调试基本技巧。对于排查这些程序错 误问题可以起到举一反三、事半功倍的效果。软件 调试是单片机技术人员必须掌握的重要基本技能。 下面以单片机常用开发软件Keil为例,通过一个项 目任务实例来介绍单片机软件仿真与调试的方法。
二、Keil仿真与调试
点击运行软件Keil uVision2。其调试操作步骤 大体可以分为5步:
1.创建工程 在项目开发中,并不是仅有一个用户源程序就 够了,还要为这个项目选择CPU型号、设置编译和 调试参数.有一些项目还会有多个文件组成。因此 将这些参数设置和所需要的所有文件统称为一个工 程,存放于专门的工程文件夹下。这里先建立一个 工程文件夹如F:kexam。 ①创建新工程。鼠标左键单击主菜单Project一 >New Project。弹出。Create New Project”对话框, 用鼠标选择你要保存工程的文件夹(如FAexam), 输入新工程名(如。exam”).单击。保存”按键。 ②在随后弹出的CPU型号设置对话框中选择 单片机的型号(如。AT89C51”),单击“确定”完 成。
电孑舅作 51
我总结的KEIL51调试的错误总结
KEIL51调试时一些的错误总结(1)提示无M51文件编译时候提示:F:\...\XX.M51File has been changed outside the editor, reload ?------解决方法:重新生成项目,产生STARTUP.A51即可。
(2)L15重复调用***WARNING L15: MULTIPLE CALL TO SEGMENTSEGMENT: ?PR?SPI_RECEIVE_WORD?D_SPICALLER1: ?PR?VSYNC_INTERRUPT?MAINCALLER2: ?C_C51STARTUP如果函数可以在其执行时被调用,则情况会变得更复杂一些。
这时可以采用以下几种方法:1.主程序调用该函数时禁止中断,可以在该函数被调用时用#pragma disable语句来实现禁止中断的目的。
必须使用OVERLAY指令将该函数从覆盖分析中除去。
2.复制两份该函数的代码,一份到主程序中,另一份复制到中断服务程序中。
3.将该函数设为重入型。
例如:void myfunc(void) reentrant {...}这种设置将会产生一个可重入堆栈,该堆栈被被用于存储函数值和局部变量,用这种方法时重入堆栈必须在STARTUP.A51文件中配置。
这种方法消耗更多的RAM并会降低重入函数的执行速度。
(3)L16无调用*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESSSEGMENT: ?PR?_COMPARE?TESTLCD说明:程序中有些函数例如COMPARE(或片段)以前(调试过程中)从未被调用过,或者根本没有调用它的语句。
这条警告信息前应该还有一条信息指示出是哪个函数导致了这一问题。
只要做点简单的调整就可以。
不理它也没什么大不了的。
解决方法:去掉COMPARE()函数或利用条件编译#if …..#endif,可保留该函数并不编译。
(完整word版)KeilC51程序调试过程
如何使用Keil C软件调试单片机程序调试一般都是在发生错误与意外的情况下使用的。
如果程序能正常执行,调试很多时候都是用不上的.所以,最高效率的程序开发还是程序员自己做好规范,而不是指望调试来解决问题。
单片机的程序调试分为两种,一种是使用软件模拟调试,第二种是硬件调试.使用软件模拟调试,就是用计算机去模拟单片机的指令执行,并虚拟单片机片内资源,从而实现调试的目的。
但是软件调试存在一些问题,不可能像真正的单片机运行环境那样执行的指令能在同一个时间完成(往往比单片机慢)。
软件调试只能是一种初步的,小型工程的调试,比如一个只有几百上千行的代码的程序,软件调试能很好的完成。
硬件调试其实也需要计算机软件的配合,大致过程是这样的:计算机软件把编译好的程序通过串行口、并行口或者USB口传输到仿真器,然后与单片机一样执行。
仿真器仿真全部的单片机资源(所有的单片机接口,并且有真实的引脚输出)。
仿真器会将单片机内部内存与时序等情况返回给计算机,这样就可以在计算机里看到单片机程序真实的执行情况。
不仅如此,还可以通过计算机的软件实现单步、全速、运行到光标的常规调试手段。
仿真器可以接入实际的电路中。
图1:仿真器下面将具体介绍如何使用Keil uVision 软件来调试单片机程序。
首先:打开一个已经编译通过的单片机项目。
选择Debug下面的Start/Stop Debug Session,这个选项可以打开调试也可以关闭调试。
接下来看到的窗口就是调试窗口了:下面具体说说相关子窗口的功能:1、左侧的ProjectWorkspaceRegs是片内内存的相关情况值;Sys是系统一些累加器、计数器等。
Regs很简单就不多说。
具体介绍一下Sys:a 累加器ACC,往往在运算前暂存一个操作数(如被加数),而运算后又保存其结果(如代数和)。
b 寄存器B,主要用于乘法和除法操作。
spsp_maxdptr 数据指针DPTR。
PC $states 执行指令的数量。
Keil软件调试全速运行时动态刷新窗口的问题
大家一开始软件仿真的 时候丆会全速运行丆看 I/O口的变化丆或者是 看逻辑窗口的变化来看 一下程序的运行情况。 但问题出现了。窗口并 没有刷新丆好像死在那 了一样。然后就怀疑自 己的程序有问题。
大家提的问题是丗全速运行的 情况下丆窗口没有刷新。右下 角的时间停止丆没有更新。
只有点击Upd速运行时丆勾会 一会有一会消失。
Keil使用Debug调试模式时出现的几种错误总结
Keil使⽤Debug调试模式时出现的⼏种错误总结Keil版本:keil4V4.60调试器:j_link1.在使⽤j-link下载程序时,target options中的debug选项中选择了j-link选项后,出现了J-LINK the connected emulator is a j-link clone问题,然后keil软件⾃⾏关闭。
解决⽅式:⽤SEGGER安装⽬录下的JLinkARM.dll替换掉MDK安装⽬录下的./ARM/Segger/JLinkARM.dll就可以了2.出现了TCK (pin 9) low, but should be high. Please check target。
的错误解决⽅式:⾸先先检查原理图中是不是接错线了(就我⽽⾔,错的实在是太离谱,电源和地接反,⽽且BOOT0引脚完全没有接地),当我将这些个问题解决掉了之后,设置target options->Debug->右上⾓Use->Setting->Debug->Port选择SW选项。
3.在解决第⼆个问题之后,出现了未发现CPU的错误。
解决⽅式:这个问题的解决⽅式是在target options中的Utilities选项中点击Settings在Programming Algorithm选择框内添加芯⽚的类型(就我⽽⾔是STM32F10x 128K的)就⾏。
4.在debug模式下进⾏调试时,发现程序没有从main函数进⾏运⾏,⽽是⼀直在汇编代码BKPT那⾥停下,当点复位时,到了systemInit那⾥解决⽅式:我在⽹上查找资料,⼀般的解决⽅式有以下的⼏种:1).⼯程所在⽬录存在汉字⽬录或⽬录路径过深(由于所⽤软件绝⼤部分为外国软件且可能都是破解版,导致对汉字⽀持较差);实测⼯程汉字⽬录较长(⼤概30个汉字)且⽬录路径较深(7级),导致进⼊调试模式单步执⾏了 2 步,就出现了 IDE 已停⽌⼯作,KEIL崩溃2).KEIL 软件本⾝⼀些必要的配置,即Target Options Configure的Dubug选项下⾯选择Run to main()3).程序中存在的问题,就好⽐上述使⽤了未实现 printf() 函数或未实现的函数、条件宏等;4).硬件问题,当然做个最简单的流⽔灯便能排除。
Keil调试常见错误
1. Warning 280:’i’:unreferenced local variable说明局部变量i 在函数中未作任何的存取操作解决方法消除函数中i 变量的宣告2 Warning 206:’Music3’:missing function-prototype说明Music3( )函数未作宣告或未作外部宣告所以无法给其他函数调用解决方法将叙述void Music3(void)写在程序的最前端作宣告如果是其他文件的函数则要写成extern void Music3(void),即作外部宣告3 Compling :C:\8051\MANN.CError:318:can’t open file ‘beep.h’说明在编译C:\8051\MANN.C 程序过程中由于main.c 用了指令#i nclude “beep.h”,但却找不到所致解决方法编写一个beep.h 的包含档并存入到c:\8051 的工作目录中4 Compling:C:\8051\LED.CError 237:’LedOn’:function already has a body说明LedOn( )函数名称重复定义即有两个以上一样的函数名称解决方法修正其中的一个函数名称使得函数名称都是独立的5 ***WARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_DELAYX1MS?DELAY说明DelayX1ms( )函数未被其它函数调用也会占用程序记忆体空间解决方法去掉DelayX1ms( )函数或利用条件编译#if …..#endif,可保留该函数并不编译6 ***WARNING 6 :XDA TA SPACE MEMORY OVERLAPFROM : 0025HTO: 0025H说明外部资料ROM 的0025H 重复定义地址解决方法外部资料ROM 的定义如下Pdata unsigned char XFR_ADC _at_0x25 其中XFR_ADC变量的名称为0x25,请检查是否有其它的变量名称也是定义在0x25 处并修正它7 WARNING 206:’DelayX1ms’: missing function-prototypeC:\8051\INPUT.CError 267 :’DelayX1ms ‘:requires ANSI-style prototype C:\8051\INPUT.C说明程序中有调用DelayX1ms 函数但该函数没定义即未编写程序内容或函数已定义但未作宣告解决方法编写DelayX1ms 的内容编写完后也要作宣告或作外部宣告可在delay.h 的包含档宣告成外部以便其它函数调用8 ***WARNING 1:UNRESOLVED EXTERNAL SYMBOLSYMBOL:MUSIC3MODULE:C:\8051\MUSIC.OBJ(MUSIC)***WARNING 2:REFERENCE MADE TO UNRESOLVED EXTERNALSYMBOL:MUSIC3MODULE:C:\8051\MUSIC.OBJ(MUSIC)ADDRESS:0018H说明程序中有调用MUSIC 函数但未将该函数的含扩档C 加入到工程档Prj 作编译和连接解决方法设MUSIC3 函数在MUSIC C 里将MUSIC C 添加到工程文件中去9 ***ERROR 107:ADDESS SPACE OVERFLOWSPACE: DATASEGMENT: _DATA_GOUP_LENGTH: 0018H***ERROR 118: REFERENCE MADE TO ERRONEOUS EXTERNALSYMBOL: VOLUMEMODULE: C:\8051\OSDM.OBJ (OSDM)ADDRESS: 4036H说明data 存储空间的地址范围为0~0x7f,当公用变量数目和函数里的局部变量如果存储模式设为SMALL 则局部变量先使用工作寄存器R2~R7 作暂存当存储器不够用时则会以data 型别的空间作暂存的个数超过0x7f 时就会出现地址不够的现象解决方法将以data 型别定义的公共变量修改为idata 型别的定义说明如对编译出错感兴趣的网友能否把你们常遇到的错误信息收集起来并提出最终的解决办法加以归纳以期共享10.***WARNING L15: MULTIPLE CALL TO SEGMENTSEGMENT: ?PR?_WRITE_GMVLX1_REG?D_GMVLX1CALLER1: ?PR?VSYNC_INTERRUPT?MAINCALLER2: ?C_C51STARTUP***WARNING L15: MULTIPLE CALL TO SEGMENTSEGMENT: ?PR?_SPI_SEND_WORD?D_SPICALLER1: ?PR?VSYNC_INTERRUPT?MAINCALLER2: ?C_C51STARTUP***WARNING L15: MULTIPLE CALL TO SEGMENTSEGMENT: ?PR?SPI_RECEIVE_WORD?D_SPICALLER1: ?PR?VSYNC_INTERRUPT?MAINCALLER2: ?C_C51STARTUP该警告表示连接器发现有一个函数可能会被主函数和一个中断服务程序(或者调用中断服务程序的函数)同时调用,或者同时被多个中断服务程序调用。
Keil仿真的串口仿真的调试技巧
引言在单片机系统中,串口(UART,通用异步收发接口)是一个非常重要的组成部分。
通常使用单片机串口通过RS232/RS485电平转换芯片与上位机连接,以进行上位机与下位机的数据交换、参数设置、组成网络以及各种外部设备的连接等。
RS232/RS485串行接口总线具有成本低、简单可靠、容易使用等特点,加上其历史悠久,所以目前应用仍然非常广泛;特别对于数据量不是很大的场合,串口通信仍然是很好的选择,有着广阔的使用前景。
在单片机编程中,串口占了很重要的地位。
传统方式串口程序的调试,往往是利用专用的单片机硬件仿真器。
在编写好程序后,利用仿真器来设置断点,观察变量和程序的流程,逐步对程序进行调试,修正错误。
使用硬件仿真器的确是很有效的方法,但是也有一些缺点:◆很多仿真器不能做到完全硬件仿真,因而会造成仿真时正常,而实际运行时出现错误的情况;也有仿真不能通过,但是实际运行正常的情况。
◆对于一些较新的芯片或者是表面贴装的芯片,要么没有合适的仿真器或仿真头;要么就是硬件仿真器非常昂贵,且不容易买到。
◆有时由于设备内部结构空间的限制,仿真头不方便接入。
◆有的仿真器属于简单的在线仿真型,仿真时有很多限制。
例如速度不高,实时性或稳定性不好,对断点有限制等,造成仿真起来不太方便。
1 调试前的准备工作下面介绍一种利用Keil的软件仿真功能来实现51单片机串口调试用户程序的方法。
使用这种方法,无需任何硬件仿真器,甚至都不需要用户电路板。
所需的只是:①硬件。
1台普通计算机(需要带有2个标准串口)和1根串口线(两头都是母头,连线关系如图1所示)。
②串口软件可以是自己编写的专用调试或上下位机通信软件,也可以是通用的串口软件(如串口助手、串口调试等),主要用来收发数据。
如果没有合适的串口调试软件,则可使用笔者编写的一个免费的串口小工具TurboCom。
除了与其他软件一样的数据收发功能外,它还有定时轮流发送自定义数据帧和自动应答(接收到指定数据帧后,自动返回相应的数据帧)这两个很有用的功能,特别适合于老化测试。
KEIL 调试EFM32 注意事项
北高智科技有限公司KEIL 调试EFM32注意事项Energy Micro MCU类别内容关键词EFM32KEIL MDK 摘要KEIL MDK V4.21调试EFM32的注意事项修订历史版本日期原因V1.002011/08/19创建文档目录1.问题描述 (1)2.解决方法 (2)1.问题描述本文档适用于解决KEIL MDK V4.21调试EFM32时遇到的无法在C源码窗口断点调试和System View Windows调试的问题,如下:●在KEIL MDK的C源码窗口中,双击添加断点后,程序运行时光标停止在汇编窗口,并未在C语言窗口中正确指示运行代码的位置,如所示;●进入代码Debug调试后,KEIL MDK的System View Windows不可用,如所示。
初步推断引起以上问题的原因在于KEIL MDK内部对于芯片配置文件的支持存在Bug,以下仅提供解决以上问题的方法并不对KEIL MDK所引起的问题负责。
图1现象1:无法进行断点调试图2现象2:System View Window无法使用2.解决方法使用KEIL MDK V4.21打开Simplicity Studio软件目录下的工程,点击KEIL工具栏“Options for target”按钮,执行如下配置步骤:(1)在【Device】选项页中先点击选中其他芯片,然后切换选中到目标选择芯片型号。
该步骤对整个配置过程非常关键,请勿省略。
例如调试EFM32TG840F32时,可以先选择EFM32TG840F8,然后再次选中EFM32TG840F32,该步骤操作目的是使KEIL的工程配置恢复为缺省值,然后再执行工程配置,如图3所示。
图3芯片型号选择(2)在【Target】选项页中,可根据需要选择【Use MicroLIB】选项,默认是不勾选。
该选项将使用宏库优化当前工程代码,在使用“sprintf”、“scanf”等标准库函数作为调试接口输出函数时,建议不要使用宏库优化,否则输出将异常。
keilc语言编程常见错误分析(1)
keilc语⾔编程常见错误分析(1)1. Warning 280:’i’:unreferenced local variable说明局部变量i 在函数中未作任何的存取操作解决⽅法消除函数中i 变量的宣告及即定义的参数在程序中并未调⽤2 Warning 206:’Music3’:missing function-prototype说明Music3( )函数未作宣告或未作外部宣告所以⽆法给其他函数调⽤解决⽅法将叙述void Music3(void)写在程序的最前端作宣告如果是其他⽂件的函数则要写成extern void Music3(void),即作外部宣告3Error:318:can’t open file ‘beep.h’说明在编译C:\8051\MANN.C 程序过程中由于main.c ⽤了指令#i nclude “beep.h”,但却找不到所致解决⽅法编写⼀个beep.h 的包含档并存⼊到c:\8051 的⼯作⽬录中4 Error 237:’LedOn’:function already has a body说明LedOn( )函数名称重复定义即有两个以上⼀样的函数名称解决⽅法修正其中的⼀个函数名称使得函数名称都是独⽴的5 ***WARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESSSEGMENT: ?PR?_DELAYX1MS?DELAY说明DelayX1ms( )函数未被其它函数调⽤也会占⽤程序记忆体空间解决⽅法去掉DelayX1ms( )函数或利⽤条件编译#if…..#endif,可保留该函数并不编译6 ***WARNING 6 :XDATA SPACE MEMORY OVERLAPFROM : 0025HTO: 0025H说明外部资料ROM 的0025H 重复定义地址解决⽅法外部资料ROM 的定义如下Pdata unsigned charXFR_ADC _at_0x25 其中XFR_ADC 变量的名称为0x25,请检查是否有其它的变量名称也是定义在0x25 处并修正它7 WARNING 206:’DelayX1ms’: missing function-prototype C:\8051\INPUT.CError 267 :’DelayX1ms ‘:requires ANSI-style prototypeC:\8051\INPUT.C说明程序中有调⽤DelayX1ms 函数但该函数没定义即未编写程序内容或函数已定义但未作宣告解决⽅法编写DelayX1ms 的内容编写完后也要作宣告或作外部宣告可在delay.h 的包含档宣告成外部以便其它函数调⽤8 ***WARNING 1:UNRESOLVED EXTERNAL SYMBOLSYMBOL:MUSIC3解决办法:1.是⽂件没有添加到⼯程⾥。
Keil 的调试命令、在线汇编与断点设置
Keil 的调试命令、在线汇编与断点设置上一讲中我们学习了如何建立工程、汇编、连接工程,并获得目标代码,但是做到这一步仅仅代表你的源程序没有语法错误,至于源程序中存在着的其它错误,必须通过调试才能发现并解决,事实上,除了极简单的程序以外,绝大部份的程序都要通过反复调试才能得到正确的结果,因此,调试是软件开发中重要的一个环节,这一讲将介绍常用的调试命令、利用在线汇编、各种设置断点进行程序调试的方法,并通过实例介绍这些方法的使用。
一、常用调试命令在对工程成功地进行汇编、连接以后,按Ctrl+F5 或者使用菜单Debug->Start/Stop Debug Session 即可进入调试状态,Keil 内建了一个仿真CPU 用来模拟执行程序,该仿真CPU 功能强大,可以在没有硬件和仿真机的情况下进行程序的调试,下面将要学的就是该模拟调试功能。
不过在学习之前必须明确,模拟毕竟只是模拟,与真实的硬件执行程序肯定还是有区别的,其中最明显的就是时序,软件模拟是不可能和真实的硬件具有相同的时序的,具体的表现就是程序执行的速度和各人使用的计算机有关,计算机性能越好,运行速度越快。
进入调试状态后,界面与编缉状态相比有明显的变化,Debug 菜单项中原来不能用的命令现在已可以使用了,工具栏会多出一个用于运行和调试的工具条,如图 1 所示,Debug 菜单上的大部份命令可以在此找到对应的快捷按钮,从左到右依次是复位、运行、暂停、单步、过程单步、执行完当前子程序、运行到当前行、下一状态、打开跟踪、观察跟踪、反汇编窗口、观察窗口、代码作用范围分析、1#串行窗口、内存窗口、性能分析、工具按钮等命令。
? 图1 调试工具条学习程序调试,必须明确两个重要的概念,即单步执行与全速运行。
全速执行是指一行程序执行完以后紧接着执行下一行程序,中间不停止,这样程序执行的速度很快,并可以看到该段程序执行的总体效果,即最终结果正确还是错误,但如果程序有错,则难以确认错误出现在哪些程序行。
keil 单片机不能断点的原因
Keil单片机是一种常见的嵌入式系统开发工具,它的断点功能对于程序调试和故障排查非常重要。
然而,有时候我们会发现在使用Keil单片机进行调试时,无法设置断点或者设置了断点但不能正常触发。
这时候就需要对Keil单片机不能断点的原因进行分析和排查。
一、硬件问题1. 电路连接问题:在使用Keil单片机进行调试时,首先要确认单片机与外围电路的连接是否正常。
如果存在连接不良或者电路设计问题,可能会导致单片机不能正常断点。
我们需要检查单片机与外围电路的连接情况,并确保连接正确可靠。
2. 单片机硬件故障:除了连接问题,单片机硬件本身也可能存在故障,这种情况下会导致无法正常设置断点。
为了解决这个问题,我们可以尝试在其他设备上使用Keil单片机进行调试,如果在其他设备上可以正常断点,那么可能是当前设备的单片机硬件存在问题。
二、软件问题1. Keil软件设置问题:Keil软件本身具有丰富的功能和选项,有时候我们可能会在设置上出现问题,导致不能正常设置断点。
我们需要仔细检查Keil软件的设置选项,确保断点设置正确。
2. 程序编译问题:程序编译出现错误可能会导致无法正常设置断点。
在使用Keil单片机进行调试之前,我们需要先对程序进行编译和调试,确保程序没有语法错误和逻辑错误。
三、单片机本身的限制1. 存储空间不足:一些低端的单片机可能会存在存储空间不足的问题,导致无法正常设置断点。
在这种情况下,我们需要对程序进行优化,减少代码的冗余和内存占用。
2. 单片机型号不支持:不同的单片机型号对调试功能的支持也有所不同,一些低端型号的单片机可能不支持断点功能,这时候我们需要考虑更换更高端的单片机型号。
Keil单片机不能断点的原因可能是硬件问题、软件问题或者单片机本身的限制。
在遇到这种情况时,我们需要仔细排查可能的原因,并逐一解决问题,确保单片机可以正常断点,提高程序调试的效率和准确性。
三、调试工具设置问题3.1 调试接口设置:使用Keil单片机进行调试时,需要保证调试接口设置正确。
keil调试心得
5、当编程涉及到有关通信,时序是很重要的。拉高管脚的执行速度远远比检查管脚电平的要快。
6、在等待管脚电平变化的时候,我们需要设置好超时处理,否则程序就会因为一个没有预计的错误而死锁。
7、能用C语言实现的地方,尽量不要用汇编,尤其在算法的实现,用汇编是晦涩难懂。
8、程序的几个参数数组所占篇幅很大,其中液晶背景数组最长,有四千个Byte,因而把那些初始化数组都放在另外一个C文件,在主文件使用使用关键字extern定义,这样就不会对主文件的编写造成干扰。
3、当使用Keil C跟踪程序运行状态的时候,要把引起Warning的语句屏蔽,否则有可能跟踪语句的时候会出错。
4、在调用数组的时候,Keil C是首先把数组Load进内存。如果要在C中使用长数组的时候,我们可以使用code关键字,这样就实现oad入内存的,它会直接读取Rom。
我们使用Keil C调试某系统时积累的一些经验:
1、由于Keil C对中文支持不太好,因而会出现显示的光标与光标实际所在不一致的现象,这会对修改中文注释造成影响。在Windows2000下面,我们可以把字体设置为Courier,这样就可以显示正常。
2、当使用有片外内存的MCU(如W77E58,它有1K片外内存)的时候,肯定要设置标志位,并且编译方式要选择大模式,否则会出错。
9、所有函数之间的相关性越低越有利于以后功能的扩展。
10、6.20版在编译带code关键字的数组时,编译通过但是单片机运行结果是错误的,改用6.14版后正常
Keil调试查看运行时间(精确)
Keil调试查看运⾏时间(精确)
Keil软件查看程序运⾏时间
Keil5软件调试运⾏时间,精确度很⾼,在进⾏调试前需进⾏相关设置,直接上图:
点击“Target options”设置,或者“project->Options for file”,进⼊设置界⾯如下图:
“Device”所⽤芯⽚为STM32F103VE
然后设置第⼆项“Target”如下图
芯⽚型号为Cortex-M3 的STM32F103VE,晶振选72MHz,然后设置“C/C++”:
注意程序⽂件路径。
接着是“Debug”选项:
使⽤的常⽤调试⼯具“J-link/j-trace cortex”, 注意“Utilities”选项与”Debug”⼀致为Jlink
返回“Debug”选项,点击“Settings”如下图:
必须选择“SW”模式,速率可选“500khz”,然后进⼊选项“Trace”如下:
芯⽚⼯作频率选择“72MHZ”,”SW0 Settings”的选项“Autodetect max SW0 C1”打勾选中,然后“Enable”选项打勾选中。
最后,选择相应FLASH,如下图:
点击“确定”,OK。
在调试过程查看时间:进⼊debug状态
查看左侧
时间单位为秒/s
查看两段时间间隔:
断点后延时300ms
当准确。
Keil软件仿真调试
51TRACER 仿真调试高级技巧进入调试状态后,Debug 菜单项中的命令可以使用了,有关编译的工具栏按钮消失了,出现了一个用于运行和调试的工具栏,Debug 菜单上的大部份命令都有相应的快捷按钮。
从左到右依次是复位、运行、暂停、单步跟踪、单步、执行完当前子程序、运行到当前行、下一状态、打开跟踪、观察跟踪、反汇编窗口、观察窗口、代码作用范围分析、1#串行窗口、内存窗口、性能分析、工具按钮命令;然后按一下图示第二个“运行”按钮。
连接上相关的实验资源,本实验用一条8PIN的数据排线把实验仪的CPU部份的P1口(JP44)连接到八路指示灯部份的JP32。
这时你会看到实验仪的八个红色LED,轮流点亮,表示运行成功,也可以查看相关的变量和参数,非常方便。
⒈单步跟踪运行使用菜单Debug->Step 或上图第四个单步运行按钮或使用快捷键 F11 可以单步跟踪执行程序,在这里我们按下 F11 键,即可执行该箭头所指程序行,每按一次 F11,可以看到源程序窗口的左边黄色调试箭头指向下一行,如果程序中有Delay延时子程序,则会进入延时程序中运行.⒉单步运行如果Delay 程序有错误,可以通过单步跟踪执行来查找错误,但是如果 Delay 程序已正确,每次进行程序调试都要反复执行这些程序行,会使得调试效率很低,为此,可以在调试时使用 F10 来替代 F11(也可使用菜单 Step Over 或相应的命令按钮),在 main 函数中执行到 Delay时将该行作为一条语句快速执行完毕.为了更好的进行对比,我们重新进入仿真环境,将反汇编窗口关闭,不断按 F10 键,可以看到在源程序窗口中的左边黄色调试箭头不会进入到延时子程序。
⒊全速运行点击工具栏上的“运行”按钮或按F5 键启动全速运行,全速执行程序,此时用户板上的 P1 口所接 LED 以流水灯状态显示。
⒋暂停点击工具栏上的按钮,此时用户板上的P1 口所接 LED 停止以流水灯状态显示,只有一个 LED 灯点亮(取决于暂停前的 P1 的值).⒌观察/修改寄存器的值Project 窗口在进入调试状态后显示 Regs 页的内容,包括工作寄存器 R0~R7 的内容和累加器 A、寄存器B、堆栈指针 SP 的内容。
keil的调试步骤与方法
keil的调试步骤与方法Keil调试步骤与方法Keil是一款常用的嵌入式开发环境,用于编写和调试嵌入式系统的程序。
在进行嵌入式开发过程中,调试是一个非常重要的环节,它可以帮助开发人员找出程序中存在的问题并进行修复。
本文将介绍Keil的调试步骤与方法,帮助读者更好地进行嵌入式开发与调试。
一、准备工作在使用Keil进行调试之前,我们需要先进行一些准备工作。
首先,我们需要安装Keil软件,并配置好开发板的硬件环境。
其次,我们需要将待调试的程序下载到开发板中,并连接上调试器。
最后,我们需要在Keil中打开待调试的项目文件,以便进行后续的调试操作。
二、设置断点在进行程序调试时,我们常常需要在程序中设置断点,以便在指定位置停下来观察程序的执行情况。
在Keil中,我们可以通过单击代码行号的方式来设置断点。
当程序执行到设置的断点位置时,会自动停下来,以便我们观察相关的变量值和程序执行流程。
三、单步执行单步执行是调试过程中常用的操作之一,它可以使程序以单步的方式执行,以便我们逐行观察程序的执行情况。
在Keil中,我们可以通过点击工具栏上的“单步执行”按钮来进行单步执行操作。
在单步执行过程中,我们可以观察变量的值的变化,以及程序的执行流程,帮助我们找出程序中的问题。
四、观察变量值在调试过程中,我们经常需要观察程序中的变量值,以便判断程序的执行是否符合预期。
在Keil中,我们可以通过“观察窗口”来观察变量的值。
在观察窗口中,我们可以添加需要观察的变量,并在程序执行过程中实时查看其数值的变化。
五、查看寄存器值在嵌入式系统中,寄存器是非常重要的硬件资源,它们直接影响着程序的执行。
在Keil中,我们可以通过“寄存器窗口”来查看寄存器的值。
在寄存器窗口中,我们可以查看各个寄存器的当前值,以便判断程序的执行是否符合预期。
六、调试输出除了观察变量和寄存器的值外,我们还可以通过调试输出来观察程序的执行情况。
在Keil中,我们可以使用printf函数来进行调试输出。
keil-c语言编程常见错误分析
keil-c语⾔编程常见错误分析1. Warning 280:’i’:unreferenced local variable说明局部变量i 在函数中未作任何的存取操作解决⽅法消除函数中i 变量的宣告及即定义的参数在程序中并未调⽤2 Warning 206:’Music3’:missing function-prototype说明Music3( )函数未作宣告或未作外部宣告所以⽆法给其他函数调⽤解决⽅法将叙述void Music3(void)写在程序的最前端作宣告如果是其他⽂件的函数则要写成extern void Music3(void),即作外部宣告3Error:318:can’t open file ‘beep.h’说明在编译C:\8051\MANN.C 程序过程中由于main.c ⽤了指令#i nclude “beep.h”,但却找不到所致解决⽅法编写⼀个beep.h 的包含档并存⼊到c:\8051 的⼯作⽬录中4 Error 237:’LedOn’:function already has a body说明LedOn( )函数名称重复定义即有两个以上⼀样的函数名称解决⽅法修正其中的⼀个函数名称使得函数名称都是独⽴的5 ***WARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_DELAYX1MS? DELAY说明DelayX1ms( )函数未被其它函数调⽤也会占⽤程序记忆体空间解决⽅法去掉DelayX1ms( )函数或利⽤条件编译#if …..#endif,可保留该函数并不编译6 ***WARNING 6 :XDATA SPACE MEMORY OVERLAPFROM : 0025HTO: 0025H说明外部资料ROM 的0025H 重复定义地址解决⽅法外部资料ROM 的定义如下Pdata unsigned char XFR_ADC _at_0x25 其中XFR_ADC 变量的名称为0x25,请检查是否有其它的变量名称也是定义在0x25 处并修正它7 WARNING 206:’DelayX1ms’: missing function-prototypeC:\8051\INPUT.CError 267 :’DelayX1ms ‘:requires ANSI-style prototypeC:\8051\INPUT.C说明程序中有调⽤DelayX1ms 函数但该函数没定义即未编写程序内容或函数已定义但未作宣告解决⽅法编写DelayX1ms 的内容编写完后也要作宣告或作外部宣告可在delay.h 的包含档宣告成外部以便其它函数调⽤8 ***WARNING 1:UNRESOLVED EXTERNAL SYMBOLSYMBOL:MUSIC3解决办法:1.是⽂件没有添加到⼯程⾥。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.keil debug中选择ST-Link调试时,弹出内存出错。
把能调试的程序的*.uvopt文件替换就行了。
(uvopt和uvproj都是keil工程文件,共同说明这你工程里有哪些文件,文件有没有被编译过,工程目录树是怎么组织的等等信息)
2.调试时点运行,程序会停在在startup_stm****.s处
勾选上即可。
3.局部变量显示<not in scope>。
修改options->c/c++中的优化等级
4.peripherals选项不全
Debug调试的动态链接库针对的是CM3的,改成STM的,修改如下:
5. MDK实时更新WATCH窗口
View-> Periodic Window Update,勾选
6.软件仿真时停在等待HSE处
修改Debug中的参数
7.使用printf时,串口输出中文时乱码
使用记事本打开文件,点击另存为,在右下方选择编码方式为ANSI,替换原文件,重新编译。