前几天用下面的程序段实现了数据的乒乓缓存:
while(1){
upp_reg_hdl->UPID0 = (Uint32)upp_buffer_test[pingpong_buffer_num];
upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(upp_buffer_ping[0]);
upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(upp_buffer_ping[0]);
while((upp_reg_hdl->UPIS2 & CSL_UPP_UPIS2_PEND_MASK) == 2){};
pingpong_buffer_num = pingpong_buffer_num + 1;
upp_reg_hdl->UPID0 = (Uint32)upp_buffer_test[pingpong_buffer_num];
upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(upp_buffer_pong[0]);
upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(upp_buffer_pong[0]);
while((upp_reg_hdl->UPIS2 & CSL_UPP_UPIS2_PEND_MASK) == 2){};
pingpong_buffer_num = pingpong_buffer_num + 1;
}
其实我是想利用乒乓缓存,在前一个buffer收满后,将接收到的数据交给DSP处理的同时进行下一个buffer接收。
于是我先实现了这样的一个乒乓缓存(每进行一个DMA都会进入一次中断处理函数)可以连续接收数据了,然后想想办法将数据交给DSP处理,可是这样的程序段该添加在什么位置才不会影响数据的连续接收呢?
Tony Tang:
现在的程序是在ARM端吗?如果是,你可以通过ARM给DSP发中断,通知DSP处理,反正数据都是在内存上,不需要再做搬运,互相约定好数据在什么位置就好了。
你得评估一下处理一帧数据算法要用多长时间,看能否做到实时处理,不然中间有些数据会丢掉的。