我正在看一个程序,该程序是关于一个声音音符音序器,该音符播放不同持续时间的不同音符,在某些音符中间会有延迟,例如 0.5 秒或 0.25 秒,然后我无法找到一种方法来计算要加载到寄存器中的值以实现我想要的持续时间。
我已经搜索了维基和其他一些在线资源,例如从这个网站:https://www.avr-tutorials.com/assembly/calculating-execution-time-sequential-code 了解如何计算函数的执行时间。
delay:
push {lr}
ldr r10, =12000 @ in fact this function will result in a delay of 0.25s
b loop
loop:
..... @ some instructions to play sound
subs r10, #1 @ in each loop the time counter is subtracted by 1
cmp r10, #0 @ when time counter reaches zero, branch to a end function
beq end
b loop @ loop the function until time counter hits zero
例如,上面以寄存器r10
作为时间计数器的函数,而在另一个loop
函数中,0
的值(意味着将 0 Hz 的声音输入到register
中以在声音音符之间产生延迟)被添加到寄存器r0
由mov r0, #0
,并且 我想找出我需要加载到时间计数器r10
中的值才能让我播放 0 Hz 声音,例如0.5s
或0.25s
,以及如何计算要加载的此值。我不知道这句话的确切表达方式是什么,但也许我会把它表述为"计算程序中的延迟时间?
我在其他地方找到的delay
函数实际上会导致0.25s
延迟,但我不明白它是如何工作的。我猜时间计数器r10
在每个循环中减去 0 需要 0.25 秒才能达到 1。但我真的想不通这个计算是怎么来的。
谢谢。
只是..in fact really result in a 0.25s delay but I don't understand how does it work
部分回答(事实上,这是我唯一能识别为问题的问题):
CPU指令需要一些固定的时间才能在以给定频率时钟的给定 CPU 上执行 (*)。了解此数据后,您可以计算获得所需延迟所需的循环迭代次数。这只是一个简单的算术任务。
(*) 这不适用于大多数现代 CPU,出于多种原因,强烈建议不要使用这种实现延迟的方法。