0

我只是在学习 ARM 汇编,我不确定我的代码是否正确。此代码应该实现声音延迟。

我已按照以下说明进行操作,但我不知道我的代码中是否有任何错误。

  1. 初始化缓冲区“buf”(初始化时,该寄存器将指向缓冲区的第一个元素)
  2. 在一个寄存器中存储一定大小的缓冲区
  3. 您必须确保将输入值存储在正确的位置,因此比较您的索引 r0 和缓冲寄存器(比如说 r1)
  4. 如果索引 r0 小于 r1,则将其设为 r1(即数组中的第一个元素)
  5. 用 r1 添加缓冲区大小(现在 r1 是数组的最后一个元素)
  6. 再次比较 r0 和 r1,如果 r0 大于 r1,则将其初始化为 'buf'
  7. 之后将ADC值加载到r0,然后将其存储在DAC中
  8. 由于每个样本占用 2 个存储单元,请确保将索引增加 2 (STRH r0, [r1], #2)

.set AD0GDR,        0xE0034004

.set DACR,      0xE006C000

.set BUFLEN,10000

.bss

.balign 2

buf:.skip( 2 * BUFLEN);  //'buf' intialized

.data

.balign 2

.skip 2

.text

/**
* void delay_audio();
*/ 

.text

.balign 4

.global delay_audio

delay_audio:

LDR r2, =0xE0034004

LDR r3, =0xE006C000 


LDR r1,=buf  //Store size of buf in one register

CMP r0,r1  //Comapre Index ro and buf register 

LDRLT r0,[r1 , #0]  //if(r0<r1) then r1 is the first element in the array

LDRLT r0,[r1]   //add size of buf with r1, so r1 will become the last element

CMP r0,r1    //Compare again

LDRGT r0,=buf  //if(r0>r1)  then r1 will be initialized to buf


LDRH r0,[r2] //load from ADC to r0( r0 is index)

STRH r0,[r3] //Store the same half word in DAC

STRH r0,[r1],#2 //increment index by 2 

bx lr   // return

.end
4

0 回答 0