完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 dark_sky 于 2016-12-27 11:01 编辑
一直意识里认为keil C51是有数据类型的检查的,比如声明和定义的数据类型不一致就会报错误或警告,但昨天才发现这个认识需要改变下了:keil C51好像在有存储模式的说明时就只检查了存储模式(data、xdata等),而对数据类型不检查了(int、char、long等),由此数据在定义和声明引用时如果错误使用了不同数据类型就会导致数据发生非预期的改变或错误。 昨天搞个程序,以前就写好的,现在整机调试下,结果发现有个通道的实时的数据总是在另外一个独立通道运行时出现错误,莫名的就改变了,搞了好大半天,查了越界操作,都没有问题。最后又去看了M51文件,发现这个数据的长度不对,预期它应该是个int,也就是占2字节,但M51显示下一字节被占用了,也就是它实际只有一个字节。于是问题就清楚了,肯定是程序里有地方对它的定义或声明有问题,所有的声明头文件和使用的方式都是按extern WORD xdata,返回来去看定义,果然是UCHAR xdata,但是奇怪,为什么没有提示报错呢?好吧,先把这个错误解决掉,调试OK。然后有兴趣再看看是不是预期的那个样子,所以有了在名为my_data.c中定义“volatile unsigned char idata test1=0;”,然后在一个使用到的文件中直接声明成“extern idata long test1;”并在函数中作为延时数据,然后编译链接,竟然真的没有问题通过了。各种挪移试验,呵呵,直到去掉idata的声明时link就会报错,所以是不是数据类型检查只检查一种呢。 个人的一点见解,也许不对,也不去找文件支持了,只希望提供一种可能的有效排错方法,有类似经历或其它看法的看官们可以来研究讨论下,呵呵。 |
|
相关推荐 |
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
7 浏览 0 评论
26 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
13 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
644 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1000 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11771 浏览 31 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 18:17 , Processed in 0.570420 second(s), Total 43, Slave 33 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号