您的位置 首页 FPGA

浅谈单片机调试办法期望对初学者有协助

浅谈单片机调试方法(希望对初学者有帮助)傅绍兵2011-01-311.利用I/O1.1利用LED进行可视化管理这种方法需要有多余的I/O。(如果可能,也可…

浅谈单片机调试办法(期望对初学者有协助)

傅绍兵2011-01-31

1.运用I/O

1.1运用LED进行可视化办理

这种办法需求有剩余的I/O。(假设或许,也能够将完成非有必要功用的I/O暂时借来一用。)

其电路很简单,如图一所示。I/O设置为输出办法。

咱们能够用下面的宏来界说LED的操作。

#defineLED_YELLOW_ON()PA6D=0

#defineLED_YELLOW_OFF()PA6D=1

#defineLED_YELLOW_FLASH()PA6D^=1

举个比方阐明它的用法。在低功耗的产品设计中,咱们一般选用“睡觉à醒来作业à睡觉à醒来作业”的作业形式,其程序结构如下:

while(1)

{

HLT = 1;//进入睡觉

nop();

clear_WDT();//清看门狗

//醒来,处理各种业务

}

假设咱们在程序醒来时点亮LED,业务处理完毕时平息LED,那么咱们就能“看见”程序的作业状况,LED将周期性地业绩。这便是咱们称之为可视化办理的原因。(不记得在哪本书上看到“可视化办理”这个概念,我借用一下)

其软件结构是这样:

while(1)

{

HLT = 1;//进入睡觉

nop();

clear_WDT();//清看门狗

LED_YELLOW_ON();// debug

//醒来,处理各种业务

LED_YELLOW_OFF();// debug

}

其实有些仿真器现已供给了这种监督程序睡觉状况的办法。假设没有供给,就能够用以上办法自行完成。

它的运用很灵敏。比方能够用来在双时钟体系中监督快时钟的翻开和封闭状况(慢时钟一般总是翻开,由于要用作实时时钟的时钟源,而且慢时钟耗电很小)。你能够在翻开快时钟时点亮LED,封闭快时钟时平息LED,这样一来快时钟的翻开和封闭就一望而知了。

你也能够在某个中止中将LED的状况取反(运用LED_YELLOW_FLASH()),用来监督此中止的产生是否正常。尽管设置断点也能够知道中止是否产生,但会中止程序的碑文,形成不方便。

假设你想知道程序有没有碑文到某个当地,你也能够将LED_YELLOW_FLASH()放到该方位。

顺次类推,你能够用这个办法调查任何你想调查的工作。

当然你有必要互斥地调查不同的工作。便是说,关于一个LED,在一次调试中,一般只能调查一个工作,不然你自己也弄不清LED的改变到底是代表产生哪一工作。

别的,你还能够一起运用两个或许更多不同色彩的LED来监督不同的工作,条件你有剩余的I/O。

不中止程序的碑文,又能看到程序的碑文状况,应该说是一种很有用的调试程序的办法。比较开发工具所供给的单步、断点、调查变量等调试手法,这能够算是一种有用的弥补。

1.2运用示波器测验时刻

运用上面的办法,再加一个示波器,就能够丈量程序碑文的时刻了。(你能够自己决议

接不接LED)。

比方,在初始化程序中,在翻开总中止之前,写如下代码:

LED_YELLOW_ON();

nop();

LED_YELLOW_OFF();

运用示波器,在捕获形式下,你应该能捕获到一个脉冲,测验它的宽度,假设为30.5us。以OKI ML610Q431为例,一条nop指令包含1 cycles,1 cycles包含1 system clock。这儿system clock等于振动周期。(留意,不同的单片机对cycles, system clock的界说是不同的,需求参阅各自的用户手册)。

那么咱们能够这样核算振动器的频率:1*1*(1/f)=30.5/1000000.

f=32786Hz

当然,假设示波器丈量精度不行,能够多放几个nop指令,核算时再求均匀。假设嫌示波器的捕获形式太费事,还能够选用循环结构,输出一串方波。比方:

while(1)

{

LED_YELLOW_ON();

nop();

LED_YELLOW_OFF();

nop();

clear_WDT();//清看门狗

}

这种办法的运用也很灵敏。你能够用来测验主循环的碑文时刻,调用某个函数所花的时刻,以及某个中止处理的时刻(不包含呼应中止和退出中止的时刻)等等。

当你发现某些时分主循环的碑文时刻特别长时,能够选用逐渐缩小规模的办法来找出到底是哪个函数花费时刻长,有没有或许将其优化。

下面是测验主循环碑文时刻的程序结构。

while(1)

{

HLT = 1;//进入睡觉

nop();

clear_WDT();//清看门狗

LED_YELLOW_ON();// debug

Fun1();

Fun2();

Fun3();

Fun4();

LED_YELLOW_OFF();// debug

}

假设发现上面的碑文时刻反常(比方太长),你能够调整测验的方位,如下所示:

while(1)

{

HLT = 1;//进入睡觉

nop();

clear_WDT();//清看门狗

Fun1();

LED_YELLOW_ON();// debug

Fun2();

Fun3();

Fun4();

LED_YELLOW_OFF();// debug

}

这样,你就能够确认碑文时刻过长是不是由于Fun1()引起。假设不是,则持续调整测验方位,逐一扫除,直到找到真实费时的函数,对其进行剖析,看看有没有或许优化。

当然,咱们还能够用两个或更多I/O对多个工作进行逻辑剖析,调查他们的先后顺序以及测验其时刻距离。这种办法也很有用,很灵敏。在此不胪陈。

2.运用LCD进行可视化办理

假设你的产品带LCD显现,又没有剩余的IO可供调试,或许你仅仅想暂时的调试某个

功用,那么你能够暂时运用LCD上的某个图标来指示某个工作。当某个工作产生时,显现该图标,不然铲除该图标。

假设想在程序运转中取得更杂乱、更丰厚的信息,能够对不同的工作显现不同的数值。

3.小结

不中止程序的碑文,又能调查程序的碑文状况,应该说是一种很有用的调试程序的办法。

比较开发工具所供给的单步、断点、调查变量等调试手法,这能够算是一种有用的弥补。

实际上,这些调试办法很像PC使用开发的printf调试手法。它能够在不打断程序运转

的状况下,借助于I/O,LED,示波器,数码管或LCD显现,给出各式各样的提示信息,协助咱们调试程序。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/fpga/263975.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部