请问CH573在使用汇编时是否可以做到精确到时钟的控制?

你好,

我在测试使用CH573嵌入汇编来生成高速串口信号,方便使用逻辑分析仪调试程序。

1633755958895566.png

类似的代码在8051(CH552),AVR(ATMEGA328P),ARM(samd21,在RAM中运行)都没有问题,每位的输出都是和用指令手册上的速度算出来相一致。

但是在CH573上却做不到这一点。测试的时钟是20M,每个时钟周期为0.05us,每位输出使用6指令。


1633755959188849.png


从逻辑分析仪上可以看出来,有的位输出是7时钟,有的是8时钟,并不统一。我没有找到像“CH55X 汇编指令周期表”这样的文件解释指令周期的问题。请问是不是有缓存命中,对齐,或者是其他的问题?是否有办法加以改善?


image.png

函数加上这句话,实际当前函数(不含上一级函数和本函数调用的函数)是运行在系统主频下的,573evt里面默认主频设置的是60Mhz。
关于指令周期,可以参考RISC-V的文档
RISC-V手册 (ict.ac.cn)


感谢回复。这篇文章我虽然没有逐字阅读,但每页也都读过,文档里只提到一句“一般每条 RISC-V 指令最多用一个时钟周期执行(忽略缓存未命中)。” 我搜索了一下RISC-V指令周期的问题,有人提到“The ISA does not specify the CPU cycles for each instruction.”。既然RISC-V3A是自研的,那应该也只有原厂能给出准确的数据。


我又做了进一步的测试,使用大量SW指令反复操作IO口,用逻辑分析仪测试出SW指令应该是2周期指令。SW要操作内存可以理解,而且无论指令数量多少,均为2周期,非常稳定。


1633787277841176.png


但是在SW前面插入一些NOP指令,情况就有所不同。

nop0.png

不插nop很正常。


1633787279552593.png

插一个nop也正常。


1633787285146411.png

插2个nop,第三个SW需要一个额外周期。


1633787290385301.png

插3个nop也正常。



1633787288163485.png

插4个nop,第二个SW需要一个额外周期。


观察出来的共性是,额外周期的指令地址不可被4整除,没有对齐。而且这条指令前面一定位置要有16位指令。http://www.wch.cn/index.php/bbs/thread-74170-1.html 提到 “你好,我们RISCV内核芯片是我司自研,资料可以参考risc-v标准文档。至于流水线,V2两级、V3/V4三级。” 所以这个问题可以认为是对齐导致的流水线等待?







检查原串口代码,“sllit4,t4,0x4”指令被编译器压缩成了16位的“c.slli”指令,造成延迟。更换为不可压缩的sll指令都每位都是精确的7时钟。


只有登录才能回复,可以选择微信账号登录