
瑞萨的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 郑重推荐:如果需要精确计时,一定要使用定时器。
回复
打赏帖 | |
---|---|
【S32K146】S32DS watchdog 配置使用被打赏20分 | |
【Zephyr】使用 IAR 调试 Zephyr 镜像被打赏20分 | |
【Zephyr】MCXN947 Zephyr 开发入门适配shell被打赏20分 | |
【我要开发板】6.联合MATLAB记录数据被打赏50分 | |
【瑞萨RA2E1开发板】:使用ADC功能实现位移传感器采集方案被打赏20分 | |
【nRF7002DK】基于sht30的温湿度计被打赏20分 | |
【nRF7002DK】日志打印被打赏20分 | |
【换取手持示波器】RGB屏幕移植ARM-2D库被打赏35分 | |
【分享开发笔记,赚取电动螺丝刀】分享一下如何解决瑞萨RA2E1使用printf编译报错问题被打赏27分 | |
rtthread硬件加密-5hash加密分析被打赏10分 |