请教高手关于PICC编译问题

2019-03-25 19:03发布

file:///D:Kugou190679161ImageC2CQ6Y]AW7U%M(TFQFNN59M6AN.png


问题描述:
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直接可以这样操作的,但我不知道为什么调试的时候会乱跳,感觉还是没有汇编来得直观。

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
1条回答
dingzy_2002
2019-03-26 03:26
①对于PIC的BANK问题,我一般是不设定的(懒),由编译器自己解决,所以这个问题我回答不上你
②配置位问题:一般是不同的单片机,其配置标识是不一样的,如下面是PIC16F883的配置例程:
__CONFIG(        FOSC_INTRC_NOCLKOUT        &         //内部振荡器,无时钟输出
                WDTE_ON                                &         //WDT开启                       
                PWRTE_ON                                &        //上电延时开启
                MCLRE_ON                                &        //外部复位
                CP_ON                                &        //编程保护开启
                CPD_OFF                                &        //EE编程保护关闭
                BOREN_ON                                &        //低电压复位开启
                LVP_OFF                                );        //低电压编程关闭
__CONFIG(        BOR4V_BOR21V                        );        //低电压复位电压:2.1V

还有的就是,这配置一定要在PIC.H文件之后,而不是在文件最开始的位置,还要在MPLAB→configure→select Device中选对器件型号。
最后,说的是调试问题,主要是PICC的单步调试时,是针对函数的,一般可能会精简了部分语句,若详细观察指令的运行,还要进入Disassembly listing的文件中进行调试,一般可以较为详细的单步调试的。

一周热门 更多>