extern问题单片机笔记.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
问题一 老师,你好! ????我在使用keil编译多c文件工程时,发现一个问题:首先,我在main函数所在文件mainf.c中定义:“uchar idata cntfrqbuf[2];”和“uchar idata cntembuf=0;”; 然后,因为okuart.c同样要用到“cntfrqbuf[2]”和“cntembuf”,所以我在okuart.c中声明:“extern uchar cntfrqbuf[2];”和“extern uchar cntembuf;”;但是编译时,出现警告,并因此无法生成目标文件,提示如下: *** ERROR L102: EXTERNAL ATTRIBUTE MISMATCH ????SYMBOL:??CNTFRQBUF ????MODULE:??okuart.obj (OKUART) *** ERROR L102: EXTERNAL ATTRIBUTE MISMATCH ????SYMBOL:??CNTEMBUF ????MODULE:??okuart.obj (OKUART) *** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL ????SYMBOL:??CNTEMBUF ????MODULE:??okuart.obj (OKUART) ????ADDRESS: 02EEH *** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL ????SYMBOL:??CNTFRQBUF ????MODULE:??okuart.obj (OKUART) ????ADDRESS: 0306H Program Size: data=130.5 xdata=0 code=2576 Target not created 因为这件事我已经浪费2天时间了,除了不采用多c文件工程的方法外,一直没有想到可行办法,但是,我非常想使用多c文件工程,感觉这样比较清晰易读。请问老师,我该怎样处理呢?非常感谢 为了这个问题,浪费好长时间,挤进了脑汁,伤透了脑筋,曾一度有个现在看来应该是挺好笑的想法——怀疑keil不向标准c一样,不能很好的支持多c文件工程,在多c文件共享变量时,尚无法很好处理。 ????不过就在要点发送帖子按的一瞬间,偶却有了灵感,并通过验证,知道如何解决了。然后再接着想下去,通过实验,有个更多收获: ????1)如果两个或更多c文件都需要使用某非bit型变量,那么声明是应将相应存储类型同时注明,即如果定义“uchar idata cntembuf;”,那么应声明为“extern uchar idata cntembuf;”或者“extern idata cntembuf;”; ????2)如果是bit型变量,则数据类型“bit”必须注明,而存储类型可以省略; ????LN认为,keil里之所以将bit变量和其他类型变量分开处理,是keil面向的处理器都是51内核的,而51内核bit变量只存在于特殊功能寄存器和内存的位寻址区(bdata区),而特殊功能寄存器中的位变量若在两个以上文件中使用各各文件都只能用类似于sbit abcd = P1^6;的形式进行声明,并且keil不检测abcd这个位变量在不同文件中是否代替相同位(例如,可以在另一个c文件中声明为:sbit abcd = P0^5;等),这样一来,用extern声明的bit变量就只有在bdata区了,所以,允许在在一个c文件中定义位变量后,在其它c文件中省略“bdata”这个存储类型; 而非bit型变量则可以在特殊功能寄存器,内存,外存,所以声明时要使存储类型与定义时的存储类型相同(也可以在定义和声明时都不规定存储类型,而又编译器根据编译模式自动分配)。 ??? 感觉今天这事真有点搞笑,不过说明:交流是非常有用的。因为尽管帖子未能发出,但是在要跟他人交流时,人会不自觉的将所要描述给他人的问题屡一下头绪,而往往就这么一屡,可能就让自己有了办法。当然很多时候怎么屡也不行,这时候就要靠别人直接教了。sbit映射到IO口(P1^1这种IO口的“位”) bit在RAM中的可位寻址空间中,一般用作程序判断的标志位。 你可以认为它们一个对外(sbit),一个对内(bit)。 对Keil C51中变量与函数的声明和定义纠结问题的思考 目前,我发现的规律如下: 对于变量: 1、可以考虑写成头文件的形式,如: #ifndef _LED_H_ #define _LED_H_ sbit led=P1^0; ? ? ? ? ? //加extern后,错误为:syntax error near sbit,也就是说用头文件定义变量时,只要在需要用的地方加

文档评论(0)

185****7617 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档