我在信号处理处理器(ADSP 21489)上测试项目。我正在使用ADI公司的开发软件VisualDSP ++ 5.0。我使用DMA缓冲区将数据发送到CODEC。
问题是在调试模式下一切正常,但在发布模式下它无法正常工作。编译器优化了一些优化的东西。我尝试将变量设置为volatile并添加#pragma optimize_off,但仍然无法正常工作。有关如何解决这个问题的任何提示?
extern volatile int inputReady;
extern volatile int buffer_cntr;
static void fixData (int *output, float *input, unsigned int outstep, unsigned int length)
{
int i;
for(i = 0; i < length; i++)
{
output[outstep*i] = __builtin_conv_FtoR(input[i]);
}
}
#pragma optimize_off
volatile int sine_cnt = 0;
static void process_audioBlocks(void)
{
memcpy(fBlockA.Tx_L1, &sine[sine_cnt], DAC_NUM_SAMPLES);
memcpy(fBlockA.Tx_R1, &sine[sine_cnt], DAC_NUM_SAMPLES);
memcpy(fBlockA.Tx_L2, &sine[sine_cnt], DAC_NUM_SAMPLES);
memcpy(fBlockA.Tx_R2, &sine[sine_cnt], DAC_NUM_SAMPLES);
memcpy(fBlockA.Tx_R3, &sine[sine_cnt], DAC_NUM_SAMPLES);
memcpy(fBlockA.Tx_L3, &sine[sine_cnt], DAC_NUM_SAMPLES);
memcpy(fBlockA.Tx_L4, &sine[sine_cnt], DAC_NUM_SAMPLES);
memcpy(fBlockA.Tx_R4, &sine[sine_cnt], DAC_NUM_SAMPLES);
if (sine_cnt < ARRAY_SIZE(sine) - DAC_NUM_SAMPLES)
{
sine_cnt += DAC_NUM_SAMPLES;
}
else
{
sine_cnt = 0;
}
}
#pragma optimize_as_cmd_line
#pragma optimize_off
void AD1938_ISR(int sig_int)
{
int i;
if(isProcessing)
{
ProcessingTooLong();
}
else
{
//Increment the block pointer
buffer_cntr++;
buffer_cntr %= 2;
inputReady = 1;
}
}
#pragma optimize_as_cmd_line
#pragma optimize_off
void AD1938_Handle_Codec_Data(volatile int buffer_cntr)
{
// Clear the Block Ready Semaphore
inputReady = 0;
// Set the Processing Active Semaphore before starting processing
isProcessing = 1;
// Place the audio processing algorithm here.
process_audioBlocks();
// Fix DAC data for AD1938
fixData(tx_block_pointer[buffer_cntr]+0, fBlockA.Tx_L1, NUM_TX_SLOTS, DAC_NUM_SAMPLES);
fixData(tx_block_pointer[buffer_cntr]+1, fBlockA.Tx_R1, NUM_TX_SLOTS, DAC_NUM_SAMPLES);
fixData(tx_block_pointer[buffer_cntr]+2, fBlockA.Tx_L2, NUM_TX_SLOTS, DAC_NUM_SAMPLES);
fixData(tx_block_pointer[buffer_cntr]+3, fBlockA.Tx_R2, NUM_TX_SLOTS, DAC_NUM_SAMPLES);
fixData(tx_block_pointer[buffer_cntr]+4, fBlockA.Tx_L3, NUM_TX_SLOTS, DAC_NUM_SAMPLES);
fixData(tx_block_pointer[buffer_cntr]+5, fBlockA.Tx_R3, NUM_TX_SLOTS, DAC_NUM_SAMPLES);
fixData(tx_block_pointer[buffer_cntr]+6, fBlockA.Tx_L4, NUM_TX_SLOTS, DAC_NUM_SAMPLES);
fixData(tx_block_pointer[buffer_cntr]+7, fBlockA.Tx_R4, NUM_TX_SLOTS, DAC_NUM_SAMPLES);
// Clear the Processing Active Semaphore after processing is complete
isProcessing = 0;
}
#pragma optimize_as_cmd_line
这是我的代码的一部分。 AD1938_ISR是一个启动传输的中断处理程序。 tx_block_pointer包含指向dma缓冲区的指针(乒乓传输模式)。