打印
[PIC®/AVR®/dsPIC®产品]

请教高手关于PICC编译问题

[复制链接]
1244|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
probedog|  楼主 | 2025-3-11 11:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题描述:
volatle  bank1  unsigned int  b1=1000;
void  delay()
{...........}

如上所示,我在张明峰书上看到对全局变量如果不指定具体所在的体,默认就是bank0,如果要指定具体的体,必须在变量前面加上具体的体号,如bank1,bank2,等。上面的变量b1我指定其在bank1,但实际编译成功后 调看那个变量窗口(就是MPLAB IDE“VIEW”菜单里面的watch),发现b1的地址在075(0x75),并没有在体1,还是在体0(00H-7FH),而且随着变量的增加其地址也在不停的变化,但是都在体0,这对我产生了误解:到底是张明峰 写书(大概2004年)的时候介绍的PICC 编译器版本太旧了(因为太旧导致PICC 对bank的管理必须由程序员自己搞定),还是现在在用的PICC  (诸如PICC v9.83等,)太强大了,导致根本不需要程序员去指定bank,甚至可能比如说bank0的RAM都用完了,PICC会自动切换到其他几个体而不会报错。我在群里面也问了几个人,根本没人知道变量前面加bank的做法,事实上我调试的结果(用现在的编译器)好像指不指定具体的bank,地址都被分配到bank0.   不知道这里有高手可以解释下这个问题吗?

PS:另外我调试的时候还有几个小问题,一并问了:(1)我在程序最开头加配置位:__CONFIG(UNPROTEC&BOREN&PORTEN&WDTDIS);感觉没错吧,但是编译的时候报错,说这些配置位没定义(undefine),搞到我后来只能在MPLAB IDE 的软件里面把配置位设置好(设置好后会出来一个参数,比如3F71),最终之只能这样操作:__CONFIG(0X3F71); 我不知道为什么会这样,有人知道原因吗?
(2)我发现在调试程序“单步运行”的时候,这个软件也存在BUG,但是在汇编语言调试我从来没有碰到过的。情况是这样的:很简单的几个语句

  void main()
{TRISC=0X00;
PORTC=0X00;
while(1)
  {  RC0=1;
      RC1=1;
      delay(2);
}
下面的delay 函数省了,不写了。   就这几个语句,我调试的时候发现当执行while(1)循环的时候,先执行RC0=1,这个没错吧,然后突然就跳到delay(2)处,中间RC1=1没被执行,然后delay(2)其实也不执行的,直接又回到RC0=1,接下去的执行算正常了,但是等到第2轮的时候又有类似的问题产生了,感觉程序跑飞一样,搞不明白,后来干脆将RC0=1改成PORTC|=0x01或者asm("bsf   _PORTC,0");RC1=1改成PORTC|=0x02或者asm("bsf   _PORTC,1");执行就正常了,事实上,头文件已经定义了,对特殊寄存器的位,比如RA0.RA1直接可以这样操作的,但我不知道为什么调试的时候会乱跳,感觉还是没有汇编来得直观。

使用特权

评论回复
沙发
gejigeji521| | 2025-3-12 14:14 | 只看该作者
这个是开发老型号用的吧,现在都是XC8了

使用特权

评论回复
板凳
yiy| | 2025-3-21 16:35 | 只看该作者
可能原因:
编译器优化问题:

编译器可能会对代码进行优化,导致调试时的执行顺序与源代码不一致。

例如,编译器可能会将 RC0=1 和 RC1=1 合并为一条指令,或者重新排列指令顺序。

调试器问题:

调试器在单步执行时可能会出现显示错误,导致你误以为某些语句被跳过。

这种情况在高级语言(如 C 语言)调试中比汇编语言更常见,因为汇编语言的调试更接近底层。

代码问题:

如果 RC0 和 RC1 是直接操作特殊功能寄存器(SFR)的位,可能需要使用特定的语法或函数。

使用特权

评论回复
地板
dongnanxibei| | 2025-3-22 15:47 | 只看该作者
为何不用XC8啊。这个早淘汰了吧

使用特权

评论回复
5
lcczg| | 2025-3-24 17:22 | 只看该作者
本帖最后由 lcczg 于 2025-3-26 15:38 编辑

1.建议找到对应PICC的用户手册,看里面的使用方法。升级到XC8吧,我试了XC8 v2.00是可以的。
2.调试感觉乱,应该是优化的原因。你把编译器的优化等级设置为0试试。

使用特权

评论回复
6
4c1l| | 2025-3-25 12:55 | 只看该作者
编译器可能对代码进行了优化,跳过了某些不必要的代码。

使用特权

评论回复
7
4c1l| | 2025-3-25 12:55 | 只看该作者
使用标准的 C 语句(如 PORTC |= 0x01;)

使用特权

评论回复
8
天灵灵地灵灵| | 2025-3-25 19:50 | 只看该作者
MPLAB X IDE支持这个PICC吗

使用特权

评论回复
9
幻想收藏家| | 2025-3-25 23:23 | 只看该作者
调试时出现跳过某些语句的情况,也可以尝试在代码中添加断点

使用特权

评论回复
10
时光贩卖机| | 2025-3-26 14:27 | 只看该作者
可以通过查看汇编代码来确认程序的实际执行情况

使用特权

评论回复
11
绝影孤狼| | 2025-3-26 17:42 | 只看该作者
关于变量存储体的问题,可能是编译器版本的问题

使用特权

评论回复
12
脑洞星球居民| | 2025-3-26 18:43 | 只看该作者
可能是由于不同版本的编译器对配置位的定义方式有所不同

使用特权

评论回复
13
快乐制造机| | 2025-3-26 21:00 | 只看该作者
可以使用MPLAB X IDE中的配置位设置工具来生成正确的配置位代码

使用特权

评论回复
14
g36xcv| | 2025-3-27 16:40 | 只看该作者
每个寄存器组都包含不同的内部 RAM 地址空间。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

427

主题

2656

帖子

3

粉丝