CH32V30X 納秒級(jí)延時(shí)以及指令周期的疑問

發(fā)現(xiàn)sdk自帶了微秒和毫秒延時(shí)函數(shù),但是沒有發(fā)現(xiàn)納秒級(jí)延時(shí)(不需要精確到1ns,只要比如60ns或者120ns的倍數(shù)即可)

于是我想到了用for循環(huán)來實(shí)現(xiàn)納秒延時(shí),遺憾的是需要知道指令周期才能確定,for循環(huán)實(shí)際執(zhí)行了多久

比如

for(int?i=100;?i>0;--i)
asm?volatile("nop");


匯編代碼是:

 ? ?li a5,100
.j: nop
? ?addi a5,a5,-1
? ?bnez a5,.j
這4行代碼,目前確定第二行 nop 需要 1個(gè)指令周期 6.94ns(144M頻率)

其他3行代碼,并不知道具體執(zhí)行指令的周期,也就沒法計(jì)算for循環(huán)實(shí)際需要執(zhí)行多久

是否有什么數(shù)據(jù)手冊(cè),可以提供比如 li 指令 addi 指令 bnez等指令的執(zhí)行周期

這樣,就能編寫一個(gè)宏,實(shí)現(xiàn) 比如delay300ns,delay600ns這樣的功能


熱門產(chǎn)品 : USB3.0 HUB控制器:CH634

您好,實(shí)現(xiàn)us級(jí)的延時(shí),可以參考一下下圖延時(shí)函數(shù)寫法,do while執(zhí)行一次大概4個(gè)時(shí)鐘周期,在系統(tǒng)主頻72MHz,入口參數(shù)t的值為100時(shí),延時(shí)時(shí)間大概是55us左右。附件為測(cè)試代碼,你可以參考一下。后續(xù)若有問題,可通過郵箱(lzs@wch.cn)和我溝通。

icon_rar.gifCH32V307 us延時(shí).zip

image.png

image.png


雖然和我的代碼差不多,但是又讓我學(xué)了一招:

使用函數(shù)的時(shí)候,某些代碼不會(huì)被優(yōu)化掉(除非使用靜態(tài)函數(shù))

0000030e?:
?????30e:47a9????????????????lia5,10
?????310:02f50533??????????mula0,a0,a5
?????314:0001????????????????nop
?????316:157d????????????????addia0,a0,-1
?????318:fd75????????????????bneza0,314?
?????31a:8082????????????????ret





我之前也研究過類似的問題,雖然是ch573,但問題應(yīng)該也差不多。

http://www.findthetime.net/bbs/thread-82077-1.html


指令運(yùn)行的速度應(yīng)該受流水線影響很大,而且估計(jì)詳細(xì)的信息也是沒有的。最重要的是,混合16位和32位指令會(huì)導(dǎo)致復(fù)雜的流水線延遲。


我猜你這個(gè)應(yīng)用的話,可以嵌入?yún)R編寫一堆重復(fù)的32位nop,然后在起始的位置使用參數(shù)計(jì)算偏移量,控制跳轉(zhuǎn)不同的nop處。短延時(shí)就往后面點(diǎn)跳,長(zhǎng)延時(shí)就往前面點(diǎn)跳。由于nop指令都一樣,跳轉(zhuǎn)位置和執(zhí)行時(shí)間應(yīng)該就能成線性關(guān)系。


通過跳轉(zhuǎn)到不同的nop地址似乎是個(gè)不錯(cuò)的方法,但是如何c代碼和匯編代碼混合編寫呢?


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频