extern问题单片机笔记.doc

extern问题单片机笔记.doc

ID:51688519

大小:40.95 KB

页数:2页

时间:2020-03-15

extern问题单片机笔记.doc_第1页
extern问题单片机笔记.doc_第2页
资源描述:

《extern问题单片机笔记.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、问题一老师,你好!    我在使用keil编译多c文件工程时,发现一个问题:首先,我在main函数所在文件mainf.c中定义:“ucharidatacntfrqbuf[2];”和“ucharidatacntembuf=0;”;然后,因为okuart.c同样要用到“cntfrqbuf[2]”和“cntembuf”,所以我在okuart.c中声明:“externucharcntfrqbuf[2];”和“externucharcntembuf;”;但是编译时,出现警告,并因此无法生成目标文件,提示如下:***ERRORL102:EXTERNALATTRIBUTEMI

2、SMATCH    SYMBOL:  CNTFRQBUF    MODULE:  okuart.obj(OKUART)***ERRORL102:EXTERNALATTRIBUTEMISMATCH    SYMBOL:  CNTEMBUF    MODULE:  okuart.obj(OKUART)***ERRORL118:REFERENCEMADETOERRONEOUSEXTERNAL    SYMBOL:  CNTEMBUF    MODULE:  okuart.obj(OKUART)    ADDRESS:02EEH***ERRORL118:REFERENC

3、EMADETOERRONEOUSEXTERNAL    SYMBOL:  CNTFRQBUF    MODULE:  okuart.obj(OKUART)    ADDRESS:0306HProgramSize:data=130.5xdata=0code=2576Targetnotcreated因为这件事我已经浪费2天时间了,除了不采用多c文件工程的方法外,一直没有想到可行办法,但是,我非常想使用多c文件工程,感觉这样比较清晰易读。请问老师,我该怎样处理呢?非常感谢为了这个问题,浪费好长时间,挤进了脑汁,伤透了脑筋,曾一度有个现在看来应该是挺好笑的想法——怀疑k

4、eil不向标准c一样,不能很好的支持多c文件工程,在多c文件共享变量时,尚无法很好处理。    不过就在要点发送帖子按的一瞬间,偶却有了灵感,并通过验证,知道如何解决了。然后再接着想下去,通过实验,有个更多收获:    1)如果两个或更多c文件都需要使用某非bit型变量,那么声明是应将相应存储类型同时注明,即如果定义“ucharidatacntembuf;”,那么应声明为“externucharidatacntembuf;”或者“externidatacntembuf;”;    2)如果是bit型变量,则数据类型“bit”必须注明,而存储类型可以省略;    

5、LN认为,keil里之所以将bit变量和其他类型变量分开处理,是keil面向的处理器都是51内核的,而51内核bit变量只存在于特殊功能寄存器和内存的位寻址区(bdata区),而特殊功能寄存器中的位变量若在两个以上文件中使用各各文件都只能用类似于sbitabcd=P1^6;的形式进行声明,并且keil不检测abcd这个位变量在不同文件中是否代替相同位(例如,可以在另一个c文件中声明为:sbitabcd=P0^5;等),这样一来,用extern声明的bit变量就只有在bdata区了,所以,允许在在一个c文件中定义位变量后,在其它c文件中省略“bdata”这个存储类

6、型;而非bit型变量则可以在特殊功能寄存器,内存,外存,所以声明时要使存储类型与定义时的存储类型相同(也可以在定义和声明时都不规定存储类型,而又编译器根据编译模式自动分配)。   感觉今天这事真有点搞笑,不过说明:交流是非常有用的。因为尽管帖子未能发出,但是在要跟他人交流时,人会不自觉的将所要描述给他人的问题屡一下头绪,而往往就这么一屡,可能就让自己有了办法。当然很多时候怎么屡也不行,这时候就要靠别人直接教了。sbit映射到IO口(P1^1这种IO口的“位”)bit在RAM中的可位寻址空间中,一般用作程序判断的标志位。你可以认为它们一个对外(sbit),一个对内

7、(bit)。对KeilC51中变量与函数的声明和定义纠结问题的思考目前,我发现的规律如下:对于变量:1、可以考虑写成头文件的形式,如:#ifndef_LED_H_#define_LED_H_sbitled=P1^0;     //加extern后,错误为:syntaxerrornearsbit,也就是说用头文件定义变量时,只要在需要用的地方加上这个头文件#endif           //不把它当外部变量且赋值是必须的。把它保存到Keil安装目录INC文件夹中后,在所有用到此变量的C文件中写上:include"led.h"。编译时是正确的。2、也可以在主C文件

8、中“定义”变量,然后在需

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。