这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 周期数计算的疑惑

共8条 1/1 1 跳转至

周期数计算的疑惑

助工
2008-05-05 10:46:47     打赏

  测试程序如下:

  mov.b #2eh,hr1       ;<10MHz
  mov.b #01h,hr0       ;enable high-speed on-chip oscillator
  nop                            ;wait for oscillator stable
  nop
  nop
  nop
  mov.b #03h,hr0       ;select high-speed on-chip oscillator
  mov.b #10h,cm1     ;low-speed on-chip oscillator off
                                     ;set cpu clock as Fosc
                                     ;set P4_6,P4_7 as input and low drive capacity
  mov.b #2ch,cm0     ;no external clock
                                     ;stop peripheral funtion clock in wait mode
  mov.b #0ch,ocd      ;disable oscillation stop detection.Confirmed:disable
                                     ;main oscillor stopped
                                     ;select internal oscillor

;下面的为循环,测试周期
loop:
  mov.b 501h,503h              ;3个指令周期 X 10行
  mov.b 501h,503h
  mov.b 501h,503h
  mov.b 501h,503h
  mov.b 501h,503h
  mov.b 501h,503h
  mov.b 501h,503h
  mov.b 501h,503h
  mov.b 501h,503h
  mov.b 501h,503h
  bnot p04                       ;取反P04口,用示波器观察周期,3个指令周期
  jmp.b loop                   ;4个指令周期

理论计算高/低电平的时间应当小于4us,实际测量居然近13us,为什么???




关键词: 周期数     期数     计算     疑惑     mov.b501h    

菜鸟
2008-05-05 13:12:55     打赏
2楼

首先,hr1,hr0,cm1,cm0,ocd这几个寄存器是被保护的。
如果要进行更改,要先通过PRCR寄存器的PRC0位允许。

其次,IO口的翻转频率有上限。您可以先不延时,直接在loop中翻转IO口,用示波器看看翻转上限。加入延时后的翻转,要比这个频率低。

另外,mov.b指令的执行,不一定是3个周期。同样的MOV指令,根据具体的情况,还有不同的执行周期长度。如果您开始没有注意到这一点,可以看看编译后的二进制代码,再代入软件手册中比对,得到正确的参数。当然,最好的方法是用小型仿真器来验证。


(以上答复仅基于您的程序,没有做实际测试。)


助工
2008-05-05 13:18:40     打赏
3楼
保护我知道,先前是打开的
我以前测试过1+us的翻转
编译后的代码和我写的相同

菜鸟
2008-05-05 14:56:13     打赏
4楼

您好,

刚才用另一款类似的R8C实际测了一下,您计算的周期数是正确的,37个周期。

但是仔细查了一下,发现这个周期数仅仅是“执行周期”。而其他时间开销在此没有量化,比如读写存储器、加载等等。

请看下面的解释,从软件手册上拷贝的:
Shows the number of cycles required to execute the instruction and the number of bytes in the instruction.
The number of cycles may increase due to software wait states, etc.

一般我们并不建议用户在CISC的单片机上用指令进行精确延时。
如果一定要用,您不妨根据实测结果增减循环体,精确计算是很麻烦的。

我以前也没用指令做过精确延时,所以没在意这个问题。


助工
2008-05-05 16:39:02     打赏
5楼
谢谢你的解答

我不是用指令精确延时
只是发现中断响应时间比理论计算的结果要长很多
写这段程序验证一下
理论计算和实际相差太多。。。。

就算有软件等待,那也不至于相差这么多啊,3倍多啊




助工
2008-05-05 19:16:34     打赏
6楼

楼主好,请先在下载瑞萨的R8C/tiny的软件手册,
http://documentation.renesas.com/eng/products/mpumcu/rcj09b0006_0100z.pdf

在第4章中讲了各指令的字节数与执行周期数,请注意R8C/tiny的指令系统具有4 段(4 字节)的指令队列缓冲器(Que-buffer),请参照第6章:

“在CPU 能使用总线的状态下,如果指令队列缓冲器为空,指令码就被取入指令队列缓冲器,将此称为预取指令。CPU 边读取存放在指令队列缓冲器中的指令码(取指令)边执行程序。
第4 章说明的周期数是指在指令队列缓冲器中已备齐了指令码的状态下,对存储器以无软件等待读写8 位数据时的周期数。在下列情况下,将多于在手册中记载的周期数:
■在指令队列缓冲器中没有备齐CPU 所需的指令码。
到备齐执行所需的指令码为止读取指令码。在下面的情况下,读周期数还会增加:
·当从存在软件等待周期的区域读取指令码时读周期数将增加等待周期数的份。
■对存在软件等待周期的区域读写数据。
周期数将增加等待周期数的份。
■对SFR 或者内部存储器读写16 位数据。
对于1 个数据的读写,将进行2 次读写操作。因此,对于每个数据的读写,周期数将增加1 个周期。另外,在预取指令和数据存取同时发生时,数据存取被优先。
如果指令队列缓冲器内存在3 字节以上的指令码,就认为指令队列缓冲器不为空状态,不预取指令。”

因为R8C/tiny为CSIC指令,指令长度有长有短,有关指令流水比较复杂,加上跳转,调用,中断中buffer内容破弃造成的实际执行时间损失可以通过瑞萨全功能仿真器或小型仿真器显示出来,象您所采用的这段程序,本身就是从memory到memory的数据传递,字节数长,加上跳转,流水线没有发挥特别的作用。提示一点,瑞萨M16C核(R8C也是一样)很适合于C语言,也很适合于优化,如果用汇编的话,在时间优化方面需要下些功夫。


助工
2008-05-05 21:08:19     打赏
7楼
这部分我也看了
还有那个图
只是不敢相信会差距这么大
手册也没给出更相信的计算方法

菜鸟
2008-05-07 13:53:43     打赏
8楼

楼主,个人认为对于CISC指令集的代码,采用纯软件的延迟可能达不到精确的效果。
如果一定要搞清楚您的问题的话,除非使用更高级的全功能仿真器或小型仿真器,看一下代码的trace结果。


共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]