瑞萨的R8C/1A的运行时间,要考虑指令流水线与Que-buffer的存在。具体可参考瑞萨R8C的软件手册。内部高速振荡器的精度一般温度下在能保证在+-5%。延时时间如果要求精准的话,不推荐用这种方式。
http://documentation.renesas.com/eng/products/region/rtcn/mpumcu/rcj09b0006_0100z.pdf
前面已经提到过了,使用语句来计算周期的问题不在于时钟源精度,而是方法问题。
具体说就是和你写的程序的格式,所用到的语句有关系。
比如我举个例子,使用8MHz的主时钟:
1 使用NOP语句,连续写8000次,在这种情况下,延时时间是可以肯定的:125ns x 8000 = 1ms。
2 使用NOP语句,连续80次,在用for循环调用该语句100回,延时时间就不是:125ns x 80 x 100了。而应该约是125ns x ( 2 + (3 + 2 + 80 + 3 + 5 + 4 ) x 100) = 1.2ms。
for循环的汇编代码和对应的CPU时钟如下:
C语言 汇编 CPU时钟
for( i = 0; MOV.W #0, 400H(i的地址) 2
i < 100; CMP.W #100, 400H 3
{ JEQ.W xx (如果,调到for的下一句) 2
asm("NOP"); NOP (80句NOP) 80
i ++; ADD.W #1, 400H 3
} JMP y(跳转到CMP语句) 5 + 4 *
* 这个多出来的4个周期是由于瑞萨单片机内部有4字节的指令队列Buffer。在执行语句的时候,CPU会将后面的指令取道这个buffer中,以提高下一语句的执行效率。但是,这只是针对顺序语句而言,如果当前语句是跳转,那么buffer中预存的语句是无效的,这个时候CPU反而需要花时间去清空并重新load。
而LZ的程序中只有8个NOP,循环的次数却很多,所以误差很大。
3 综上所述,使用语句来计算时间是不可取的。除非你愿意写很长的NOP,然后配合少量的循环。
4 郑重推荐:如果需要精确计时,一定要使用定时器。
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |