az8898l 发表于 2014-8-16 07:57:12

PIC 16f886 NOP()指令时间问题

内部时钟晶振4M 系统时钟为4M/4=1M   。定时器配置1s 将IO口翻转,确定时钟为1M。
一条指令周期理应为1us 。
用示波器查看端口电平拉高拉低,查看相关指令耗时,
以下结果:
        NOP();           4us               
        asm("nop")            4us
        i++                           1us
      delay(1)              11us【该delay函数自己增加的内容如下】
                                                     void delay(uchar i)   {         for(;i>0;i--);      }       
        delay_single()        1us    【该delay函数自己增加的内容如下】
                                               void delay_single()   {    uchar i;   i++;   }       
       



按上面测试数据,恨不能理解NOP空指令理应为一个指令周期吗?delay()函数 算上函数调用时间,也不该为11us????

sfq2008 发表于 2014-8-16 09:15:36

4M晶振,一个NOP 1us

tigerman520 发表于 2014-8-16 09:23:53

你看汇编代码才才知道用了几条指令的。

az8898l 发表于 2014-8-16 09:58:14

sfq2008 发表于 2014-8-16 09:15
4M晶振,一个NOP 1us

可是测出来 是4us{:mad:}

az8898l 发表于 2014-8-16 09:59:12

tigerman520 发表于 2014-8-16 09:23
你看汇编代码才才知道用了几条指令的。

NOP();
汇编如下,就一条。
555:               NOP();
07CB    0000   NOP

dginlon 发表于 2014-8-28 16:32:19

不清楚樓主如何測試,
指令週期為CPU 執行指令的單位時間,NOP 是一個指令週期的指令
但i++ , 要看<i> 是甚麼資料格式,unsigned char ,char ,short int, int,unsigned long .....
不管<i> 是甚麼資料格式,對<i> 存取一定會大於等於 一個指令週期,不可能小於一個指令週期
可以肯定樓主的測試方法有問題。
會不會樓主 沒把 loop 指令的值行指令時間扣除 ..... 單純想像


caoxuedong 发表于 2014-9-9 19:33:03

这个不用示波器看,用MPLAB软仿,设断点直接就能看到指令执行时间的。
页: [1]
查看完整版本: PIC 16f886 NOP()指令时间问题