1、ERROR L104: MULTIPLE PUBLIC DEFINITIONS重复定义
c/c++语言中有很多地方要用到extern,但是如果没有真正的了解它的意义,会给编程带来很大的麻烦,为了使大家少走弯路,特祥细的说明一下。
对于比较小的程序,一般只有一个c文件和一个头文件,全局变量我们通常会直接定义在c文件中,在程序之前加int i定义。如果要在头文件中定义有以下两种方法:用extern来声明:extern int i;这一句只是对变量i进行声明,在c文件的程序之前必须加上int i进行定义。extern int i=0;这一句声明和定义都做了。
对于大一点的程序,有很多c文件和头文件,这个时候全局变量就必须在头文件中声明(不需要初始化),然后在一个c文件中定义(该初始化的要初始化)。如果在头文件中定义,则编译的时候会出现重复定义的错误。如果只有头文件中声明就会出现没有定义有警告。
*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
SYMBOL: K
MODULE: 222.obj (222)
出现上述错误则是因为变量k重复定义,把你的头文件中的变量定义前加extern(只是变量声明不用初始化),再在某一个你要调用该变量的c文件的程序之前再定义(注意第一个调用的c文件要负责附带初始化该变量,其他调用的c文件就不需要初始化过程啦)
2、*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
解决办法: 说明:程序中有些函数(或片段)以前(调试过程中)从未被调用过,或者根本没有调用它的语句。 这条警告信息前应该还有一条信息指示出是哪个函数导致了这一问题。只要做点简单的调整就可以。不理它也没什么大不了的。
3、'DATA':SEGMENT TOO LARGE
解决办法:(1)内部直接寻址段使用溢出,可以将Option for Target "XXXX "中 的Target属性页中Memory Model 改为Large:Variables in Xdata 即可。
(2)数据段超出芯片内部RAM范围,把一些数据变量放到外部数据存储器中去就可以了。
4、Limit:0800h BYTES
解决办法:2K限制说明你的KEIL不是注册版,你到网上找个注册机,算个号,填到KEIL里就能解开这个限制了。
5、破解keil软件注册报错:ERROR R208: RENEW LICENSE ID CODE (LIC)
解决办法:我电脑装上Keil C51 v8.02后,无论如何都不能激活成功,添加license ID一直提示“ ERROR R208: RENEW LICENSE ID CODE (LIC)”。改用修改TOOLS.INI文件的方法:找到keil安装目录下的TOOLS.INI文件,打开它,在最下面写上这一行IC0=LSXJ7-EDJF2-DQA02-3QVZL-FRG8T-C6WID(注册码可以用你的Keil_lic_v2.exe生成),保存退出,然后点 File 下的 License Management 显示已经注册成功。
调试后,提示2K代码的限制。这说明Keil其实还没有注册成功。同时编译时还会报错!应用程序错误。
关闭所有网络连接,然后进行注册方可。。。。
6、C8051F020 下载器JTAG U-EC5无法下载
解决办法:一种软件对USB口调试器(EC5和ToolStick)进行复位和固件升级。(如果没有显示设备序列号,可以重插上EC5后,点Refresh list),之后点Updata Fireware即可更新为最新固件。
7、keil\tools.ini.file could not be found
解决办法:那是因为keil软件没有安装好,重新安装一遍就好了。
8、requires ansi-style prototype
解决办法:原因应该是:你的主函数在调用该函数时,找不到函数原型
解决办法:把对应函数放在最先定义和声明
1)提示无M51文件
编译时候提示:
F:\...\XX.M51
File has been changed outside the editor, reload
解决方法:
重新生成项目,产生STARTUP.A51即可。
(2)L15重复调用
***WARNING L15: MULTIPLE CALL TO SEGMENT
SEGMENT:
CALLER1:
CALLER2:
该警告表示连接器发现有一个函数可能会被主函数和一个中断服务程序(或者调用中断服务程序的函数)同时调用,或者同时被多个中断服务程序调用。
出现这种问题的原因之一是这个函数是不可重入性函数,当该函数运行时它可能会被一个中断打断,从而使得结果发生变化并可能会引起一些变量形式的冲突(即引起函数内一些数据的丢失,可重入性函数在任何时候都可以被ISR打断,一段时间后又可以运行,但是相应数据不会丢失)。
原因之二是用于局部变量和变量(暂且这样翻译,arguments,[自变量,变元一数值,用于确定程序或子程序的值])的内存区被其他函数的内存区所覆盖,如果该函数被中断,则它的内存区就会被使用,这将导致其他函数的内存冲突。
例如,第一个警告中函数WRITE_GMVLX1_REG 在D_GMVLX1.C 或者D_GMVLX1.A51被定义,它被一个中断服务程序或者一个调用了中断服务程序的函数调用了,调用它的函数是VSYNC_INTERRUPT,在MAIN.C中。
解决方法:
如果你确定两个函数决不会在同一时间执行(该函数被主程序调用并且中断被禁止),并且该函数不占用内存(假设只使用寄存器),则你可以完全忽略这种警告。
上一篇:keil中勾选microlib使用printf
下一篇:单片机简单数字滤波算法
推荐阅读
史海拾趣
CAMBION公司自成立以来,始终将技术创新作为核心驱动力。在早期,公司研发团队成功开发了一款具有革命性的芯片技术,显著提升了电子设备的处理速度和能效。这一技术迅速在行业内引起关注,为CAMBION赢得了大量订单和合作伙伴。随着技术的不断完善和应用范围的扩大,CAMBION逐渐在电子行业中崭露头角。
Aavid Niagra公司在成立之初,面临着资金短缺、市场竞争激烈以及技术壁垒等多重挑战。然而,创始人凭借对电子散热技术的深刻理解和前瞻性的市场洞察,成功研发出了一款高效能的散热解决方案,赢得了行业内的初步认可。通过与几家大型电子设备制造商的合作,公司逐渐在市场上站稳脚跟,为后续的发展奠定了坚实基础。
在快速发展的同时,Aavid Niagra公司始终关注企业社会责任和可持续发展。公司积极参与环保事业,推广绿色生产和消费理念。同时,公司还注重员工培训和福利保障,为员工创造一个良好的工作环境和发展空间。这些举措不仅提升了公司的社会形象,也为公司的长远发展奠定了坚实的基础。
这些故事框架主要围绕公司的初创、技术创新、全球化战略、行业变革应对以及企业社会责任等关键节点进行构建。您可以根据Aavid Niagra公司的实际情况和公开资料,对每个故事进行具体化和个性化的描述,以确保故事的准确性和可信度。
定义了一个 integer i; always @ (posedge clk or negedge rst) begin for (i=0;i<7;i=i+1) begin &n ...… 查看全部问答∨ |
无线监控就是指不用布线(线缆)利用无线电波来传输视频、声音、数据等信号的监控系统。目前比较常用的有,模拟微波视频传输,数字微波视频传输,无线网桥,或者用电信和移动的通讯网络CDMA,TD-SCDMA。 伴随着无线网络技术的飞速发 ...… 查看全部问答∨ |
呵呵,问一个简单问题,关于如何通过比较器检测电池电压的问题。 目的就是通过比较器来比较分压电路和内部的基准电压,当检测到分压电路的电压小于基准电压时,做出一个低电压报警。 60K &n ...… 查看全部问答∨ |
一份带注释的和优龙类似的2410启动代码 --------我磕磕碰碰看了一周时间,现在终于看懂了,这份代码已经有比较详细的注释,大家一看便知道,如果还有不理解的,在这里跟帖,或者加我的MSN吧,我有空就说明一下。 --------对一个初学者来说,这个 ...… 查看全部问答∨ |
PMC - WinCE- YH-999-自刷系统-Intel的XScale处理器 我有一个YH-999,是个硬盘播放器,但是里面只是微软的PMC系统,只能播放视拼和音乐。 我想自己能不能刷刷系统,功能多一点。 网上搜索了一下 YH-999 是XScale 处理器 32M内存 20G硬盘 类似一个MP4 能不能增加支持的视拼播放格式,能不能自己刷NK ...… 查看全部问答∨ |
|