This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMS320F2.8335万:问题延伸到全局优化级别2

Guru**** 2594310 points
Other Parts Discussed in Thread: C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/659035/ccs-tms320f28335-problem-reaching-out-global-optimization-level-2

部件号:TMS320F2.8335万
主题中讨论的其他部件: C2000WARE

工具/软件:Code Composer Studio

你好

我在尝试达到全局优化级别时遇到一些问题。 我正在开发一个音频应用程序,需要实时过滤和处理音频信号。 我在检查了本地优化功能是否正常后尝试了优化级别2,但它不起作用,因此我决定开始使用更少的代码进行优化。 我将所有内容都移动到一个脚本中,该脚本只会接收音频数据并将其发回,而不会进行处理,但我也无法达到全局优化级别。 我该怎么办? 这甚至是容易的吗? :P

我正在将外设浏览器套件与TMS320F2.8335万一起使用。 代码如下所示。  

提前感谢

/////////////////////////////////////////////////////////////////////////////////////////////////

#include "PeripheralHeaderIncludes.h"
包含"Codec.h"
#include "DSP2833x_Device.h"

//音频数据传输

// AIC23_DSP_SPI_CONTING.c外部函数原型
void SPIA_init(void);
废除AIC23_INIT();
void SPIA_xmit (Int16 spiaTxData);
void InitMcbspGpio(void);
Int16 I;
extern void InitSysCtrl();
extern void InitPieCtrl();
void delay_loop();

//本文件中找到的函数的prototype语句。
void init_dma(void);
void init_mcbspa(void);
中断void local_D_INTCH1_ISR(void);//通道1 Rx ISR
中断void local_D_INTCH2_ISR(void);//通道2 Tx ISR

#pragma data_section(ping_buffer,"DMARAML5");//在DMA RAM L5.
#pragma data_section (pong_buffer,"DMARAML5");

UINT32 ping_buffer[1024];//    请注意,使用的是UINT32,而不是UINT16
UINT32 PONG_BUFFER[1024];
UINT32 * L_CHANNEL =&PING_BUFFER[0];  //此指针指向任一缓冲区中L-C数据的开头
UINT32 * R_CHANNEL =&PING_BUFFER[512];//  此指针指向任一缓冲区中R-C数据的开头
UINT32 ping_buffer_offset =(UINT32)&ping_buffer [0];
UINT32 pong_buffer_offset =(UINT32)&pong_buffer [0];

UINT16 FIRST_INTERRUPT = 1;  // 1表示第一个中断
UINT32 K2 = 0;

Void主(void)

  EALLOW;

//步骤1. 初始化系统控制:
// PLL,看门狗,启用外设时钟
   InitSysCtrl();
//步骤2. 初始化GPIO:
//在此示例中,为McBSP操作启用GPIO引脚。
  InitMcbspGpio();
  ffor (k2=0;k2<1024;k2++){ ping_buffer[k2]= 0xDEADDEADDEAD;}
  对于(K2=0;K2<1024;K2+){ pong_buffer[K2]= 0xDEADDEADDEAD;}


//步骤3. 清除所有中断并初始化PIE矢量表:
//禁用CPU中断
  色调;

//将PIE控制寄存器初始化到其默认状态。
//默认状态是禁用所有PIE中断和标志
//被清除。
//此函数位于DSP2833x_PIECTRL.c文件中。
  InitPieCtrl();
  EALLOW;
  dint;        //再次禁用中断(目前)

//禁用CPU中断并清除所有CPU中断标志:
  IER = 0x0000;
  IFR = 0x0000;

//步骤4. 初始化外围设备

  ping_bufer_offset++;   //从位置1开始(从位置1开始的32位r/w,然后是0)
  pong_bufer_offset++;   //从位置1开始(从位置1开始的32位r/w,然后0)
  SPIA_INIT();//      初始化
  AIC23_init();// 设置AIC23

  init_dma();//           在McBSP之前初始化DMA,以便DMA可以传输McBSP数据
  init_mcbspa();        //初始化McBBSP-a
  delay_loop();

  EALLOW;
  DmaRegs.CH1.control.bit.run = 1;//在信道1上启动Rx

  PieVectorTable.DINTCH1 =&LOCAL_D_INTCH1_ISR;
  PieVectorTable.DINTCH2 =&LOCALE_D_INTCH2_ISR;

  PieCtrlRegs.PIECTRL.bit.ENPIE =1;// 从PIE块中启用矢量提取
  PieCtrlRegs.PIEACK.ALL = 0xFF;   //启用PIE将脉冲驱动到CPU

//可以在以下中断行中断言中断

  PieCtrlRegs.PIEIER7.bit.INTx1 = 1;  //启用INT7的INT.1 (DMA通道1)
  PieCtrlRegs.PIEIER7.bit.INTx2 = 1; //启用INT7的INT.2 (DMA通道2)

  IER || 0x0040;                  //启用 INT7
  EINT;                            //中断的全局启用
  EDIS;

    而(1){
    }//                 代码始终在此处循环
}

//===========================================================================================================================================
// main()结束
//===========================================================================================================================================

/ 7.1 -
中断void local_D_INTCH1_ISR(void)     // DMA通道1 - McBSPA-A Rx

 EALLOW;

    IF (FIRST_INTERRUPT = 1)//不需要处理(发生B/c中断)
   {//                     在DMA传输到ping缓冲区开始时-尚未收到数据)
       first_interrupT=0;//关闭标志并退出中断
   }否则
   {
   //在此处对缓冲数据执行任何所需的处理
     //完成后,切换到另一个缓冲区
       DmaRegs.CH2.control.bit.run = 1;//在CH1完成ping缓冲后在CH2上启动TX
   }
    //当DMA开始在ping缓冲区上工作时,设置阴影寄存器
    //  下一次在pong缓冲区开始,反之亦然
    IF (DmaRegs.CH1.DST_ADDR_shadow == ping_bufer_offset)
   {
      DmaRegs.CH1.DST_ADDR_shadow = pong_buy_offset;
        DmaRegs.CH1.DST_beG_ADDR_shadow = pong_buy_offset;
   }

   否则
   {
      DmaRegs.CH1.DST_ADDR_shadow = ping_bufer_offset;
        DmaRegs.CH1.DST_beG_ADDR_shadow = ping_buy_offset;
   }
 //要从此PIE组接收更多中断,请确认此中断
    PieCtrlRegs.PIEACK.ALL = PIEACK_group7;
    EDIS;
}

/ 7.2
中断void local_D_INTCH2_ISR(void)     // DMA通道2 - McBSPA-A Tx

 EALLOW;
   //当DMA开始在ping缓冲区上工作时,设置阴影寄存器
    //  下一次在pong缓冲区开始,反之亦然
      IF (DmaRegs.CH2.SRC_ADDR_shadow == ping_bufer_offset)
   {
       DmaRegs.CH2.SRC_ADDR_shadow = pong_buy_offset;
       DmaRegs.CH2.SRC_beG_ADDR_shadow = pong_buy_offset;
   }
   否则
   {
       DmaRegs.CH2.SRC_ADDR_shadow = ping_bufer_offset;
       DmaRegs.CH2.SRC_beG_ADDR_shadow = ping_bufer_offset;
   }

      PieCtrlRegs.PIEACK.ALL = PIEACK_group7;//要接收来自此PIE组的更多中断,请确认此中断
    EDIS;
}

void init_dma()

 EALLOW;
  DmaRegs.DMACTRL.bit.hardreset = 1;
  ASM ("    NOP");

  DMARegs.PRIORITYCTRL1.bit.CH1PRIORITY = 0;

  DmaRegs.CH1.burst_size.all = 1; // 2 16位字/连字符(每个RRDY 1个32位字)-内存地址内部被1碰撞
  DmaRegs.CH1.SRC_burst_step = 1; //必须先读取DRR2,然后再读取DRR1。 增量为1。 因此,值为+1。 (这是2的C #)
  DmaRegs.CH1.DST_STUST_STEP =-1; //将DRR2数据复制到地址N+1,将DRR1数据复制到N Hence -1 (32位读取=将addr N+1读取为MSB,然后将N读取为LSB)
  DmaRegs.CH1.transfer_size =1023; //每1024 (n+1)个脉冲中断一次。 McBSP仅处理16位数据(DRR2和DRR1是16位寄存器)

  DmaRegs.CH1.SRC_TRANSFER_STEP =-1;//在处理完突发数据后,将源地址从DRR1重新减至DRR2
  DmaRegs.CH1.DST_TRANSFER_STEP =1025;//复制L-C数据后,在给定缓冲区中向下移动到R-C数据

  DmaRegs.CH1.SRC_ADDR_shadow =(UINT32)&McbspaRegs.DR2.all; //首先从DRR2读取
  DmaRegs.CH1.SRC_beG_ADDR_shadow =(UINT32)&McbspaRegs.DR2.all;
  DmaRegs.CH1.DST_ADDR_shadow = ping_buffer_offset;              //首先写入ping_buffer[1]
  DmaRegs.CH1.DST_beG_ADDR_shadow = ping_buy_offset;

  DmaRegs.CH1.dst_wrap_size = 1;  //左(1)后,然后右(2)后,返回到左缓冲区
  DmaRegs.CH1.SRC_wrap_size = 0xffffff;//垂体大值。 我们永远不会来这里…
  DmaRegs.CH1.dst_wrap_step =2;//     从起始地址下移2个16位地址以写入nxt 32位字

  DmaRegs.CH1.control.bit.PERINTCLR = 1;  //清除外设中断,同步和sycn错误标志
  DmaRegs.CH1.control.bit.SYNCCLR = 1;
  DmaRegs.CH1.control.bit.ERRCLR = 1;

  DmaRegs.CH1.mode.bit.CHINTE =1;   //通道中断启用
  DmaRegs.CH1.MODE.bit.CHINTMODE =0;   //在传输开始时生成中断
  DmaRegs.CH1.mode.bit.PERINTE =1;   //启用外设中断
  DMARegs.CH1.MODE.Bit.PERINTSEL = 15;  // McBSP MREVTA
  DmaRegs.CH1.mode.bit.continuous = 1;  //连续模式

  DmaRegs.CH2.burst_size.all = 1; // 2 16位字/连字符(每个XRDY 1个32位字)-值内部被1递增
  DmaRegs.CH2.SRC_burst_step =-1; //首先将地址N+1处的数据复制到DXR2,然后将地址N处的数据复制到DXR1。 因此-1
  DmaRegs.CH2.DST_STUST_STEP = 1; // DXR2必须先写入,然后写入DXR1。 增量为1。 因此,值为+1。 (这是2的C #)
  DmaRegs.CH2.transfer_size =1023; //每1024 (n+1)个16位字中断一次。 McBSP仍然只处理寄存器中的16位数据

  DmaRegs.CH2.SRC_TRANSFER_STEP =1025;//复制L-C数据后,向下移动到给定缓冲区中的R-C数据
  DMARegs.CH2.DST_TRANSFER_STEP =-1;  //在处理完突发数据后,以1表示目标地址(DXR1返回DXR2)

  DmaRegs.CH2.SRC_ADDR_shadow = ping_buffer_offset;              //从ping_buffer[1]中首次读取
  DmaRegs.CH2.SRC_beG_ADDR_shadow = ping_bufer_offset;
  DmaRegs.CH2.DST_ADDR_shadow =(UINT32)&McbspaRegs.DXR2.all; //首先写入DXR2
  DmaRegs.CH2.dst_beg_ADDR_shadow =(UINT32)&McbspaRegs.DXR2.all;

  DmaRegs.CH2.SRC_wrap_size = 1;     //左(1)后,右(2)后,返回到左缓冲区
  DmaRegs.CH2.dst_wrap_size = 0xffffff;  //垂体大值。 我们永远不会来这里…
  DmaRegs.CH2.SRC_Wrap步骤=2;//        从起始地址下移2个16位地址,读取下一个32位字

  DmaRegs.CH2.control.bit.PERINTCLR = 1;  //清除外设中断,同步和同步错误标志
  DmaRegs.CH2.control.bit.SYNCCLR = 1;
  DmaRegs.CH2.control.bit.ERRCLR = 1;

  DmaRegs.CH2.mode.bit.CHINTE =1;   //通道中断启用
  DmaRegs.CH2.mode.bit.CHINTMODE =0;   //在传输开始时生成中断
  DmaRegs.CH2.mode.bit.PERINTE =1;   //启用外设中断
  DmaRegs.CH2.mode.bit.PERINTSEL = 14;  // McBSP MXEVTA
  DmaRegs.CH2.mode.bit.continuous = 1;  //连续模式
  EDIS;

  EALLOW;
  DmaRegs.CH1.control.bit.run = 1;   //启动通道1
  EDIS;
}


void init_mcbspa()

 EALLOW;
    McbspaRegs.SPR2.all=0x0000;  //重置FS生成器,采样率生成器和发送器
  McbspaRegs.SPCR1.all=0x0000;  //重置接收器,右对齐单词

    McbspaRegs.SPCR1.bit.RJUST = 2;  // DRR中左对齐单词和零填充LSB

  McbspaRegs.MFFINT.all=0x0;   //禁用所有中断

    McbspaRegs.SPCR1.bit.RINTM =0;  //配置McBSP中断
  McbspaRegs.SPR2.bit.XINTM = 0;

    McbspaRegs.RCR2.all=0x0;   //单相帧,1字/帧,无压扩 (接收)
    McbspaRegs.RCR1.all=0x0;

    McbspaRegs.XCR2.all=0x0;   //单相帧,1字/帧,无压扩 (传输)
    McbspaRegs.XCR1.all=0x0;

    McbspaRegs.RCR2.bit.RWDLEN2 = 5; // 32位操作
    McbspaRegs.RCR1.bit.RWDLEN1 = 5;
    McbspaRegs.XCR2.bit.XWDLEN2 = 5;
    McbspaRegs.XCR1.bit.XWDLEN1 = 5;

    McbspaRegs.RCR2.bit.RPHASE = 1;  //双相帧
  McbspaRegs.RCR2.bit.RFRLEN2 = 0; // Recv Frame length =第2阶段中的1个字
  McbspaRegs.RCR1.bit.RFRLEN1 = 0; // Recv frame length =第1阶段中的1个单词

  McbspaRegs.XCR2.bit.XPhase = 1;  //双相帧
  McbspaRegs.XCR2.bit.XFRLEN2 = 0; // Xmit帧长度=第2阶段中的1个字
  McbspaRegs.XCR1.bit.XFRLEN1 = 0; // Xmit帧长度=第1阶段中的1个字

  McbspaRegs.RCR2.bit.RDATDLY =1;// n = n位数据延迟(最大2)关键参数!!!
  McbspaRegs.XCR2.bit.XDATDLY = 1;   //如果LRP (AIC23)= 0,X/RDATDLY=0,如果LRP=1,X/RDATDLY=1


    McbspaRegs.SRGR2.bit.FPER = 0x0002; //无关紧要
    McbspaRegs.SRGR1.all=0x0001;  //帧宽度= 1 CLKG周期,CLKGDV必须为1作为从属设备!!
                                        // LSPCLK为SRG计时- SRG时钟必须至少为2倍外部数据转换时钟

    McbspaRegs.pcr.all=0x0000;   //外部生成帧同步,CLKX/CLKR驱动
    McbspaRegs.pcr.bit.FSXM = 0;  // FSX始终是一个I/p信号
  McbspaRegs.pcr.bit.fSRM = 0;  // FSR始终是一个I/p信号
  McbspaRegs.pcr.bit.SCLKME = 0;

    McbspaRegs.pcr.bit.fSRP = 0;  // 1-FSRP处于活动状态低0-FSRP处于活动状态高
  McbspaRegs.pcr.bit.fsXP = 0;       // 0-FSXP处于活动低电平状态
    McbspaRegs.pcr.bit.CLKRP = 1;  //在CLKR上升沿采样的1-Rcvd数据
  McbspaRegs.pcr.bit.CLKXP = 0;     // 0-在CLKX的下降边缘采样Tx数据
  McbspaRegs.SRGR2.bit.CLKSM = 1;  // LSPCLK是SRG的时钟源

  McbspaRegs.pcr.bit.CLKXM = 0;  // 0-MCLKXA是由外部时钟驱动的I/p
    McbspaRegs.pcr.bit.CLKRM = 0;  // MCLKRA是一个I/p信号

    McbspaRegs.SPR2.all |=0x00C0;     //帧同步和采样率发生器已从重置中拉出

    delay_loop();

  McbspaRegs.SPR2.bit.XRST=1;       //启用发射器
    McbspaRegs.SPCR1.bit.RRST=1;  //启用接收器

    EDIS;
    delay_loop();
}

void spia_init()

 SpiaRegs.SPICCR.bit.SPISWRESET =0;  //在复位时保持SPI
 SpiaRegs.SPIFFTX.Bit.SPIRST =0;  //在复位时保持两个FIFO
 SpiaRegs.SPIFFRX.Bit.RXFIFORESET = 0; //在复位时保持RX FIFO

 SpiaRegs.SPICCR.bit.SPICHAR = 15;  // 16位字符
 SpiaRegs.SPICCR.bit.CLKPOLARITY = 1; //下降沿输出
 SpiaRegs.SPICCR.Bit.SPILBK = 0;   //无环回
 SpiaRegs.SPIBRR = 99;     //波特率选择

 SpiaRegs.SPICTL.bit.Master_slave = 1; //主模式
 SpiaRegs.SPICTL.bit.CLK_PHASE =0;  //无延迟
 SpiaRegs.SPICTL.Bit.OVERRUNINTENA = 0; //禁用
 SpiaRegs.SPICTL.Bit.Talk = 1;   //启用TX
 SpiaRegs.SPICTL.bit.SPIINTENA = 1;  //启用中断请求
   SpiaRegs.SPIPRI.Bit.free = 0;   //设置为使brkpts不干扰xmission

 SpiaRegs.SPIFFRX.Bit.RXFFIL = 1;  //设置3字节后的标志rcv
 SpiaRegs.SPIFFRX.Bit.RXFFINTCLR = 1; //清除任何虚假Int标志
 SpiaRegs.SPIFFRX.Bit.RXFIFORESET =1; //从重置中释放RX FIFO
 SpiaRegs.SPIFFTX.Bit.SPIRST =1;  //从复位释放两个FIFO
 SpiaRegs.SPIFFTX.Bit.SPIFFENA =0;  //禁用FIFO功能
 SpiaRegs.SPICCR.bit.SPISWRESET =1;  //从重置释放SPI
}

void SPIA_xmit (Int16 spixData)

 SpiaRegs.SPITXBUF = spiTxData;
 而(SpiaRegs.SPISTS.bit.INT_flag !=1){}// 等待字符已转移
 i = SpiaRegs.SPIRXBUF;    //清除INT_FLAG
}


作废AIC23_INIT()

   UINT16命令;
   命令= reset();
 SPIA_xmit (命令);
   Command = softpowerdown ();      //关闭除设备和时钟之外的所有设备
 SPIA_xmit (命令);
   命令= linput-volctl (LIV);   //取消左行输入静音并保持默认音量
 SPIA_xmit (命令);
 命令= rinput_volctl (RIV);   //取消右线路输入静音并保持默认音量
 SPIA_xmit (命令);
 Command = Lhp_volctl (LHV);      //左耳机音量控制
 SPIA_xmit (命令);
 命令= rhp_volctl (RHV);      //右侧耳机音量控制
 SPIA_xmit (命令);
#IF MIC
   命令= aaudpath();
#否则
 命令= nomicaaudpath();//     打开DAC,静音麦克风
#endif
 SPIA_xmit (命令);
 命令= digaudiopath();//      禁用DAC静音
 SPIA_xmit (命令);
 命令= DSPdigaudinterface();   // AIC23主模式,DSP模式,32位数据,LRP=1与XDATADLY=1匹配
 SPIA_xmit (命令);
 Command =USBsampleratecontrol (SRUSB44_1);// 12 MHz USB时钟- 44.1 MHz采样率(USB模式)
 SPIA_xmit (命令);
 命令= digact();//            激活数字接口
 SPIA_xmit (命令);
#IF MIC
   命令= fullpowerup ();
#否则
 Command = nomicpowerup ();     //打开除Mic之外的所有功能。
#endif
   SPIA_xmit (命令);
}


void InitMcbspGpio (void)

EALLOW;
   GpioCtrlRegs.GPAMUX1.all = 0;//     GPIO15... GPIO0 =一般性尸体I/O
   GpioCtrlRegs.GPAMUX2.all = 0;//     GPIO31... GPIO16 =通用I/O
   gpioCtrlRegs.GPBMUX1.all = 0;     // GPIO47... GPIO32 =通用I/O
   gpioCtrlRegs.GPBMUX2.all = 0;     // GPIO63... GPIO48 =通用I/O
   GpioCtrlRegs.GPCMUX1.ALL =0;//     GPIO79... GPIO64 =通用I/O
   GpioCtrlRegs.GPCMUX2.all = 0;//     GPIO87... GPIO80 =通用I/O

   GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1;  // AIC23的SPI-A SPISIMO "SDIN"
   GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1;  // AIC23的SPI-A SPICLK  
   GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1;  // AIC23的SPI-A SPISTE "/CS"

   GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 2;  // McBBSP-A MDXA ,用于AIC23 "DIN"
   GpioCtrlRegs.GPAQSEL2.bit.GPIO20 = 3;  //仅异步
   GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 2;  // McBBSP-A MDRA ,用于AIC23 "DOUT"
   GpioCtrlRegs.GPAQSEL2.bit.GPIO21 = 3;  //仅异步
   GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 2;  // McBBSP-A MCLKXA for AIC23 "BCLK"
   GpioCtrlRegs.GPAQSEL2.bit.GPIO22 = 3;  //仅异步
   GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 2;  // McBBSP-A MFSXA for AIC23 "LRCIN"
   GpioCtrlRegs.GPAQSEL2.bit.GPIO23 = 3;  //仅异步
   gpioCtrlRegs.GPBMUX2.bit.GPIO58 = 1;  // McBBSP-A MCLKRA,用于AIC23 "BCLK"
   gpioCtrlRegs.GPBMUX2.bit.GPIO59 = 1;  // McBBSP-A MFSRA,用于AIC23 "LRCOUT"

   gpioCtrlRegs.gpadir.all = 0;
   gpioCtrlRegs.GPADIR.bit.GPIO9 = 1;     //外围设备浏览器:GPIO9的LED LD1
   gpioCtrlRegs.GPADIR.bit.GPIO11 = 1;     //外围设备浏览器:GPIO11的LED LD2

   GpioCtrlRegs.GPBDIR.ALL = 0;        // GPIO63-32作为输入
   GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;     //外围设备浏览器:GPIO34的LED LD3
   GpioCtrlRegs.GPBDIR.bit.GPIO49 = 1;   //外围设备浏览器:GPIO49的LED LD4

   GpioCtrlRegs.GPCDIR.ALL = 0;        // GPIO87-64作为输入
   EDIS;
}

void delay_loop (void)

   注册信息     ;
   对于(I =0;I < 8;I++),{}//McBSP初始化中的延迟必须至少为2个SRG周期
}
//===========================================================================================================================================
//文件结束。
//===========================================================================================================================================

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我将所有内容都移动到一个脚本中,该脚本仅提取音频数据并将其发回,而不进行处理,但我也无法达到全局优化级别。 我该怎么办?[/QUOT]

    令人遗憾的是,这种描述是模糊的。  您如何知道它不起作用?  您到底在看什么?

    我确实看到一个问题。   

    void delay_loop(void)

       注册信息     ;
       对于(I =0;I < 8;I++),{}//McBSP初始化中的延迟必须至少为2个SRG周期
    }

    您需要将"volate"添加到变量i中,否则编译器会将所有这些都优化掉。  有关 详细背景信息,请参阅易失性文章。  您可能还需要对其他变量使用volatile。

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我知道它不起作用是因为使用本地优化O1时应用程序正在工作,而当我更改为O2时它不工作,我无法得到输出信号 ,我无法告诉您问题的确切位置。  

    我曾尝试在您告诉我的变量中添加"volate",但它仍然不起作用。 然后我尝试在其他变量中添加volatile,但它也不能解决问题。  该问题还可能与哪些方面相关?

    谢谢,谨致问候

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    I know it is not working because with local optimization O1 the application is working and when I change to O2 it does not work, I can no output signal I cannot tell you the problem is excute.(
    我知道它不工作,因为使用本地  [/引述]

    [/quote]

    然后,您需要有关调试此问题的帮助,以便找到根本原因。  我缺乏所需的专业知识。  我将通知C2000专家,其中一位专家应该能够提出一些建议。

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Ignacio,

    为了帮助您调试代码,您能否与我分享您的设置和您预期的输入/输出? 有关如何确定代码未正常运行的任何特定信息将有助于调试和查找根本原因。


    谢谢!

    陶默

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../opt.zip

    您好,Taumer,

    我正在插入项目的文件系统。

    我一直在寻找这个问题,我发现编译器决定在使用全局选项O2时忽略接收数据中断(interrupt void local_D_INTCH1_ISR(void))。 虽然本地优化工作正常,但它似乎正在尝试访问一些不存在的内存空间。 这表明可能存在一些配置问题,但在调试之后,似乎在到达While循环之前,它的性能良好。 然后,出现"查看不可拆卸"消息...

    该应用程序允许从外设浏览器板的线路输入接收音频数据,并以相同方式通过耳机输出将其发回。 我决定暂时取出信号处理部分,以便更容易找到问题。  

    提前感谢并致以诚挚的问候

    Ignacio

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Ignacio,

    我成功地提取了您的代码并构建了项目。  

    [报价用户="user490.3031万"]

    \我发现编译器决定在使用全局选项O2时忽略接收数据中断(interrupt void local_D_INTCH1_ISR(void))。 虽然本地优化工作正常,但它似乎正在尝试访问一些不存在的内存空间。  

    [/引述]  

    您能解释一下当您说编译器正在忽略中断时的含义吗? 是否无法在函数中设置断点并在遇到该断点时停止执行? 您看到的是什么结果导致您认为代码在优化级别2上运行不正常?

    [报价用户="user490.3031万"]

    但是,在调试之后,它似乎在到达while循环之前表现良好。 然后,出现"查看不可拆卸"消息...

    [/引述]

    您在此处指的是哪个while循环? 此外,您尝试将volatile关键字与一起使用的变量有哪些? 我看到你更新了delay_loop中的counter变量以使用volatile关键字,但我看不到其他关键字。

    谢谢!

    Taumer

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Taumer,

    当我说编译器忽略中断时,我的意思是如果我在 中断“void local_D_INTCH1_ISR(void)"的开始处设置中断点,它不允许我继续使用O2调试该ISR的行。 而在O1中,则可以。

    我指的是"while (1)"循环,在main内。 但是,我已经能够准确地检测到问题,它位于while循环之前。 通过比较O1和O2中的拆卸视图,我注意到以下行

      PieVectorTable.DINTCH1 =&LOCAL_D_INTCH1_ISR;
      PieVectorTable.DINTCH2 =&LOCALE_D_INTCH2_ISR;

    未编译。 此外,如果我在编辑视图中的任何行中设置了断点,则在运行应用程序时,它们将消失,并且不允许我在调试视图中再次设置断点! 它只发生在那里。 如何解决? 我认为这是我要解决的主要问题。 如果能够编译这些行,我相信该应用程序可以在O2中轻松运行。 因此,问题似乎与中断配置有关。  

    我只是在您所说的地方使用volatile。 我试图将它添加到其他变量中,但没有运气,所以,由于我不太确定我应该在其他地方使用它,当我给你发送项目时,我擦除了其他变量的关键字,只保留delay_loop函数的易失性。 然而,我并不感谢,这是最大的问题。 变量不多。

    我还更改了一些指令的顺序,并擦除了一些不正确的EALLOW和EDIS指令。 我在此处添加生成的源文件,尽管我遇到了相同的问题。 不过,这是更正确的做法。

    此致

    -Ignacio

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////

    #include "PeripheralHeaderIncludes.h"
    包含"Codec.h"
    #include "DSP2833x_Device.h"

    //音频数据传输

    // AIC23_DSP_SPI_CONTING.c外部函数原型
    void SPIA_init(void);
    废除AIC23_INIT();
    void SPIA_xmit (Int16 spiaTxData);
    void InitMcbspGpio(void);
    Int16 I;
    extern void InitSysCtrl();
    extern void InitPieCtrl();
    void delay_loop();

    //本文件中找到的函数的prototype语句。
    void init_dma(void);
    void init_mcbspa(void);
    中断void local_D_INTCH1_ISR(void);//通道1 Rx ISR
    中断void local_D_INTCH2_ISR(void);//通道2 Tx ISR

    #pragma data_section(ping_buffer,"DMARAML5");//在DMA RAM L5.
    #pragma data_section (pong_buffer,"DMARAML5");

    UINT32 ping_buffer[1024];//    请注意,使用的是UINT32,而不是UINT16
    UINT32 PONG_BUFFER[1024];

    UINT32 ping_buffer_offset =(UINT32)&ping_buffer [0];
    UINT32 pong_buffer_offset =(UINT32)&pong_buffer [0];

    volatile UINT16 first_interrupt =1;  // 1表示第一个中断
    UINT32 K2 = 0;

    Void主(void)


    //步骤1. 初始化系统控制:
    // PLL,看门狗,启用外设时钟
       InitSysCtrl();
    //步骤2. 初始化GPIO:
    //在此示例中,为McBSP操作启用GPIO引脚。
      InitMcbspGpio();

      ffor (k2=0;k2<1024;k2++){ ping_buffer[k2]= 0xDEADDEADDEAD;}
      对于(K2=0;K2<1024;K2+){ pong_buffer[K2]= 0xDEADDEADDEAD;}


    //步骤3. 清除所有中断并初始化PIE矢量表:
    //禁用CPU中断
      色调;

    //将PIE控制寄存器初始化到其默认状态。
    //默认状态是禁用所有PIE中断和标志
    //被清除。
    //此函数位于DSP2833x_PIECTRL.c文件中。
      InitPieCtrl();

      dint;        //再次禁用中断(目前)

    //禁用CPU中断并清除所有CPU中断标志:
      IER = 0x0000;
      IFR = 0x0000;


    //步骤4. 初始化外围设备

      ping_bufer_offset++;   //从位置1开始(从位置1开始的32位r/w,然后是0)
      pong_bufer_offset++;   //从位置1开始(从位置1开始的32位r/w,然后0)

      SPIA_INIT();//      初始化
      AIC23_init();// 设置AIC23

      init_dma();//           在McBSP之前初始化DMA,以便DMA可以传输McBSP数据
      init_mcbspa();        //初始化McBBSP-a
      delay_loop();

      EALLOW;

      PieVectorTable.DINTCH1 =&LOCAL_D_INTCH1_ISR;
      PieVectorTable.DINTCH2 =&LOCALE_D_INTCH2_ISR;

      EDIS;
    //可以在以下中断行中断言中断

      PieCtrlRegs.PIEIER7.bit.INTx1 = 1;  //启用INT7的INT.1 (DMA通道1)
      PieCtrlRegs.PIEIER7.bit.INTx2 = 1; //启用INT7的INT.2 (DMA通道2)

      IER || 0x0040;                  //启用 INT7

      EALLOW;
      DmaRegs.CH1.control.bit.run = 1;//在信道1上启动Rx
      EDIS;

      PieCtrlRegs.PIECTRL.bit.ENPIE =1;// 从PIE块中启用矢量提取
      PieCtrlRegs.PIEACK.ALL = 0xFF;   //启用PIE将脉冲驱动到CPU
      EINT;                            //中断的全局启用

        而(1){
         asm (" idle"); //等待中断而不执行循环
        }//                 代码始终在此处循环
    }

    //===========================================================================================================================================
    // main()结束
    //===========================================================================================================================================

    / 7.1 -
    中断void local_D_INTCH1_ISR(void)     // DMA通道1 - McBSPA-A Rx

     EALLOW;

        IF (FIRST_INTERRUPT = 1)//不需要处理(发生B/c中断)
       {//                     在DMA传输到ping缓冲区开始时-尚未收到数据)
           first_interrupT=0;//关闭标志并退出中断
       }
        否则
       {
       //在此处对缓冲数据执行任何所需的处理
         //完成后,切换到另一个缓冲区
           DmaRegs.CH2.control.bit.run = 1;//在CH1完成ping缓冲后在CH2上启动TX
       }
        //当DMA开始在ping缓冲区上工作时,设置阴影寄存器
        //  下一次在pong缓冲区开始,反之亦然
        IF (DmaRegs.CH1.DST_ADDR_shadow == ping_bufer_offset)
       {
          DmaRegs.CH1.DST_ADDR_shadow = pong_buy_offset;
            DmaRegs.CH1.DST_beG_ADDR_shadow = pong_buy_offset;
       }

       否则
       {
          DmaRegs.CH1.DST_ADDR_shadow = ping_bufer_offset;
            DmaRegs.CH1.DST_beG_ADDR_shadow = ping_buy_offset;
       }
     //要从此PIE组接收更多中断,请确认此中断
        PieCtrlRegs.PIEACK.ALL = PIEACK_group7;
        EDIS;
    }

    / 7.2
    中断void local_D_INTCH2_ISR(void)     // DMA通道2 - McBSPA-A Tx

     EALLOW;
       //当DMA开始在ping缓冲区上工作时,设置阴影寄存器
        //  下一次在pong缓冲区开始,反之亦然
          IF (DmaRegs.CH2.SRC_ADDR_shadow == ping_bufer_offset)
       {
           DmaRegs.CH2.SRC_ADDR_shadow = pong_buy_offset;
           DmaRegs.CH2.SRC_beG_ADDR_shadow = pong_buy_offset;
       }
       否则
       {
           DmaRegs.CH2.SRC_ADDR_shadow = ping_bufer_offset;
           DmaRegs.CH2.SRC_beG_ADDR_shadow = ping_bufer_offset;
       }

          PieCtrlRegs.PIEACK.ALL = PIEACK_group7;//要接收来自此PIE组的更多中断,请确认此中断
        EDIS;
    }

    void init_dma()

     EALLOW;
      DmaRegs.DMACTRL.bit.hardreset = 1;
      ASM ("    NOP");

      DMARegs.PRIORITYCTRL1.bit.CH1PRIORITY = 0;

      DmaRegs.CH1.burst_size.all = 1; // 2 16位字/连字符(每个RRDY 1个32位字)-内存地址内部被1碰撞
      DmaRegs.CH1.SRC_burst_step = 1; //必须先读取DRR2,然后再读取DRR1。 增量为1。 因此,值为+1。 (这是2的C #)
      DmaRegs.CH1.DST_STUST_STEP =-1; //将DRR2数据复制到地址N+1,将DRR1数据复制到N Hence -1 (32位读取=将addr N+1读取为MSB,然后将N读取为LSB)
      DmaRegs.CH1.transfer_size =1023; //每1024 (n+1)个脉冲中断一次。 McBSP仅处理16位数据(DRR2和DRR1是16位寄存器)

      DmaRegs.CH1.SRC_TRANSFER_STEP =-1;//在处理完突发数据后,将源地址从DRR1重新减至DRR2
      DmaRegs.CH1.DST_TRANSFER_STEP =1025;//复制L-C数据后,在给定缓冲区中向下移动到R-C数据

      DmaRegs.CH1.SRC_ADDR_shadow =(UINT32)&McbspaRegs.DR2.all; //首先从DRR2读取
      DmaRegs.CH1.SRC_beG_ADDR_shadow =(UINT32)&McbspaRegs.DR2.all;
      DmaRegs.CH1.DST_ADDR_shadow = ping_buffer_offset;              //首先写入ping_buffer[1]
      DmaRegs.CH1.DST_beG_ADDR_shadow = ping_buy_offset;

      DmaRegs.CH1.dst_wrap_size = 1;  //左(1)后,然后右(2)后,返回到左缓冲区
      DmaRegs.CH1.SRC_wrap_size = 0xffffff;//垂体大值。 我们永远不会来这里…
      DmaRegs.CH1.dst_wrap_step =2;//     从起始地址下移2个16位地址以写入nxt 32位字

      DmaRegs.CH1.control.bit.PERINTCLR = 1;  //清除外设中断,同步和sycn错误标志
      DmaRegs.CH1.control.bit.SYNCCLR = 1;
      DmaRegs.CH1.control.bit.ERRCLR = 1;

      DmaRegs.CH1.mode.bit.CHINTE =1;   //通道中断启用
      DmaRegs.CH1.MODE.bit.CHINTMODE =0;   //在传输开始时生成中断
      DmaRegs.CH1.mode.bit.PERINTE =1;   //启用外设中断
      DMARegs.CH1.MODE.Bit.PERINTSEL = 15;  // McBSP MREVTA
      DmaRegs.CH1.mode.bit.continuous = 1;  //连续模式


      DmaRegs.CH2.burst_size.all = 1; // 2 16位字/连字符(每个XRDY 1个32位字)-值内部被1递增
      DmaRegs.CH2.SRC_burst_step =-1; //首先将地址N+1处的数据复制到DXR2,然后将地址N处的数据复制到DXR1。 因此-1
      DmaRegs.CH2.DST_STUST_STEP = 1; // DXR2必须先写入,然后写入DXR1。 增量为1。 因此,值为+1。 (这是2的C #)
      DmaRegs.CH2.transfer_size =1023; //每1024 (n+1)个16位字中断一次。 McBSP仍然只处理寄存器中的16位数据

      DmaRegs.CH2.SRC_TRANSFER_STEP =1025;//复制L-C数据后,向下移动到给定缓冲区中的R-C数据
      DMARegs.CH2.DST_TRANSFER_STEP =-1;  //在处理完突发数据后,以1表示目标地址(DXR1返回DXR2)

      DmaRegs.CH2.SRC_ADDR_shadow = ping_buffer_offset;              //从ping_buffer[1]中首次读取
      DmaRegs.CH2.SRC_beG_ADDR_shadow = ping_bufer_offset;
      DmaRegs.CH2.DST_ADDR_shadow =(UINT32)&McbspaRegs.DXR2.all; //首先写入DXR2
      DmaRegs.CH2.dst_beg_ADDR_shadow =(UINT32)&McbspaRegs.DXR2.all;

      DmaRegs.CH2.SRC_wrap_size = 1;     //左(1)后,右(2)后,返回到左缓冲区
      DmaRegs.CH2.dst_wrap_size = 0xffffff;  //垂体大值。 我们永远不会来这里…
      DmaRegs.CH2.SRC_Wrap步骤=2;//        从起始地址下移2个16位地址,读取下一个32位字

      DmaRegs.CH2.control.bit.PERINTCLR = 1;  //清除外设中断,同步和同步错误标志
      DmaRegs.CH2.control.bit.SYNCCLR = 1;
      DmaRegs.CH2.control.bit.ERRCLR = 1;

      DmaRegs.CH2.mode.bit.CHINTE =1;   //通道中断启用
      DmaRegs.CH2.mode.bit.CHINTMODE =0;   //在传输开始时生成中断
      DmaRegs.CH2.mode.bit.PERINTE =1;   //启用外设中断
      DmaRegs.CH2.mode.bit.PERINTSEL = 14;  // McBSP MXEVTA
      DmaRegs.CH2.mode.bit.continuous = 1;  //连续模式
      EDIS;

      /* EALLOW;
      DmaRegs.CH1.control.bit.run = 1;   //启动通道1
      EDIS;*/
    }


    void init_mcbspa()

     EALLOW;
        McbspaRegs.SPR2.all=0x0000;  //重置FS生成器,采样率生成器和发送器
      McbspaRegs.SPCR1.all=0x0000;  //重置接收器,右对齐单词

        McbspaRegs.SPCR1.bit.RJUST = 2;  // DRR中左对齐单词和零填充LSB

      McbspaRegs.MFFINT.all=0x0;   //禁用所有中断

        McbspaRegs.SPCR1.bit.RINTM =0;  //配置McBSP中断
      McbspaRegs.SPR2.bit.XINTM = 0;

        McbspaRegs.RCR2.all=0x0;   //单相帧,1字/帧,无压扩 (接收)
        McbspaRegs.RCR1.all=0x0;

        McbspaRegs.XCR2.all=0x0;   //单相帧,1字/帧,无压扩 (传输)
        McbspaRegs.XCR1.all=0x0;

        McbspaRegs.RCR2.bit.RWDLEN2 = 5; // 32位操作
        McbspaRegs.RCR1.bit.RWDLEN1 = 5;
        McbspaRegs.XCR2.bit.XWDLEN2 = 5;
        McbspaRegs.XCR1.bit.XWDLEN1 = 5;

        McbspaRegs.RCR2.bit.RPHASE = 1;  //双相帧
      McbspaRegs.RCR2.bit.RFRLEN2 = 0; // Recv Frame length =第2阶段中的1个字
      McbspaRegs.RCR1.bit.RFRLEN1 = 0; // Recv frame length =第1阶段中的1个单词

      McbspaRegs.XCR2.bit.XPhase = 1;  //双相帧
      McbspaRegs.XCR2.bit.XFRLEN2 = 0; // Xmit帧长度=第2阶段中的1个字
      McbspaRegs.XCR1.bit.XFRLEN1 = 0; // Xmit帧长度=第1阶段中的1个字

      McbspaRegs.RCR2.bit.RDATDLY =1;// n = n位数据延迟(最大2)关键参数!!!
      McbspaRegs.XCR2.bit.XDATDLY = 1;   //如果LRP (AIC23)= 0,X/RDATDLY=0,如果LRP=1,X/RDATDLY=1


        McbspaRegs.SRGR2.bit.FPER = 0x0002; //无关紧要
        McbspaRegs.SRGR1.all=0x0001;  //帧宽度= 1 CLKG周期,CLKGDV必须为1作为从属设备!!
                                            // LSPCLK为SRG计时- SRG时钟必须至少为2倍外部数据转换时钟

        McbspaRegs.pcr.all=0x0000;   //外部生成帧同步,CLKX/CLKR驱动
        McbspaRegs.pcr.bit.FSXM = 0;  // FSX始终是一个I/p信号
      McbspaRegs.pcr.bit.fSRM = 0;  // FSR始终是一个I/p信号
      McbspaRegs.pcr.bit.SCLKME = 0;

        McbspaRegs.pcr.bit.fSRP = 0;  // 1-FSRP处于活动状态低0-FSRP处于活动状态高
      McbspaRegs.pcr.bit.fsXP = 0;       // 0-FSXP处于活动低电平状态
        McbspaRegs.pcr.bit.CLKRP = 1;  //在CLKR上升沿采样的1-Rcvd数据
      McbspaRegs.pcr.bit.CLKXP = 0;     // 0-在CLKX的下降边缘采样Tx数据
      McbspaRegs.SRGR2.bit.CLKSM = 1;  // LSPCLK是SRG的时钟源

      McbspaRegs.pcr.bit.CLKXM = 0;  // 0-MCLKXA是由外部时钟驱动的I/p
        McbspaRegs.pcr.bit.CLKRM = 0;  // MCLKRA是一个I/p信号

        McbspaRegs.SPR2.all |=0x00C0;     //帧同步和采样率发生器已从重置中拉出

        delay_loop();

      McbspaRegs.SPR2.bit.XRST=1;       //启用发射器
        McbspaRegs.SPCR1.bit.RRST=1;  //启用接收器

        EDIS;
        delay_loop();
    }

    void spia_init()

     SpiaRegs.SPICCR.bit.SPISWRESET =0;  //在复位时保持SPI
     SpiaRegs.SPIFFTX.Bit.SPIRST =0;  //在复位时保持两个FIFO
     SpiaRegs.SPIFFRX.Bit.RXFIFORESET = 0; //在复位时保持RX FIFO

     SpiaRegs.SPICCR.bit.SPICHAR = 15;  // 16位字符
     SpiaRegs.SPICCR.bit.CLKPOLARITY = 1; //下降沿输出
     SpiaRegs.SPICCR.Bit.SPILBK = 0;   //无环回
     SpiaRegs.SPIBRR = 99;     //波特率选择

     SpiaRegs.SPICTL.bit.Master_slave = 1; //主模式
     SpiaRegs.SPICTL.bit.CLK_PHASE =0;  //无延迟
     SpiaRegs.SPICTL.Bit.OVERRUNINTENA = 0; //禁用
     SpiaRegs.SPICTL.Bit.Talk = 1;   //启用TX
     SpiaRegs.SPICTL.bit.SPIINTENA = 1;  //启用中断请求
       SpiaRegs.SPIPRI.Bit.free = 0;   //设置为使brkpts不干扰xmission

     SpiaRegs.SPIFFRX.Bit.RXFFIL = 1;  //设置3字节后的标志rcv
     SpiaRegs.SPIFFRX.Bit.RXFFINTCLR = 1; //清除任何虚假Int标志
     SpiaRegs.SPIFFRX.Bit.RXFIFORESET =1; //从重置中释放RX FIFO
     SpiaRegs.SPIFFTX.Bit.SPIRST =1;  //从复位释放两个FIFO
     SpiaRegs.SPIFFTX.Bit.SPIFFENA =0;  //禁用FIFO功能
     SpiaRegs.SPICCR.bit.SPISWRESET =1;  //从重置释放SPI
    }

    void SPIA_xmit (Int16 spixData)

     SpiaRegs.SPITXBUF = spiTxData;
     而(SpiaRegs.SPISTS.bit.INT_flag !=1){}// 等待字符已转移
     i = SpiaRegs.SPIRXBUF;    //清除INT_FLAG
    }


    作废AIC23_INIT()

       UINT16命令;
       命令= reset();
     SPIA_xmit (命令);
       Command = softpowerdown ();      //关闭除设备和时钟之外的所有设备
     SPIA_xmit (命令);
       命令= linput-volctl (LIV);   //取消左行输入静音并保持默认音量
     SPIA_xmit (命令);
     命令= rinput_volctl (RIV);   //取消右线路输入静音并保持默认音量
     SPIA_xmit (命令);
     Command = Lhp_volctl (LHV);      //左耳机音量控制
     SPIA_xmit (命令);
     命令= rhp_volctl (RHV);      //右侧耳机音量控制
     SPIA_xmit (命令);
    #IF MIC
       命令= aaudpath();
    #否则
     命令= nomicaaudpath();//     打开DAC,静音麦克风
    #endif
     SPIA_xmit (命令);
     命令= digaudiopath();//      禁用DAC静音
     SPIA_xmit (命令);
     命令= DSPdigaudinterface();   // AIC23主模式,DSP模式,32位数据,LRP=1与XDATADLY=1匹配
     SPIA_xmit (命令);
     Command =USBsampleratecontrol (SRUSB44_1);// 12 MHz USB时钟- 44.1 MHz采样率(USB模式)
     SPIA_xmit (命令);
     命令= digact();//            激活数字接口
     SPIA_xmit (命令);
    #IF MIC
       命令= fullpowerup ();
    #否则
     Command = nomicpowerup ();     //打开除Mic之外的所有功能。
    #endif
       SPIA_xmit (命令);
    }


    void InitMcbspGpio (void)

    EALLOW;
       GpioCtrlRegs.GPAMUX1.all = 0;//     GPIO15... GPIO0 =一般性尸体I/O
       GpioCtrlRegs.GPAMUX2.all = 0;//     GPIO31... GPIO16 =通用I/O
       gpioCtrlRegs.GPBMUX1.all = 0;     // GPIO47... GPIO32 =通用I/O
       gpioCtrlRegs.GPBMUX2.all = 0;     // GPIO63... GPIO48 =通用I/O
       GpioCtrlRegs.GPCMUX1.ALL =0;//     GPIO79... GPIO64 =通用I/O
       GpioCtrlRegs.GPCMUX2.all = 0;//     GPIO87... GPIO80 =通用I/O

       GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1;  // AIC23的SPI-A SPISIMO "SDIN"
       GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1;  // AIC23的SPI-A SPICLK  
       GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1;  // AIC23的SPI-A SPISTE "/CS"

       GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 2;  // McBBSP-A MDXA ,用于AIC23 "DIN"
       GpioCtrlRegs.GPAQSEL2.bit.GPIO20 = 3;  //仅异步
       GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 2;  // McBBSP-A MDRA ,用于AIC23 "DOUT"
       GpioCtrlRegs.GPAQSEL2.bit.GPIO21 = 3;  //仅异步
       GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 2;  // McBBSP-A MCLKXA for AIC23 "BCLK"
       GpioCtrlRegs.GPAQSEL2.bit.GPIO22 = 3;  //仅异步
       GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 2;  // McBBSP-A MFSXA for AIC23 "LRCIN"
       GpioCtrlRegs.GPAQSEL2.bit.GPIO23 = 3;  //仅异步
       gpioCtrlRegs.GPBMUX2.bit.GPIO58 = 1;  // McBBSP-A MCLKRA,用于AIC23 "BCLK"
       gpioCtrlRegs.GPBMUX2.bit.GPIO59 = 1;  // McBBSP-A MFSRA,用于AIC23 "LRCOUT"

       gpioCtrlRegs.gpadir.all = 0;
       gpioCtrlRegs.GPADIR.bit.GPIO9 = 1;     //外围设备浏览器:GPIO9的LED LD1
       gpioCtrlRegs.GPADIR.bit.GPIO11 = 1;     //外围设备浏览器:GPIO11的LED LD2

       GpioCtrlRegs.GPBDIR.ALL = 0;        // GPIO63-32作为输入
       GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;     //外围设备浏览器:GPIO34的LED LD3
       GpioCtrlRegs.GPBDIR.bit.GPIO49 = 1;   //外围设备浏览器:GPIO49的LED LD4

       GpioCtrlRegs.GPCDIR.ALL = 0;        // GPIO87-64作为输入
       EDIS;
    }

    void delay_loop (void)

       易失性int     j; //USO de volatile¿?
       对于(j = 0;j < 8;j++),{}// McBSP初始化中的延迟必须至少为2个SRG周期
    }
    //===========================================================================================================================================
    //文件结束。
    //===========================================================================================================================================

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Ignacio,

    [报价用户="user490.3031万"]

    我指的是"while (1)"循环,在main内。 但是,我已经能够准确地检测到问题,它位于while循环之前。 通过比较O1和O2中的拆卸视图,我注意到以下行

      PieVectorTable.DINTCH1 =&LOCAL_D_INTCH1_ISR;
      PieVectorTable.DINTCH2 =&LOCALE_D_INTCH2_ISR;

    [/引述]

    我能够在这两条线路上设置断点,并在每次使用O1和O2时都停止执行。 我还可以在拆分窗口中看到代码。 因此,我相信这两条线的编制都是正确的。  

    您能否详细说明您如何确定应用程序不工作? 从软件本身来看,代码似乎正在正常运行,并在main的结尾处输入while循环。 中断不会被接受,但我认为这是因为我没有正确的设置,所以我无法确认它们是否正确执行。  

    作为附带说明,我是最新的CCS安装和最新的编译器。 您的应用程序使用CCS6和较旧版本的编译器是否有原因?

    谢谢!

    Taumer

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Taumer,

    我已将孔项目移至CCS7,但我仍在犯同样的错误。 使用O2时,我仍然无法在上述行中设置断点,而且我可以清楚地看到,由于我无法调试任何中断服务例程,所以程序不工作。 也就是说,中断无法被识别,因为这些行:

    PieVectorTable.DINTCH1 =&LOCAL_D_INTCH1_ISR;

    PieVectorTable.DINTCH2 =&LOCALE_D_INTCH2_ISR;

    由于某种原因我不知道没有被执行。

    错误是否可能出现在某些属性设置中? 如果可以设置断点,我们可能会有一些不同的属性设置,允许您执行这些行。 我n´t不知道。

    谢谢!

    Ignacio

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Ignacio

    您是否仍在优化级别较低时出现相同的错误(o1,o0和off)?

    Taumer
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Taumer,

    我解决了问题。 现在,我可以在所有可用的优化级别运行应用程序。 除了将CCS更新到版本7之外,我还将最新的C2000ware设备支持文件链接到应用程序中。 我还链接了它们,而不是在将它们添加到项目时复制它们。 这也可能有所帮助。

    我希望这对其他人也有帮助。

    此致

    Ignacio