管理员
  
- 积分
- 165524
- 金钱
- 165524
- 注册时间
- 2010-12-1
- 在线时间
- 2116 小时
|
发表于 2016-9-3 20:14:41
|
显示全部楼层
另外,必须是方案2.
环形队列,实际上就是做FIFO,很简单的.
给你我们阿波罗开发板录音机实验的FIFO代码:
[mw_shl_code=cpp,true]
u8 *sairecbuf1; //SAI1 DMA接收BUF1
u8 *sairecbuf2; //SAI1 DMA接收BUF2
//REC录音FIFO管理参数.
//由于FATFS文件写入时间的不确定性,如果直接在接收中断里面写文件,可能导致某次写入时间过长
//从而引起数据丢失,故加入FIFO控制,以解决此问题.
vu8 sairecfifordpos=0; //FIFO读位置
vu8 sairecfifowrpos=0; //FIFO写位置
u8 *sairecfifobuf[SAI_RX_FIFO_SIZE];//定义10个录音接收FIFO
FIL* f_rec=0; //录音文件
u32 wavsize; //wav数据大小(字节数,不包括文件头!!)
u8 rec_sta=0; //录音状态
//[7]:0,没有开启录音;1,已经开启录音;
//[6:1]:保留
//[0]:0,正在录音;1,暂停录音;
//读取录音FIFO
//buf:数据缓存区首地址
//返回值:0,没有数据可读;
// 1,读到了1个数据块
u8 rec_sai_fifo_read(u8 **buf)
{
if(sairecfifordpos==sairecfifowrpos)return 0;
sairecfifordpos++; //读位置加1
if(sairecfifordpos>=SAI_RX_FIFO_SIZE)sairecfifordpos=0;//归零
*buf=sairecfifobuf[sairecfifordpos];
return 1;
}
//写一个录音FIFO
//buf:数据缓存区首地址
//返回值:0,写入成功;
// 1,写入失败
u8 rec_sai_fifo_write(u8 *buf)
{
u16 i;
u8 temp=sairecfifowrpos;//记录当前写位置
sairecfifowrpos++; //写位置加1
if(sairecfifowrpos>=SAI_RX_FIFO_SIZE)sairecfifowrpos=0;//归零
if(sairecfifordpos==sairecfifowrpos)
{
sairecfifowrpos=temp;//还原原来的写位置,此次写入失败
return 1;
}
for(i=0;i<SAI_RX_DMA_BUF_SIZE;i++)sairecfifobuf[sairecfifowrpos]=buf;//拷贝数据
return 0;
}
//录音 SAI_DMA接收中断服务函数.在中断里面写入数据
void rec_sai_dma_rx_callback(void)
{
if(rec_sta==0X80)//录音模式
{
if(DMA2_Stream5->CR&(1<<19))rec_sai_fifo_write(sairecbuf1); //sairecbuf1写入FIFO
else rec_sai_fifo_write(sairecbuf2); //sairecbuf2写入FIFO
}
} [/mw_shl_code]
|
|