一个“&”占用了超过6个指令周期!!!可能吗?讨论中……(附图,附程序)熟悉汇编的友友请进

2020-02-08 09:30发布

指令时钟与定时器时钟同步,为FOSC/4
我在用定时器为定时的候,设置了一个等待程序,想通过定时器计时发生中断的时候执行下面指令:

TMR4=9;
……
while(TMR4>16);
……

但在实际调试用发现,根本不会等,就自自往下执行了,调开寄存器一看,在执行"while(TMR4>16);"的时候,TMR4已经为20了,造成程序混乱。
看了一下ProgramMemory的汇编指令,发现:
一条这样的指令,竟然使用了6个指令周期:

Conversion&=CMOUT;
系统外部时钟是:13.56MHZ
指令周期:4/13.56MHZ=0.295us
定时时钟也是:0.295us

for(ReceiCount=1;ReceiCount<ReceiLenth;ReceiCount++)
上面这样一个for循环就更可怕了,占到13个指令周期,时间大概是:13*0.295=3.83us了。

现在想解决问题是:能不能有什么办法减少这些周期数,或者编译平台能否进行优化。

        Conversion=0;                  //计数器
        PR4 =32;                 //128 clock  
        TMR4=9;
        for(ReceiCount=1;ReceiCount<ReceiLenth;ReceiCount++)
        {
                temp>>=1;
                temp&=0x7F;
                Conversion=0x20;
                while(TMR4>16);
                Conversion&=CMOUT;  //检测高电平
                Conversion&=CMOUT;
                Conversion&=CMOUT;
                Conversion&=CMOUT;
                temp|=Conversion;  //保存数据
                if((ReceiCount%8)==0)
                {
                        t=ReceiCount/8;
                        Receiver[t-1]=temp;
                }
        }
能在9个us内完成这样一个for循环周期去检测脉冲信号?求高见!~~~~

以下附实验图片,可供参考。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
21条回答
eduhf_123
2020-02-10 16:19
你的程序……
问题太多……
另外估计(CPU)硬件配置也有问题。

//按照这样的写法,循环只执行ReceiLenth-1次,怀疑变量ReceiCount的初值应为0
//况且循环这样写效率太低,用do{}while(--ReceiLenth)更好。
//for(ReceiCount=1;ReceiCount<ReceiLenth;ReceiCount++)
{
    temp>>=1;
    //下边这一句完全可以不要
    //temp&=0x7F;
   
    //这句是在做什么?
    Conversion=0x20;

    //应该是while(TMR4 < 16);???
    while(TMR4>16);
   
    //你确定生成的代码的行为与你所期望的一致?
    //另外,用与操作来检测高电平?还是连续的与??
    Conversion&=CMOUT;      //检测高电平
    Conversion&=CMOUT;
    Conversion&=CMOUT;
    Conversion&=CMOUT;

    //同上,你确定到这里的时候,变量Conversion中的值是你所期望的么?
    //另外,这里是否应该是这样的代码:
    //temp |= (0x01&Conversion)?0x80:0x00;
    temp|=Conversion;       //保存数据

    if((ReceiCount%8)==0)
    {
        //Receiver[(ReceiCount>>3)-1] = temp;
        //下面这两行直接写成这样不好么?
        t=ReceiCount/8;
        Receiver[t-1]=temp;
    }
}

MOVWF   eeprom_read_block@n
MOVF    eeprom_read_block@n, W
然后,看你的调试窗口,总是出现上面这两条汇编指令,不知道是工程配置问题还是所用编译器的问题。

一周热门 更多>