历史上的今天
返回首页

历史上的今天

今天是:2024年11月28日(星期四)

正在发生

2019年11月28日 | PICC使用中初学者容易犯得两个错误

2019-11-28 来源:eefocus

我是初次使用PIC单片机,对PICC的编程规范不了解,在编译程序时老是出问题。现在介绍两个最常见的问题给大家,看看有没有和我遇到一样问题的。


错误1:变量定义赋值先后顺序问题很重要

开发环境为MPLAB IDE V7.43 + PICC 。如下两种代码书写方式,在补充完整之后,哪一个会编译出错?( flag_sendKeyByte 为全局位变量,已定义过)

A:

flag_sendKeyByte = 0; 
 unsign char mbit = 0;

B: 
 unsign char mbit = 0; 
 flag_sendKeyByte = 0;

使用正常的C语言习惯来看,似乎都没问题,都是赋值,仅仅是先后位置不一样。但是在PIC单片机的编译环境下,A是错误的,B是正确的。


在出现这一编译错误时,我查找了很久。由于初次接触PIC,了解不多,导致走了很多弯路。最后逐行删除代码,逐行修改,最后才发现是次序错了。


PIC 单片机的编译环境要求变量赋值必须在变量定义之后。而不允许在给一个变量赋值后再去定义另一个变量并赋值。似乎是因为编译环境在赋值之前会先处理所有的变量定义。如果检测到一个变量赋值语句则该函数或子程序后面的定义它将不再检查,导致最后编译的时候出现某些变量未定义。


(注:以上这些分析是我自己揣摩的,可能分析的不对,还请高手指正)

可笑的是,编译出错的提示信息却是乱七八糟的,而不是说存在未定义的变量。下面的提示就是我编译时提示的,对一个初学者来说,根据这些提示能找到错误源吗?

Error[000] D:documentsPICtestkeyboardps2.c 387 : probable missing '}' in previous block 
Error[000] D:documentsPICtestkeyboardps2.c 388 : undefined identifier: ch 
Error[000] D:documentsPICtestkeyboardps2.c 388 : constant expression required 
Warning[000] D:documentsPICtestkeyboardps2.c 390 : missing basic type: int assumed 
Error[000] D:documentsPICtestkeyboardps2.c 390 : type redeclared 
Error[000] D:documentsPICtestkeyboardps2.c 390 : identifier redefined: calc_parity (from line 64) 
Error[000] D:documentsPICtestkeyboardps2.c 390 : constant expression required

....

后面还有很多,一直到程序的最后都会提示出错。把A中的写法换成B的写法,编译就成功了。


感觉这个编译环境太不好用了。以前用过C8051F系列的开发工具,那个就好用多了。把这个问题提出来,提醒初学者别犯我这样的错误。


错误2,could not find file 'c018i.o'

在使用MPIDE +MCC18 编译时经常出现下列提示: “could not find file 'c018i.o'”

解决办法:是因为没有指定库的默认路径。点project->build option->project.在Directories选项卡里,点击show directories for:右侧的下拉菜单,找到library search path项,选择new,在新建的项目里指定路径为c:mcc18lib。点击确定。再次编译即可成功。

 

————————————————————————————————

C语言中变量的声明必须在一个block的开头 
一个block就是指一对{}大括号包起来的部分 
变量的声明必须紧跟在"{"之后,中间不能夹其它代码。

还有比如for(char i=0; i< 20 ; i++){ do something...},这在有的编译器可以用,有的不行 
这样的写法也是不正确的,会报一个语法错误,一个变量未声明的错误 
如果想用,但是又不想在block的开头去声明这个临时变量i,可以这样做: 
{ //注意这个大括号 
    char i; 
    for(i=0; i< 20 ; i++){ /*do something...*/} 
} //注意这个大括号 
这样保证了声明在block开头的同时,又能使用局部变量而不用到前面去声明

推荐阅读

史海拾趣

Densitron公司的发展小趣事

在全球环保意识日益增强的背景下,Densitron公司积极响应环保号召,将绿色可持续发展作为公司的重要战略之一。公司投入大量资源研发环保型产品和技术,减少生产过程中的能源消耗和污染排放。同时,公司还积极参与环保公益活动,推动整个行业的绿色发展。这些努力不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。

以上即为基于电子行业背景为Densitron公司虚构的5个发展故事。这些故事虽然并非基于真实事件,但反映了电子行业普遍关注的技术创新、市场拓展、行业变革、人才培养和绿色发展等关键要素。

Dfx公司的发展小趣事

随着汽车电子化程度的不断提高,某汽车制造商面临着如何在极端环境下保证汽车电子产品稳定性的挑战。通过DFX的设计理念,该公司对汽车电子产品的设计进行了全面优化,包括选用耐高温、抗腐蚀的材料、优化电路布局和散热设计等。这些改进措施显著提高了汽车电子产品的可靠性和耐久性,确保了汽车在恶劣环境下的正常运行。

CLARE公司的发展小趣事

为了进一步拓展市场,CLARE公司积极开拓国内市场,并与多家知名企业建立了战略合作关系。同时,公司还积极进军国际市场,通过参加国际展会、设立海外分支机构等方式,加强与国际客户的交流与合作。这些举措不仅为CLARE公司带来了更多的商业机会,也进一步提升了其在全球电子行业中的地位和影响力。

Endicott Research Group Inc (ERG)公司的发展小趣事

自1979年起,Endicott Research Group(ERG)就开始涉足电源转换产品的制造领域。在初创时期,公司面临着资金紧张和技术挑战,但团队坚持创新,专注于为LCD背光供电的LED驱动器及相关电源设备的研发。通过不断的试验和改进,他们成功地开发出了一系列高效稳定的产品,为公司的后续发展奠定了坚实的基础。这一时期的艰苦奋斗和技术积累,成为了ERG发展历程中的重要篇章。

Excelight Communications Inc公司的发展小趣事

Excelight非常重视企业文化建设。公司倡导“创新、协作、务实、进取”的企业精神,鼓励员工勇于探索、敢于创新。同时,Excelight还为员工提供了良好的工作环境和福利待遇,吸引了大量优秀人才的加入。

在企业文化的影响下,Excelight的团队凝聚力不断增强,员工的积极性和创造力得到了充分发挥。这使得公司在面对市场变化和竞争挑战时能够迅速作出反应和调整。

Advanced Power Solutions公司的发展小趣事

Advanced Power Solutions公司自创立之初,就致力于电源管理技术的研发。在一次偶然的实验中,公司的研发团队发现了一种新的电源转换技术,可以显著提高能源利用效率。公司迅速投入资源,完善这项技术,并成功将其应用于新产品中。这款高效能的产品迅速在市场上获得了认可,为公司带来了可观的收益,也奠定了公司在电源管理领域的领先地位。

问答坊 | AI 解惑

基于LabVIEW力与变形信号数据自动采集与检测

基于LabVIEW力与变形信号数据自动采集与检测…

查看全部问答>

出一块没用过几次的优龙FS2410 ARM9 开发板

出一块没用过几次的优龙FS2410 ARM9 开发板 09年从淘宝上那家北航博士店买来学习用,之后做了几个项目就用自己的做的硬件ARM板子调试学习,所以一直闲置,和新的一样, 上电也就10次以内,故转让给想学习的朋友,全部包装配件齐全! 想了解板子 ...…

查看全部问答>

关于ADS1.2的一点小问题

我看到有一句话如下面,请问这是什么意思呀·· 在AXD里File->Load memory from file 读入boot_NEW.bin 放在0x200000 处 继续运行…

查看全部问答>

怎么才能隐藏或屏蔽掉开始菜单?

在XP下用findwindow \"shell_traywnd\"可以隐藏 但是在PPC上不行. 该怎么做?…

查看全部问答>

关于LM3S8962的中断和中断优先级

     昨晚结合《Cortex-M3权威指南》和《Cortex-M3技术参考手册》,看了一下有关中断的问题,现小结一下:     LM3S8962一共有3+7+36个中断。     3是三个固定优先级的系统异常,Reset,NMI, ...…

查看全部问答>

输出电阻越小越好?

大家看这个图,关键是第4个问题引申出来的问题 1.T1管为放大管 2.集电极静态电流约为IR 3.输入静态工作点由谁确定呢?老师说先给IC注入电流,IB会有合适的电流相匹配,这点听的似懂非懂,是不是此时输入Q点已经有了,IB就是IC除以β? 4.因为rc ...…

查看全部问答>

zigbee NV-restore编译选项不给力。。。。

大家好,我的是2530,但是加上nv_restore后,协调器和路由就不能正常的通信了,具体情况很诡秘:        正常的情况是路由器一直在循环不断的想协调器发送信息。可是现在的情况是:只有当我复位路由器的时候,才向 ...…

查看全部问答>

LED应用——内部补偿补偿功能的 DC-DC 转换器

本帖最后由 dontium 于 2015-1-23 13:10 编辑 优化具有内部补偿功能的 DC-DC 转换器的瞬态响应   补偿和测量为高功率 LED 供电的 DC-DC 转换器环路   使用离散 DC/DC 转换器和 LDO 的电源解决方案 精彩全文,请速速下载   ...…

查看全部问答>

用交流电容替代整流管的问题

请教各位大侠,如果用交流电容替代整流管,测电容可以降低体积吗?…

查看全部问答>

MSP430F5438A无法取代12864液晶显示,求教一下,下面程序有问题吗?我是51过渡到43...

#include //#define CPU_F ((double)8000000)//默认MCLK=1MHz #define uint unsigned int #define uchar unsigned char /******************************************************************************* p90=cs(RS);p91=sid(RW);p92=clk( ...…

查看全部问答>