VisualDSP ++调试模式与发布模式

时间:2016-10-18 11:19:42

标签: c signal-processing compiler-optimization

我在信号处理处理器(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缓冲区的指针(乒乓传输模式)。

0 个答案:

没有答案