一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 1755|回复: 7

[其他综合] 请教一个Keil调试的疑问

[复制链接]
发表于 2014-8-20 20:11 | 显示全部楼层 |阅读模式
本帖最后由 gongzhu 于 2014-8-20 20:43 编辑

编的一个gps串口测试程序,下载单片机后经常会不定时地死机,电脑同步接收gps数据却是正常的。现直接用keil的debug功能,把电脑串口与keil绑定后测试常死在以下 0x1781-0x1783 循环中:


快照1.png


C:0x1781 行汇编码跟宏定义#define SPACE_PARITY    4 有什么关系?再就是这段代码中C语言的全局定义与后面的函数代码怎么在汇编中都混着了



发表于 2014-8-20 21:13 | 显示全部楼层
C还不会,瞎说一下吧;#define 是宏定义,是指在该行之后, 代码中出现的SPACE_PARITY都用4代替 ,和汇编没有任何关系,所以在程序编译后汇编是不会有任何体现的;
下载单片机后经常会不定时地死机”,这个不是死机,而是陷入死循环了,0x1781是取P0口状态到累加器Acc中,0x1783是判断,Acc.7(这里也即P.07的I/O状态)如果是高电平,即跳转到C:1781(也即你说的C:0x1781行)处执行,为低电平就继续往下执行,从你的测试结果来看是因为没法满足P0.7口为低电平状态,单片机才陷入死循环的,而电脑仅同步接收gps数据,无需判断执行,当然就不会出问题了



回复

使用道具 举报

发表于 2014-8-20 20:14 | 显示全部楼层
C:1781只是行序号,没有任何实际意义

点评

我说的是C:1781这行汇编码。按常理,汇编跟C代码应该是挨着的  发表于 2014-8-20 20:18
回复

使用道具 举报

发表于 2014-8-20 21:18 | 显示全部楼层
mov a p0
jb  0xE0.7 , C:1781

是否是循环检测 P0.7  是否为低电平?????
回复

使用道具 举报

 楼主| 发表于 2014-8-20 22:50 | 显示全部楼层
lyxing 发表于 2014-8-20 21:18
mov a p0
jb  0xE0.7 , C:1781

获益匪浅,这段是检查LCD忙的,因为keil没法获取LCD数据所以死循环了。

/*12864液晶显示屏并口驱动程序--------------------------------------------------------*/
//检查忙位
void chk_busy()
{
   LCM_RS=0; LCM_RW=1; LCM_EN=1;
   Lcd_Bus=0xff;
   while((Lcd_Bus&0x80)==0x80);
   LCM_EN=0;
}


单片机中LCD是没有问题的,显然单片机不是死循环在这里,明天再查查

回复

使用道具 举报

发表于 2014-8-20 23:24 | 显示全部楼层
看1781行以前是在操作液晶的。
这里应带是在读取液晶的状态。
似乎应该是在读取1602的非忙标记。
不知道你液晶显示是否正常。
或是P0.7共用了其他的器件。
1602的忙检测可以忽略,一般正常时序操作很少碰到忙的,

这种死等循环最好少用,容易出问题。
回复 1 0

使用道具 举报

发表于 2014-9-4 23:26 | 显示全部楼层
kangdage 发表于 2014-8-20 23:24
看1781行以前是在操作液晶的。
这里应带是在读取液晶的状态。
似乎应该是在读取1602的非忙标记。

支持楼上的说法,1602可以省去读状态,只写,而且可以省一个读状态的IO口,用4位数据线,还可以省下4个IO,这样对于IO口紧张的单片机很有帮助。
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-10-31 12:28 , Processed in 0.038555 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表