在 C 数组中保存内存地址内容
Posted
技术标签:
【中文标题】在 C 数组中保存内存地址内容【英文标题】:Saving memory address content in C Array 【发布时间】:2017-07-04 14:47:17 【问题描述】:我正在为音频实现 C 代码延迟。 我有一个接收音频样本的内存地址。还有另一个内存地址,指示新样本出现的位置。
我想要做的是记录第一个音频秒(48000 个样本)。为此,我声明了一个用于保存音频样本的数组。
在主循环中,我将实际样本和延迟(1 秒前)样本相加,这与我想要实现的回声非常相似。
问题是我的代码再现了实际的声音,而不是延迟的,事实上我每秒都能听到一点噪音,所以我猜它只读取了数组的第一个样本,其余的都是空的。
我已经分析了我的代码,但我不知道我的失败在哪里。我认为这可能与内存分配有关,但我对 C 语言不是很熟悉。你能帮帮我吗?
#define au_in (volatile short *) 0x0081050 //Input memory address
#define au_out (volatile short *) 0x0081040
#define samp_rdy (volatile int *) 0x0081030 //Indicates if a new sample is ready
/* REPLAY */
void main()
short *buff[48000];
int i=0;
while(i<48000)
if((*(samp_rdy + 0x3)==0x1)) //If there's a new sample
*buff[i]= *au_in;
i++;
*(samp_rdy + 0x3)=0x0;
while (1)
i=0;
while(i<48000)
if((*(samp_rdy + 0x3)==0x1))
*au_out = *buff[i]+(*au_in); //Reproduces actual sample + delayed sample
*buff[i]=*au_in; //replaces the sample in the array for the new one
i++;
*(samp_rdy + 0x3)=0x0;
谢谢。
【问题讨论】:
我很确定你的代码应该会溢出堆栈...short *buff[48000];
--> short buff[48000];
?
我推荐使用静态短buff[48000]。也请使用 for 循环!
你创建了buff
一个(未初始化的)指针数组。我猜你希望它是short
s 的数组。除了崩溃或无限循环之外,我很惊讶您得到任何结果。
您还必须将*buff[i]= *au_in
更改为buff[i]= *au_in
。并使用-Wall
编译,以便您的编译器可以正确报告错误
【参考方案1】:
尝试以 C99 模式运行:
#define au_in (volatile short *) 0x0081050 //Input memory address
#define au_out (volatile short *) 0x0081040
#define samp_rdy (volatile int *) 0x0081030 //Indicates if a new sample is ready
#define SAMPLE_BUF_SIZE (48000)
void main()
static short buff[SAMPLE_BUF_SIZE];
for(int i = 0; i < SAMPLE_BUF_SIZE; )
if(*(samp_rdy + 0x3)) //If there's a new sample
buff[i]= *au_in;
*(samp_rdy + 0x3)= 0;
i++;
while (1)
for(int i = 0; i < SAMPLE_BUF_SIZE; )
if(*(samp_rdy + 0x3)) //If there's a new sample
*au_out = buff[i] + (*au_in); //Reproduces actual sample + delayed sample
buff[i] = *au_in; //replaces the sample in the array for the new one
*(samp_rdy + 0x3)= 0;
i++;
【讨论】:
你确定这行:*(samp_rdy + 0x3) == 0x01。您正在检查 0x0081033 处的内存是否为 0x01。 你帮了我很多。 for 循环与我的项目不兼容,但现在它可以完美运行。即使没有新样本,您的代码也会增加 i ,因此会引入很多噪音。使用我的 while 循环,我只在有新样本时增加索引。非常感谢您的宝贵时间。另外,我确定 *(samp_rdy + 0x3) == 0x01。如果有新样本,硬件(音频编解码器)正在那里写入。所以当我知道我有一个新的时,我把它写成'0'。每次新样本到达时,编解码器都会将值修改为“1”。 是的,这就是我纠正答案的原因。很高兴得到反对的理由。以上是关于在 C 数组中保存内存地址内容的主要内容,如果未能解决你的问题,请参考以下文章