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.

McASP C6748 starterware example with EDMA3 won't build under TI RTOS

I took the example McASP application under starterware\examples\lcdkC6748\mcasp and put it into a CCS v6 project.  It built with no errors.  I then took the same project and plugged it into the basic RTOS project (created by CCS).  I created HWI's for the two ISRs, and I commented out the functions that manually define the interrupts.  I also moved the code from main() into the one task defined in the sample RTOS project.  No matter what I do, I keep getting unresolved symbol errors regarding my ISR functions.  Sometimes, it complains about one or the other ISR or sometimes both.  It also gives a few warnings, stating the ISR functions are declared but never referenced.  It also gives a warning: #10229-D output section ".fardata" refers to load symbol "McASPErrorIsr" and hence cannot be compressed; compression "rle" is ignored.


This is done using the C6748 starterware 1.20.4.1, targeting the LCDKC6748, RTOS 2.0.1.23.  There is also a checkbox for EDMA3 Low Level Driver 2.11.9.  I have tried building the project with teh EDMA3 Low Level Driver checked and not checked; it did not make a difference.  I have tried this on multiple machines.  On one other machine, the project built initially.  When I ran clean, it never built again.


I've attached a zip file with both sample projects (with and without RTOS).  I'm guessing I have a configuration problem of some kind (e.g. missing include path) but I cannot figure it out.

4263.edma3_example.zip

  • Has anyone had a chance to look at this?  I am dead in the water without being able to build a project with EDMA.

    Below is my code for reference, though it was previously included in the attached zip file.

    Thanks,

    Tobyn

    /*
     *  ======== main.c ========
     */
    
    #include <xdc/std.h>
    
    #include <xdc/runtime/Error.h>
    #include <xdc/runtime/System.h>
    
    #include <ti/sysbios/BIOS.h>
    
    #include <ti/sysbios/knl/Task.h>
    
    #include "edma_event.h"
    #include "interrupt.h"
    #include "soc_C6748.h"
    #include "hw_syscfg0_C6748.h"
    #include "lcdkC6748.h"
    #include "mcasp.h"
    #include "edma.h"
    #include "psc.h"
    #include "hw_edma3cc.h"
    #include "hw_mcasp.h"
    
    #include <string.h>
    
    
    /******************************************************************************
    **                      INTERNAL MACRO DEFINITIONS
    ******************************************************************************/
    /*
    ** Values which are configurable
    */
    /* Slot size to send/receive data */
    #define SLOT_SIZE                             (16u)
    
    /* Word size to send/receive data. Word size <= Slot size */
    #define WORD_SIZE                             (16u)
    
    /* Number of channels, L & R */
    #define NUM_I2S_CHANNELS                      (2u)
    
    /* Number of samples to be used per audio buffer */
    #define NUM_SAMPLES_PER_AUDIO_BUF             (2000u)
    
    /* Number of buffers used per tx/rx */
    #define NUM_BUF                               (3u)
    
    /* Number of linked parameter set used per tx/rx */
    #define NUM_PAR                               (2u)
    
    /* Specify where the parameter set starting is */
    #define PAR_ID_START                          (40u)
    
    /* Number of samples in loop buffer */
    #define NUM_SAMPLES_LOOP_BUF                  (10u)
    
    /* Interrupt channels to map in AINTC */
    #define INT_CHANNEL_I2C                       (2u)
    #define INT_CHANNEL_MCASP                     (2u)
    #define INT_CHANNEL_EDMACC                    (2u)
    
    /* McASP Serializer for Receive */
    #define MCASP_XSER_RX                         (14u)
    
    /* McASP Serializer for Transmit */
    #define MCASP_XSER_TX                         (13u)
    
    /*
    ** Below Macros are calculated based on the above inputs
    */
    #define NUM_TX_SERIALIZERS                    ((NUM_I2S_CHANNELS >> 1) \
                                                   + (NUM_I2S_CHANNELS & 0x01))
    #define NUM_RX_SERIALIZERS                    ((NUM_I2S_CHANNELS >> 1) \
                                                   + (NUM_I2S_CHANNELS & 0x01))
    #define I2S_SLOTS                             ((1 << NUM_I2S_CHANNELS) - 1)
    
    #define BYTES_PER_SAMPLE                      ((WORD_SIZE >> 3) \
                                                   * NUM_I2S_CHANNELS)
    
    #define AUDIO_BUF_SIZE                        (NUM_SAMPLES_PER_AUDIO_BUF \
                                                   * BYTES_PER_SAMPLE)
    
    #define TX_DMA_INT_ENABLE                     (EDMA3CC_OPT_TCC_SET(1) | (1 \
                                                   << EDMA3CC_OPT_TCINTEN_SHIFT))
    #define RX_DMA_INT_ENABLE                     (EDMA3CC_OPT_TCC_SET(0) | (1 \
                                                   << EDMA3CC_OPT_TCINTEN_SHIFT))
    
    #define PAR_RX_START                          (PAR_ID_START)
    #define PAR_TX_START                          (PAR_RX_START + NUM_PAR)
    
    /*
    ** Definitions which are not configurable
    */
    #define SIZE_PARAMSET                         (32u)
    #define OPT_FIFO_WIDTH                        (0x02 << 8u)
    
    /******************************************************************************
    **                      INTERNAL FUNCTION PROTOTYPES
    ******************************************************************************/
    static void McASPErrorIsr(void); // mcasp err interrupt isr
    static void McASPErrorIntSetup(void); //mcasp err interrupt setup
    static void McASPI2SConfigure(void); // mcasp I2S configuration
    static void McASPTxDMAComplHandler(void); // mcasp tx dma complete handler
    static void McASPRxDMAComplHandler(void); //mcasp rx dma complete handler
    static void EDMA3CCComplIsr(void); //edma complete isr
    static void I2SDataTxRxActivate(void); // I2S data tx rx activate
    static void I2SDMAParamInit(void); // I2S dma param initiate
    static void ParamTxLoopJobSet(unsigned short parId); // param tx loop
    static void BufferTxDMAActivate(unsigned int txBuf, unsigned short numSamples, // tx dma buffer activate
                                    unsigned short parToUpdate,
                                    unsigned short linkAddr);
    static void BufferRxDMAActivate(unsigned int rxBuf, unsigned short parId, // rx dma buffer activate
                                    unsigned short parLink);
    
    /******************************************************************************
    **                      INTERNAL VARIABLE DEFINITIONS
    ******************************************************************************/
    static unsigned char loopBuf[NUM_SAMPLES_LOOP_BUF * BYTES_PER_SAMPLE] = {0};
    
    /*
    ** Transmit buffers. If any new buffer is to be added, define it here and
    ** update the NUM_BUF.
    */
    static unsigned char txBuf0[AUDIO_BUF_SIZE];
    static unsigned char txBuf1[AUDIO_BUF_SIZE];
    static unsigned char txBuf2[AUDIO_BUF_SIZE];
    
    /*
    ** Receive buffers. If any new buffer is to be added, define it here and
    ** update the NUM_BUF.
    */
    static unsigned char rxBuf0[AUDIO_BUF_SIZE];
    static unsigned char rxBuf1[AUDIO_BUF_SIZE];
    static unsigned char rxBuf2[AUDIO_BUF_SIZE];
    
    /*
    ** Next buffer to receive data. The data will be received in this buffer.
    */
    static volatile unsigned int nxtBufToRcv = 0;
    
    /*
    ** The RX buffer which filled latest.
    */
    static volatile unsigned int lastFullRxBuf = 0;
    
    /*
    ** The offset of the paRAM ID, from the starting of the paRAM set.
    */
    static volatile unsigned short parOffRcvd = 0;
    
    /*
    ** The offset of the paRAM ID sent, from starting of the paRAM set.
    */
    static volatile unsigned short parOffSent = 0;
    
    /*
    ** The offset of the paRAM ID to be sent next, from starting of the paRAM set.
    */
    static volatile unsigned short parOffTxToSend = 0;
    
    /*
    ** The transmit buffer which was sent last.
    */
    static volatile unsigned int lastSentTxBuf = NUM_BUF - 1;
    
    /******************************************************************************
    **                      INTERNAL CONSTATNT DEFINITIONS
    ******************************************************************************/
    /* Array of receive buffer pointers */
    static unsigned int const rxBufPtr[NUM_BUF] =
           {
               (unsigned int) rxBuf0,
               (unsigned int) rxBuf1,
               (unsigned int) rxBuf2
           };
    
    /* Array of transmit buffer pointers */
    static unsigned int const txBufPtr[NUM_BUF] =
           {
               (unsigned int) txBuf0,
               (unsigned int) txBuf1,
               (unsigned int) txBuf2
           };
    
    /*
    ** Default paRAM for Transmit section. This will be transmitting from
    ** a loop buffer.
    */
    static struct EDMA3CCPaRAMEntry const txDefaultPar =
           {
               (unsigned int)(EDMA3CC_OPT_DAM  | (0x02 << 8u)), /* Opt field */
               (unsigned int)loopBuf, /* source address */
               (unsigned short)(BYTES_PER_SAMPLE), /* aCnt */
               (unsigned short)(NUM_SAMPLES_LOOP_BUF), /* bCnt */
               (unsigned int) SOC_MCASP_0_DATA_REGS, /* dest address */
               (short) (BYTES_PER_SAMPLE), /* source bIdx */
               (short)(0), /* dest bIdx */
               (unsigned short)(PAR_TX_START * SIZE_PARAMSET), /* link address */
               (unsigned short)(0), /* bCnt reload value */
               (short)(0), /* source cIdx */
               (short)(0), /* dest cIdx */
               (unsigned short)1 /* cCnt */
           };
    
    /*
    ** Default paRAM for Receive section.
    */
    static struct EDMA3CCPaRAMEntry const rxDefaultPar =
           {
               (unsigned int)(EDMA3CC_OPT_SAM  | (0x02 << 8u)), /* Opt field */
               (unsigned int)SOC_MCASP_0_DATA_REGS, /* source address */
               (unsigned short)(BYTES_PER_SAMPLE), /* aCnt */
               (unsigned short)(1), /* bCnt */
               (unsigned int)rxBuf0, /* dest address */
               (short) (0), /* source bIdx */
               (short)(BYTES_PER_SAMPLE), /* dest bIdx */
               (unsigned short)(PAR_RX_START * SIZE_PARAMSET), /* link address */
               (unsigned short)(0), /* bCnt reload value */
               (short)(0), /* source cIdx */
               (short)(0), /* dest cIdx */
               (unsigned short)1 /* cCnt */
           };
    
    
    
    /******************************************************************************
    **                          FUNCTION DEFINITIONS
    ******************************************************************************/
    /*
    ** Assigns loop job for a parameter set
    */
    static void ParamTxLoopJobSet(unsigned short parId)
    {
        EDMA3CCPaRAMEntry paramSet;
    
        memcpy(&paramSet, &txDefaultPar, SIZE_PARAMSET - 2);
    
        /* link the paRAM to itself */
        paramSet.linkAddr = parId * SIZE_PARAMSET;
    
        EDMA3SetPaRAM(SOC_EDMA30CC_0_REGS, parId, &paramSet);
    }
    
    
    static void I2SDMAParamInit(void)
    {
        EDMA3CCPaRAMEntry paramSet;
        int idx;
    
        /* Initialize the 0th paRAM set for receive */
        memcpy(&paramSet, &rxDefaultPar, SIZE_PARAMSET - 2);
    
        EDMA3SetPaRAM(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX, &paramSet);
    
        /* further paramsets, enable interrupt */
        paramSet.opt |= RX_DMA_INT_ENABLE;
    
        for(idx = 0 ; idx < NUM_PAR; idx++)
        {
            paramSet.destAddr = rxBufPtr[idx];
    
            paramSet.linkAddr = (PAR_RX_START + ((idx + 1) % NUM_PAR))
                                 * (SIZE_PARAMSET);
    
            paramSet.bCnt =  NUM_SAMPLES_PER_AUDIO_BUF;
    
            /*
            ** for the first linked paRAM set, start receiving the second
            ** sample only since the first sample is already received in
            ** rx buffer 0 itself.
            */
            if( 0 == idx)
            {
                paramSet.destAddr += BYTES_PER_SAMPLE;
                paramSet.bCnt -= BYTES_PER_SAMPLE;
            }
    
            EDMA3SetPaRAM(SOC_EDMA30CC_0_REGS, (PAR_RX_START + idx), &paramSet);
        }
    
        /* Initialize the required variables for reception */
        nxtBufToRcv = idx % NUM_BUF;
        lastFullRxBuf = NUM_BUF - 1;
        parOffRcvd = 0;
    
        /* Initialize the 1st paRAM set for transmit */
        memcpy(&paramSet, &txDefaultPar, SIZE_PARAMSET);
    
        EDMA3SetPaRAM(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_TX, &paramSet);
    
        /* rest of the params, enable loop job */
        for(idx = 0 ; idx < NUM_PAR; idx++)
        {
            ParamTxLoopJobSet(PAR_TX_START + idx);
        }
    
        /* Initialize the variables for transmit */
        parOffSent = 0;
        lastSentTxBuf = NUM_BUF - 1;
    }
    
    /*
    ** Configures the McASP Transmit Section in I2S mode.
    */
    static void McASPI2SConfigure(void)
    {
        McASPRxReset(SOC_MCASP_0_CTRL_REGS);
        McASPTxReset(SOC_MCASP_0_CTRL_REGS);
    
        /* Enable the FIFOs for DMA transfer */
        McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
        McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
    
        /* Set I2S format in the transmitter/receiver format units */
        McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
                         MCASP_RX_MODE_DMA);
        McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
                         MCASP_TX_MODE_DMA);
    
        /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
        McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
                            MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
        McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
                            MCASP_TX_FS_EXT_BEGIN_ON_RIS_EDGE);
    
        /* configure the clock for receiver */
        McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
        McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
        McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
                              0x00, 0xFF);
    
        /* configure the clock for transmitter */
        McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_EXTERNAL, 0, 0);
        McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
        McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
                              0x00, 0xFF);
    
        /* Enable synchronization of RX and TX sections  */
        McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
    
        /* Enable the transmitter/receiver slots. I2S uses 2 slots */
        McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
        McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
    
        /*
        ** Set the serializers, Currently only one serializer is set as
        ** transmitter and one serializer as receiver.
        */
        McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
        McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
    
        /*
        ** Configure the McASP pins
        ** Input - Frame Sync, Clock and Serializer Rx
        ** Output - Serializer Tx is connected to the input of the codec
        */
        McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
        McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AXR(MCASP_XSER_TX));
        McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
                                                   | MCASP_PIN_ACLKX
                                                   | MCASP_PIN_AFSR
                                                   | MCASP_PIN_ACLKR
                                                   | MCASP_PIN_AXR(MCASP_XSER_RX));
    
        /* Enable error interrupts for McASP */
        McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
                                                | MCASP_TX_CLKFAIL
                                                | MCASP_TX_SYNCERROR
                                                | MCASP_TX_UNDERRUN);
    
        McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
                                                | MCASP_RX_CLKFAIL
                                                | MCASP_RX_SYNCERROR
                                                | MCASP_RX_OVERRUN);
    }
    
    
    /*
    ** Activates the data transmission/reception
    ** The DMA parameters shall be ready before calling this function.
    */
    static void I2SDataTxRxActivate(void)
    {
        /* Start the clocks */
        McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
        McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_EXTERNAL);
    
        /* Enable EDMA for the transfer */
        EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
                            EDMA3_TRIG_MODE_EVENT);
        EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
                            EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
    
        /* Activate the  serializers */
        McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
        McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
    
        /* make sure that the XDATA bit is cleared to zero */
        while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
    
        /* Activate the state machines */
        McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
        McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
    }
    
    /*
    ** Activates the DMA transfer for a parameterset from the given buffer.
    */
    void BufferTxDMAActivate(unsigned int txBuf, unsigned short numSamples,
                             unsigned short parId, unsigned short linkPar)
    {
        EDMA3CCPaRAMEntry paramSet;
    
        /* Copy the default paramset */
        memcpy(&paramSet, &txDefaultPar, SIZE_PARAMSET - 2);
    
        /* Enable completion interrupt */
        paramSet.opt |= TX_DMA_INT_ENABLE;
        paramSet.srcAddr =  txBufPtr[txBuf];
        paramSet.linkAddr = linkPar * SIZE_PARAMSET;
        paramSet.bCnt = numSamples;
    
        EDMA3SetPaRAM(SOC_EDMA30CC_0_REGS, parId, &paramSet);
    }
    
    
    
    /*
     *  ======== taskFxn ========
     */
    Void taskFxn(UArg a0, UArg a1)
    {
    	   unsigned short parToSend;
    	    unsigned short parToLink;
    
    	    /* Set up pin mux for I2C module 0 */
    	    I2CPinMuxSetup(0);
    	    McASPPinMuxSetup();
    
    	    /* Power up the McASP module */
    	    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_MCASP0, PSC_POWERDOMAIN_ALWAYS_ON,
    			     PSC_MDCTL_NEXT_ENABLE);
    
    	    /* Power up EDMA3CC_0 and EDMA3TC_0 */
    	    PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_CC0, PSC_POWERDOMAIN_ALWAYS_ON,
    			     PSC_MDCTL_NEXT_ENABLE);
    	    PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_TC0, PSC_POWERDOMAIN_ALWAYS_ON,
    			     PSC_MDCTL_NEXT_ENABLE);
    
    	#ifdef _TMS320C6X
    	    // Initialize the DSP interrupt controller
    //	    IntDSPINTCInit();
    	#endif
    
    	    EDMA3Init(SOC_EDMA30CC_0_REGS, 0);
    //	    EDMA3IntSetup();
    
    //	    McASPErrorIntSetup();
    
    	#ifdef _TMS320C6X
    //	    IntGlobalEnable();
    	#endif
    
    	    /*
    	    ** Request EDMA channels. Channel 0 is used for reception and
    	    ** Channel 1 is used for transmission
    	    */
    	    EDMA3RequestChannel(SOC_EDMA30CC_0_REGS, EDMA3_CHANNEL_TYPE_DMA,
    	                        EDMA3_CHA_MCASP0_TX, EDMA3_CHA_MCASP0_TX, 0);
    	    EDMA3RequestChannel(SOC_EDMA30CC_0_REGS, EDMA3_CHANNEL_TYPE_DMA,
    	                        EDMA3_CHA_MCASP0_RX, EDMA3_CHA_MCASP0_RX, 0);
    
    	    /* Initialize the DMA parameters */
    	    I2SDMAParamInit();
    
    	    /* Configure the McASP for I2S */
    	    McASPI2SConfigure();
    
    	    /* Activate the audio transmission and reception */
    	    I2SDataTxRxActivate();
    
    	    /*
    	    ** Loop forever. if a new buffer is received, the lastFullRxBuf will be
    	    ** updated in the rx completion ISR. if it is not the lastSentTxBuf,
    	    ** buffer is to be sent. This has to be mapped to proper paRAM set.
    	    */
    	    while(1)
    	    {
    	        if(lastFullRxBuf != lastSentTxBuf)
    	        {
    	            /*
    	            ** Start the transmission from the link paramset. The param set
    	            ** 1 will be linked to param set at PAR_TX_START. So do not
    	            ** update paRAM set1.
    	            */
    	            parToSend =  PAR_TX_START + (parOffTxToSend % NUM_PAR);
    	            parOffTxToSend = (parOffTxToSend + 1) % NUM_PAR;
    	            parToLink  = PAR_TX_START + parOffTxToSend;
    
    	            lastSentTxBuf = (lastSentTxBuf + 1) % NUM_BUF;
    
    	            /* Copy the buffer */
    	            memcpy((void *)txBufPtr[lastSentTxBuf],
    	                   (void *)rxBufPtr[lastFullRxBuf],
    	                   AUDIO_BUF_SIZE);
    
    	            /*
    	            ** Send the buffer by setting the DMA params accordingly.
    	            ** Here the buffer to send and number of samples are passed as
    	            ** parameters. This is important, if only transmit section
    	            ** is to be used.
    	            */
    	            BufferTxDMAActivate(lastSentTxBuf, NUM_SAMPLES_PER_AUDIO_BUF,
    	                                (unsigned short)parToSend,
    	                                (unsigned short)parToLink);
    	        }
    	    }
    
    
    
    }
    
    
    /*
     *  ======== main ========
     */
    Int main()
    { 
        Task_Handle task;
        Error_Block eb;
    
        System_printf("enter main()\n");
    
        Error_init(&eb);
        task = Task_create(taskFxn, NULL, &eb);
        if (task == NULL) {
            System_printf("Task_create() failed!\n");
            BIOS_exit(0);
        }
    
        BIOS_start();    /* does not return */
        return(0);
    }
    
    
    
    /*
    ** Activates the DMA transfer for a parameter set from the given buffer.
    */
    static void BufferRxDMAActivate(unsigned int rxBuf, unsigned short parId,
                                    unsigned short parLink)
    {
        EDMA3CCPaRAMEntry paramSet;
    
        /* Copy the default paramset */
        memcpy(&paramSet, &rxDefaultPar, SIZE_PARAMSET - 2);
    
        /* Enable completion interrupt */
        paramSet.opt |= RX_DMA_INT_ENABLE;
        paramSet.destAddr =  rxBufPtr[rxBuf];
        paramSet.bCnt =  NUM_SAMPLES_PER_AUDIO_BUF;
        paramSet.linkAddr = parLink * SIZE_PARAMSET ;
    
        EDMA3SetPaRAM(SOC_EDMA30CC_0_REGS, parId, &paramSet);
    }
    
    /*
    ** This function will be called once receive DMA is completed
    */
    static void McASPRxDMAComplHandler(void)
    {
        unsigned short nxtParToUpdate;
    
        /*
        ** Update lastFullRxBuf to indicate a new buffer reception
        ** is completed.
        */
        lastFullRxBuf = (lastFullRxBuf + 1) % NUM_BUF;
        nxtParToUpdate =  PAR_RX_START + parOffRcvd;
        parOffRcvd = (parOffRcvd + 1) % NUM_PAR;
    
        /*
        ** Update the DMA parameters for the received buffer to receive
        ** further data in proper buffer
        */
        BufferRxDMAActivate(nxtBufToRcv, nxtParToUpdate,
                            PAR_RX_START + parOffRcvd);
    
        /* update the next buffer to receive data */
        nxtBufToRcv = (nxtBufToRcv + 1) % NUM_BUF;
    }
    
    /*
    ** This function will be called once transmit DMA is completed
    */
    static void McASPTxDMAComplHandler(void)
    {
        ParamTxLoopJobSet((unsigned short)(PAR_TX_START + parOffSent));
    
        parOffSent = (parOffSent + 1) % NUM_PAR;
    }
    
    /*
    ** EDMA transfer completion ISR
    */
    static void EDMA3CCComplIsr(void)
    {
    #ifdef _TMS320C6X
    	IntEventClear(SYS_INT_EDMA3_0_CC0_INT1);
    #endif
    
        /* Check if receive DMA completed */
        if(EDMA3GetIntrStatus(SOC_EDMA30CC_0_REGS) & (1 << EDMA3_CHA_MCASP0_RX))
        {
            /* Clear the interrupt status for the 0th channel */
            EDMA3ClrIntr(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX);
            McASPRxDMAComplHandler();
        }
    
        /* Check if transmit DMA completed */
        if(EDMA3GetIntrStatus(SOC_EDMA30CC_0_REGS) & (1 << EDMA3_CHA_MCASP0_TX))
        {
            /* Clear the interrupt status for the first channel */
            EDMA3ClrIntr(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_TX);
            McASPTxDMAComplHandler();
        }
    }
    
    /*
    ** Error ISR for McASP
    */
    static void McASPErrorIsr(void)
    {
    #ifdef _TMS320C6X
    	IntEventClear(SYS_INT_MCASP0_INT);
    #endif
    
        ;
    }
    

  • I figured it out.  Apparently, the linker doesn't like static functions when used with the RTOS.  If I remove the keyword "static" from lines 101, 106, 607, and 637, it builds.

    Thanks,
    Tobyn

  • Glad to see this was resolved.