野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 22044|回复: 3

提交红外遥控器实验的一个BUG

[复制链接]
发表于 2014-4-25 12:00:14 | 显示全部楼层 |阅读模式
在红外遥控器试验中,按+、2、4这3个键将产生总线Fault然后上访成硬Fault,导致程序卡在硬Fault中断的死循环里。
原因是这3个键的键值小于32(0x20),这样在ascii表里不是字符,在LCD_DispStr函数里“i = ascii - ' ';”这一句会产生负数,负数作为一个数组的下标将产生精确的数据访问违例(总线Fault的一种)。
解决方法:
main函数中的:
sprintf(lcd_key_val,"key_val:%c",key_val);
LCD_DispStr(30, 40, lcd_key_val, RED);
这两行代码改成:
sprintf(lcd_key_val,"key_val:%d",key_val);
LCD_DispStr(30, 40, "key_val:   ", RED);   
LCD_DispStr(30, 40, (uint8_t *)lcd_key_val, RED);
第一行结果以数字形式显示键值,这样就解决了上述BUG。
再加上第二句,是为了使显示完三位数的键值后再显示两位数或者一位数键值时上一次的三位数字后面的数字还存在。
第三行增加了个数据类型转换。虽然不加效果一样,但是有个warning,毕竟不是什么好事。光盘中的《编程修养.pdf》中第31条:不要忽略Warning.

望采纳!
回复

使用道具 举报

发表于 2014-4-25 12:03:13 | 显示全部楼层
2 和 4 小于 0x20 ?

是 字符 2 还是数值 2?
回复 支持 反对

使用道具 举报

发表于 2014-4-25 12:05:16 | 显示全部楼层
很好,后面我们修改一下这个程序
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-25 12:05:45 | 显示全部楼层
王清铭 发表于 2014-4-25 12:03
2 和 4 小于 0x20 ?

是 字符 2 还是数值 2?

按遥控器上的“+”、“2”、“4”键,得到的键值是2、24、16,这3个值在ascii表中不是字符。在LCD_DispStr函数里“i = ascii - ' ';”这一句会产生负数,负数作为一个数组的下标将。。。空格的ascii码是32
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 01:52 , Processed in 0.033146 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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