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.

Error unresolved symbols remain.

Other Parts Discussed in Thread: LM3S8962, CONTROLSUITE, TMS320C5505

Hi,

I've been getting this error message and haven't been able to figure it out:

Symbol                   First referenced in file

CPUcpsid               ./src/interrupt.obj
CPUcpsie               ./src/interrupt.obj
CPUwfi                   ./src/sysctl.obj
SysCtlDelay           ./src/sysctl.obj

I'm assuming that I'm missing a library or include file, but I'm not sure which one.

Thanks,

-Dru Steeby
 

  • Hi Dru,

    Have a look at the wiki link below.  This should show you where the include options/paths and variables are located.   See where those functions/objects get defined ... this will point you to the library/file that CCS can't find.

    http://processors.wiki.ti.com/index.php/Include_paths_and_options

    Best Regards,
    Lisa

  • I have the variables defined in other files in the project, I'll list them below:

    in a file called "cpu.h" I have:

    extern unsigned long CPUcpsid(void);
    extern unsigned long CPUcpsie(void);
    extern void CPUwfi(void);

    interrupt.c has a #include "cpu.h" 

    In "sysctl.h" I have:

    extern void SysCtlDelay(unsigned long ulCount);

    sysctl.c has a #include "sysctl.h"

    These files are all part of a TI library for the LM3S8962 chip.

    Symbol                   First referenced in file

    CPUcpsid               ./src/interrupt.obj
    CPUcpsie               ./src/interrupt.obj
    CPUwfi                   ./src/sysctl.obj
    SysCtlDelay           ./src/sysctl.obj

  • Hi Dru,

    ok, have a look at the library section of that wiki and double check things ...

    Best Regards,
    Lisa

  • I know how to add the libraries, below is a screenshot of my properties. My problem is that I don't know what library I should be adding for these tools or if that's even the problem.

  • Hi Dru,

    I believe you have a syntax problem in the lines you added .....  what exactly are you trying to do/how are your variables defined?  I think you are not nesting your variables correctly for example ...

    Best Regards,
    LIsa

  • I didn't add any lines of code to those files, all of those files are pre written TI code. I am attaching the files in question. 

    2577.can.c
    7484.can.h

    //*****************************************************************************
    //
    // interrupt.c - Driver for the NVIC Interrupt Controller.
    //
    // Copyright (c) 2005-2009 Luminary Micro, Inc.  All rights reserved.
    // Software License Agreement
    // 
    // Luminary Micro, Inc. (LMI) is supplying this software for use solely and
    // exclusively on LMI's microcontroller products.
    //
    // The software is owned by LMI and/or its suppliers, and is protected under
    // applicable copyright laws.  All rights are reserved.  You may not combine
    // this software with "viral" open-source software in order to form a larger
    // program.  Any use in violation of the foregoing restrictions may subject
    // the user to criminal sanctions under applicable laws, as well as to civil
    // liability for the breach of the terms and conditions of this license.
    // 
    // THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED
    // OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
    // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
    // LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
    // CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
    // 
    // This is part of revision 4781 of the Stellaris Peripheral Driver Library.
    //
    //*****************************************************************************
    
    //*****************************************************************************
    //
    //! \addtogroup interrupt_api
    //! @{
    //
    //*****************************************************************************
    
    #include "hw_ints.h"
    #include "hw_nvic.h"
    #include "hw_types.h"
    #include "cpu.h"
    #include "debug.h"
    #include "interrupt.h"
    
    //*****************************************************************************
    //
    // This is a mapping between priority grouping encodings and the number of
    // preemption priority bits.
    //
    //*****************************************************************************
    static const unsigned long g_pulPriority[] =
    {
        NVIC_APINT_PRIGROUP_0_8, NVIC_APINT_PRIGROUP_1_7, NVIC_APINT_PRIGROUP_2_6,
        NVIC_APINT_PRIGROUP_3_5, NVIC_APINT_PRIGROUP_4_4, NVIC_APINT_PRIGROUP_5_3,
        NVIC_APINT_PRIGROUP_6_2, NVIC_APINT_PRIGROUP_7_1
    };
    
    //*****************************************************************************
    //
    // This is a mapping between interrupt number and the register that contains
    // the priority encoding for that interrupt.
    //
    //*****************************************************************************
    static const unsigned long g_pulRegs[] =
    {
        0, NVIC_SYS_PRI1, NVIC_SYS_PRI2, NVIC_SYS_PRI3, NVIC_PRI0, NVIC_PRI1,
        NVIC_PRI2, NVIC_PRI3, NVIC_PRI4, NVIC_PRI5, NVIC_PRI6, NVIC_PRI7,
        NVIC_PRI8, NVIC_PRI9, NVIC_PRI10, NVIC_PRI11, NVIC_PRI12, NVIC_PRI13
    };
    
    //*****************************************************************************
    //
    //! \internal
    //! The default interrupt handler.
    //!
    //! This is the default interrupt handler for all interrupts.  It simply loops
    //! forever so that the system state is preserved for observation by a
    //! debugger.  Since interrupts should be disabled before unregistering the
    //! corresponding handler, this should never be called.
    //!
    //! \return None.
    //
    //*****************************************************************************
    static void
    IntDefaultHandler(void)
    {
        //
        // Go into an infinite loop.
        //
        while(1)
        {
        }
    }
    
    //*****************************************************************************
    //
    // The processor vector table.
    //
    // This contains a list of the handlers for the various interrupt sources in
    // the system.  The layout of this list is defined by the hardware; assertion
    // of an interrupt causes the processor to start executing directly at the
    // address given in the corresponding location in this list.
    //
    //*****************************************************************************
    #if defined(ewarm)
    static __no_init void (*g_pfnRAMVectors[NUM_INTERRUPTS])(void) @ "VTABLE";
    #elif defined(sourcerygxx)
    static __attribute__((section(".cs3.region-head.ram")))
    void (*g_pfnRAMVectors[NUM_INTERRUPTS])(void);
    #else
    static __attribute__((section("vtable")))
    void (*g_pfnRAMVectors[NUM_INTERRUPTS])(void);
    #endif
    
    //*****************************************************************************
    //
    //! Enables the processor interrupt.
    //!
    //! Allows the processor to respond to interrupts.  This does not affect the
    //! set of interrupts enabled in the interrupt controller; it just gates the
    //! single interrupt from the controller to the processor.
    //!
    //! \note Previously, this function had no return value.  As such, it was
    //! possible to include <tt>interrupt.h</tt> and call this function without
    //! having included <tt>hw_types.h</tt>.  Now that the return is a
    //! <tt>tBoolean</tt>, a compiler error will occur in this case.  The solution
    //! is to include <tt>hw_types.h</tt> before including <tt>interrupt.h</tt>.
    //!
    //! \return Returns \b true if interrupts were disabled when the function was
    //! called or \b false if they were initially enabled.
    //
    //*****************************************************************************
    tBoolean
    IntMasterEnable(void)
    {
        //
        // Enable processor interrupts.
        //
        return(CPUcpsie());
    }
    
    //*****************************************************************************
    //
    //! Disables the processor interrupt.
    //!
    //! Prevents the processor from receiving interrupts.  This does not affect the
    //! set of interrupts enabled in the interrupt controller; it just gates the
    //! single interrupt from the controller to the processor.
    //!
    //! \note Previously, this function had no return value.  As such, it was
    //! possible to include <tt>interrupt.h</tt> and call this function without
    //! having included <tt>hw_types.h</tt>.  Now that the return is a
    //! <tt>tBoolean</tt>, a compiler error will occur in this case.  The solution
    //! is to include <tt>hw_types.h</tt> before including <tt>interrupt.h</tt>.
    //!
    //! \return Returns \b true if interrupts were already disabled when the
    //! function was called or \b false if they were initially enabled.
    //
    //*****************************************************************************
    tBoolean
    IntMasterDisable(void)
    {
        //
        // Disable processor interrupts.
        //
        return(CPUcpsid());
    }
    
    //*****************************************************************************
    //
    //! Registers a function to be called when an interrupt occurs.
    //!
    //! \param ulInterrupt specifies the interrupt in question.
    //! \param pfnHandler is a pointer to the function to be called.
    //!
    //! This function is used to specify the handler function to be called when the
    //! given interrupt is asserted to the processor.  When the interrupt occurs,
    //! if it is enabled (via IntEnable()), the handler function will be called in
    //! interrupt context.  Since the handler function can preempt other code, care
    //! must be taken to protect memory or peripherals that are accessed by the
    //! handler and other non-handler code.
    //!
    //! \note The use of this function (directly or indirectly via a peripheral
    //! driver interrupt register function) moves the interrupt vector table from
    //! flash to SRAM.  Therefore, care must be taken when linking the application
    //! to ensure that the SRAM vector table is located at the beginning of SRAM;
    //! otherwise NVIC will not look in the correct portion of memory for the
    //! vector table (it requires the vector table be on a 1 kB memory alignment).
    //! Normally, the SRAM vector table is so placed via the use of linker scripts;
    //! some tool chains, such as the evaluation version of RV-MDK, do not support
    //! linker scripts and therefore will not produce a valid executable.  See the
    //! discussion of compile-time versus run-time interrupt handler registration
    //! in the introduction to this chapter.
    //!
    //! \return None.
    //
    //*****************************************************************************
    void
    IntRegister(unsigned long ulInterrupt, void (*pfnHandler)(void))
    {
        unsigned long ulIdx, ulValue;
    
        //
        // Check the arguments.
        //
        ASSERT(ulInterrupt < NUM_INTERRUPTS);
    
        //
        // Make sure that the RAM vector table is correctly aligned.
        //
        ASSERT(((unsigned long)g_pfnRAMVectors & 0x000003ff) == 0);
    
        //
        // See if the RAM vector table has been initialized.
        //
        if(HWREG(NVIC_VTABLE) != (unsigned long)g_pfnRAMVectors)
        {
            //
            // Copy the vector table from the beginning of FLASH to the RAM vector
            // table.
            //
            ulValue = HWREG(NVIC_VTABLE);
            for(ulIdx = 0; ulIdx < NUM_INTERRUPTS; ulIdx++)
            {
                g_pfnRAMVectors[ulIdx] = (void (*)(void))HWREG((ulIdx * 4) +
                                                         ulValue);
            }
    
            //
            // Point NVIC at the RAM vector table.
            //
            HWREG(NVIC_VTABLE) = (unsigned long)g_pfnRAMVectors;
        }
    
        //
        // Save the interrupt handler.
        //
        g_pfnRAMVectors[ulInterrupt] = pfnHandler;
    }
    
    //*****************************************************************************
    //
    //! Unregisters the function to be called when an interrupt occurs.
    //!
    //! \param ulInterrupt specifies the interrupt in question.
    //!
    //! This function is used to indicate that no handler should be called when the
    //! given interrupt is asserted to the processor.  The interrupt source will be
    //! automatically disabled (via IntDisable()) if necessary.
    //!
    //! \sa IntRegister() for important information about registering interrupt
    //! handlers.
    //!
    //! \return None.
    //
    //*****************************************************************************
    void
    IntUnregister(unsigned long ulInterrupt)
    {
        //
        // Check the arguments.
        //
        ASSERT(ulInterrupt < NUM_INTERRUPTS);
    
        //
        // Reset the interrupt handler.
        //
        g_pfnRAMVectors[ulInterrupt] = IntDefaultHandler;
    }
    
    //*****************************************************************************
    //
    //! Sets the priority grouping of the interrupt controller.
    //!
    //! \param ulBits specifies the number of bits of preemptable priority.
    //!
    //! This function specifies the split between preemptable priority levels and
    //! subpriority levels in the interrupt priority specification.  The range of
    //! the grouping values are dependent upon the hardware implementation; on
    //! the Stellaris family, three bits are available for hardware interrupt
    //! prioritization and therefore priority grouping values of three through
    //! seven have the same effect.
    //!
    //! \return None.
    //
    //*****************************************************************************
    void
    IntPriorityGroupingSet(unsigned long ulBits)
    {
        //
        // Check the arguments.
        //
        ASSERT(ulBits < NUM_PRIORITY);
    
        //
        // Set the priority grouping.
        //
        HWREG(NVIC_APINT) = NVIC_APINT_VECTKEY | g_pulPriority[ulBits];
    }
    
    //*****************************************************************************
    //
    //! Gets the priority grouping of the interrupt controller.
    //!
    //! This function returns the split between preemptable priority levels and
    //! subpriority levels in the interrupt priority specification.
    //!
    //! \return The number of bits of preemptable priority.
    //
    //*****************************************************************************
    unsigned long
    IntPriorityGroupingGet(void)
    {
        unsigned long ulLoop, ulValue;
    
        //
        // Read the priority grouping.
        //
        ulValue = HWREG(NVIC_APINT) & NVIC_APINT_PRIGROUP_M;
    
        //
        // Loop through the priority grouping values.
        //
        for(ulLoop = 0; ulLoop < NUM_PRIORITY; ulLoop++)
        {
            //
            // Stop looping if this value matches.
            //
            if(ulValue == g_pulPriority[ulLoop])
            {
                break;
            }
        }
    
        //
        // Return the number of priority bits.
        //
        return(ulLoop);
    }
    
    //*****************************************************************************
    //
    //! Sets the priority of an interrupt.
    //!
    //! \param ulInterrupt specifies the interrupt in question.
    //! \param ucPriority specifies the priority of the interrupt.
    //!
    //! This function is used to set the priority of an interrupt.  When multiple
    //! interrupts are asserted simultaneously, the ones with the highest priority
    //! are processed before the lower priority interrupts.  Smaller numbers
    //! correspond to higher interrupt priorities; priority 0 is the highest
    //! interrupt priority.
    //!
    //! The hardware priority mechanism will only look at the upper N bits of the
    //! priority level (where N is 3 for the Stellaris family), so any
    //! prioritization must be performed in those bits.  The remaining bits can be
    //! used to sub-prioritize the interrupt sources, and may be used by the
    //! hardware priority mechanism on a future part.  This arrangement allows
    //! priorities to migrate to different NVIC implementations without changing
    //! the gross prioritization of the interrupts.
    //!
    //! \return None.
    //
    //*****************************************************************************
    void
    IntPrioritySet(unsigned long ulInterrupt, unsigned char ucPriority)
    {
        unsigned long ulTemp;
    
        //
        // Check the arguments.
        //
        ASSERT((ulInterrupt >= 4) && (ulInterrupt < NUM_INTERRUPTS));
    
        //
        // Set the interrupt priority.
        //
        ulTemp = HWREG(g_pulRegs[ulInterrupt >> 2]);
        ulTemp &= ~(0xFF << (8 * (ulInterrupt & 3)));
        ulTemp |= ucPriority << (8 * (ulInterrupt & 3));
        HWREG(g_pulRegs[ulInterrupt >> 2]) = ulTemp;
    }
    
    //*****************************************************************************
    //
    //! Gets the priority of an interrupt.
    //!
    //! \param ulInterrupt specifies the interrupt in question.
    //!
    //! This function gets the priority of an interrupt.  See IntPrioritySet() for
    //! a definition of the priority value.
    //!
    //! \return Returns the interrupt priority, or -1 if an invalid interrupt was
    //! specified.
    //
    //*****************************************************************************
    long
    IntPriorityGet(unsigned long ulInterrupt)
    {
        //
        // Check the arguments.
        //
        ASSERT((ulInterrupt >= 4) && (ulInterrupt < NUM_INTERRUPTS));
    
        //
        // Return the interrupt priority.
        //
        return((HWREG(g_pulRegs[ulInterrupt >> 2]) >> (8 * (ulInterrupt & 3))) &
               0xFF);
    }
    
    //*****************************************************************************
    //
    //! Enables an interrupt.
    //!
    //! \param ulInterrupt specifies the interrupt to be enabled.
    //!
    //! The specified interrupt is enabled in the interrupt controller.  Other
    //! enables for the interrupt (such as at the peripheral level) are unaffected
    //! by this function.
    //!
    //! \return None.
    //
    //*****************************************************************************
    void
    IntEnable(unsigned long ulInterrupt)
    {
        //
        // Check the arguments.
        //
        ASSERT(ulInterrupt < NUM_INTERRUPTS);
    
        //
        // Determine the interrupt to enable.
        //
        if(ulInterrupt == FAULT_MPU)
        {
            //
            // Enable the MemManage interrupt.
            //
            HWREG(NVIC_SYS_HND_CTRL) |= NVIC_SYS_HND_CTRL_MEM;
        }
        else if(ulInterrupt == FAULT_BUS)
        {
            //
            // Enable the bus fault interrupt.
            //
            HWREG(NVIC_SYS_HND_CTRL) |= NVIC_SYS_HND_CTRL_BUS;
        }
        else if(ulInterrupt == FAULT_USAGE)
        {
            //
            // Enable the usage fault interrupt.
            //
            HWREG(NVIC_SYS_HND_CTRL) |= NVIC_SYS_HND_CTRL_USAGE;
        }
        else if(ulInterrupt == FAULT_SYSTICK)
        {
            //
            // Enable the System Tick interrupt.
            //
            HWREG(NVIC_ST_CTRL) |= NVIC_ST_CTRL_INTEN;
        }
        else if((ulInterrupt >= 16) && (ulInterrupt <= 47))
        {
            //
            // Enable the general interrupt.
            //
            HWREG(NVIC_EN0) = 1 << (ulInterrupt - 16);
        }
        else if(ulInterrupt >= 48)
        {
            //
            // Enable the general interrupt.
            //
            HWREG(NVIC_EN1) = 1 << (ulInterrupt - 48);
        }
    }
    
    //*****************************************************************************
    //
    //! Disables an interrupt.
    //!
    //! \param ulInterrupt specifies the interrupt to be disabled.
    //!
    //! The specified interrupt is disabled in the interrupt controller.  Other
    //! enables for the interrupt (such as at the peripheral level) are unaffected
    //! by this function.
    //!
    //! \return None.
    //
    //*****************************************************************************
    void
    IntDisable(unsigned long ulInterrupt)
    {
        //
        // Check the arguments.
        //
        ASSERT(ulInterrupt < NUM_INTERRUPTS);
    
        //
        // Determine the interrupt to disable.
        //
        if(ulInterrupt == FAULT_MPU)
        {
            //
            // Disable the MemManage interrupt.
            //
            HWREG(NVIC_SYS_HND_CTRL) &= ~(NVIC_SYS_HND_CTRL_MEM);
        }
        else if(ulInterrupt == FAULT_BUS)
        {
            //
            // Disable the bus fault interrupt.
            //
            HWREG(NVIC_SYS_HND_CTRL) &= ~(NVIC_SYS_HND_CTRL_BUS);
        }
        else if(ulInterrupt == FAULT_USAGE)
        {
            //
            // Disable the usage fault interrupt.
            //
            HWREG(NVIC_SYS_HND_CTRL) &= ~(NVIC_SYS_HND_CTRL_USAGE);
        }
        else if(ulInterrupt == FAULT_SYSTICK)
        {
            //
            // Disable the System Tick interrupt.
            //
            HWREG(NVIC_ST_CTRL) &= ~(NVIC_ST_CTRL_INTEN);
        }
        else if((ulInterrupt >= 16) && (ulInterrupt <= 47))
        {
            //
            // Disable the general interrupt.
            //
            HWREG(NVIC_DIS0) = 1 << (ulInterrupt - 16);
        }
        else if(ulInterrupt >= 48)
        {
            //
            // Disable the general interrupt.
            //
            HWREG(NVIC_DIS1) = 1 << (ulInterrupt - 48);
        }
    }
    
    //*****************************************************************************
    //
    // Close the Doxygen group.
    //! @}
    //
    //*****************************************************************************
    

    5483.interrupt.h
    4774.sysctl.c

  • Hi Dru,

    I mean the line you seem to have added to the library search path for example ....

    Best Regards,

    Lisa

  • That library is in my workspace, so when I selected it to add from my workspace that is the automatic syntax that came up. Is it incorrect?

  • Dru Steeby said:

    Symbol                   First referenced in file

    CPUcpsid               ./src/interrupt.obj
    CPUcpsie               ./src/interrupt.obj
    CPUwfi                   ./src/sysctl.obj
    SysCtlDelay           ./src/sysctl.obj

    Basically the error is saying that the linker cannot find definitions for those symbols. Looking at the Stellarisware package, the first 3 symbols are defined in cpu.c and the last one is in sysctl.c (found in C:\StellarisWare\driverlib). These are part of the driverlib and typically users simply link in driverlib to their project to resolve these references. It looks like you are instead adding those source files directly to your project. That should be ok as well but either the files have been modified or do not have those function definitions for some reason.

    So if you're adding these files directly to your project I suggest checking the .c files to make sure there are definitions for all those symbols. Or you could simply remove those files and instead link in the driverlib by adding it to the Linker File Search Path (--library option).

    If these suggestions do not get you going, please copy and paste the output of your CCS build console here (both compiler and linker steps), so we can see the exact source files and libraries in your project.

  • So this is another project that I'm working on, but I'm having the same problem. Here is the output of the build console:

     

    **** Build of configuration Debug for project EDM_28335_Flash1 ****

    C:\ti\ccsv5\utils\bin\gmake -k all

    'Building target: EDM_28335_Flash1.out'

    'Invoking: C2000 Linker'

    "C:/ti/ccsv5/tools/compiler/c2000_6.1.0/bin/cl2000" -v28 -ml -mt --float_support=fpu32 -g --diag_warning=225 --display_error_number --diag_wrap=off -z --stack_size=0x380 -m"EDM_28335_Flash1.map" --warn_sections -i"C:/ti/ccsv5/tools/compiler/c2000_6.1.0/lib" -i"C:/Users/Brian/Desktop/QCTest2/EDM_28335_Flash1" -i"C:/ti/ccsv5/tools/compiler/c2000_6.1.0/include" -i"C:/ti/bios_5_41_13_42/packages/ti/rtdx/lib/c2000" -i"C:/ti/bios_5_41_13_42/packages/ti/bios/lib" -i"" -i"" -i"/include" --reread_libs --display_error_number --diag_wrap=off --rom_model -o "EDM_28335_Flash1.out"  "./include/DSP2833x_GlobalVariableDefs.obj" "./include/DSP2833x_ECan.obj" "./XGen_WIZnet.obj" "./TestCmnds.obj" "./Global.obj" "./EDM_2833xFlash.obj" "./CAN_SCI.obj" -l"libc.a" -l"rts2800_fpu32.lib" "../include/IQmath_fpu32.lib" "../include/rts2800_mlxx.lib"

    <Linking>

    warning #10247-D: creating output section ".ebss" without a SECTIONS specification

    warning #10247-D: creating output section ".econst" without a SECTIONS specification

    warning #10247-D: creating output section ".reset" without a SECTIONS specification

    warning #10247-D: creating output section "AdcMirrorFile" without a SECTIONS specification

    warning #10247-D: creating output section "AdcRegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "Arc_Net_File" without a SECTIONS specification

    warning #10247-D: creating output section "Axis_PLD_File" without a SECTIONS specification

    warning #10247-D: creating output section "CpuTimer0RegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "CpuTimer1RegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "CpuTimer2RegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "CsmPwlFile" without a SECTIONS specification

    warning #10247-D: creating output section "CsmRegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "DevEmuRegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "DmaRegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "ECanaLAMRegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "ECanaMOTORegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "ECanaMOTSRegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "ECanaMboxesFile" without a SECTIONS specification

    warning #10247-D: creating output section "ECanaRegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "ECanbLAMRegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "ECanbMOTORegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "ECanbMOTSRegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "ECanbMboxesFile" without a SECTIONS specification

    warning #10247-D: creating output section "ECanbRegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "ECap1RegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "ECap2RegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "ECap3RegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "ECap4RegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "ECap5RegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "ECap6RegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "EPwm1RegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "EPwm2RegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "EPwm3RegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "EPwm4RegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "EPwm5RegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "EPwm6RegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "EQep1RegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "EQep2RegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "EtherCat_File" without a SECTIONS specification

    warning #10247-D: creating output section "FlashRegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "GpioCtrlRegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "GpioDataRegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "GpioIntRegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "I2caRegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "McbspaRegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "McbspbRegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "PartIdRegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "PieCtrlRegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "PieVectTableFile" without a SECTIONS specification

    warning #10247-D: creating output section "SRAM_Chip_File" without a SECTIONS specification

    warning #10247-D: creating output section "SciaRegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "ScibRegsFile" without a SECTIONS specification

    >> Compilation failure

    warning #10247-D: creating output section "ScicRegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "Sense_PLD_File" without a SECTIONS specification

    warning #10247-D: creating output section "SpiaRegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "SysCtrlRegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "Wiznet_File" without a SECTIONS specification

    warning #10247-D: creating output section "XIntruptRegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "XintfRegsFile" without a SECTIONS specification

    warning #10247-D: creating output section "ramfuncs" without a SECTIONS specification

    undefined          first referenced   

      symbol                in file        

    ---------          ----------------   

    _ConfigCpuTimer    ./EDM_2833xFlash.obj

    _CpuTimer0         ./EDM_2833xFlash.obj

    _CpuTimer1         ./EDM_2833xFlash.obj

    _CpuTimer2         ./EDM_2833xFlash.obj

    _DSP28x_usDelay    ./XGen_WIZnet.obj  

    _InitCpuTimers     ./EDM_2833xFlash.obj

    _InitEQepGpio      ./EDM_2833xFlash.obj

    _InitFlash         ./EDM_2833xFlash.obj

    _InitPieCtrl       ./EDM_2833xFlash.obj

    _InitPieVectTable  ./EDM_2833xFlash.obj

    _InitSysCtrl       ./EDM_2833xFlash.obj

    _MemCopy           ./EDM_2833xFlash.obj

    _PID_output        ./EDM_2833xFlash.obj

    _RamfuncsLoadEnd   ./EDM_2833xFlash.obj

    _RamfuncsLoadStart ./EDM_2833xFlash.obj

    _RamfuncsRunStart  ./EDM_2833xFlash.obj

    _dTerm             ./EDM_2833xFlash.obj

    _iTerm             ./EDM_2833xFlash.obj

    _pTerm             ./EDM_2833xFlash.obj

    _velocity          ./EDM_2833xFlash.obj

    error #10234-D: unresolved symbols remain

    error #10010: errors encountered during linking; "EDM_28335_Flash1.out" not built

    gmake: *** [EDM_28335_Flash1.out] Error 1

    gmake: Target `all' not remade because of errors.

    **** Build Finished ****

     

    Some of those varibles I have defined in a global.c and global.h file that I have on my main workspace and are used in my main file called EDM_2833xFlash.c that is also on my main workspace. All of the DSP2833x_(name).c and  DSP2833x_(name).h files are located in an include directory off of my main workspace. In my compiler include options(Properties > Build > C2000 Compiler > Include Options) I have included both the workspace and the include directory. The same applies for the Linker options in the "File Search Path"

     

    I'm not sure what I'm missing here, why is it that the linker cannot find these definitions?

  • Hi,

    The first batch of errors:

    warning #10247-D: creating output section ".ebss" without a SECTIONS specification

    Are caused by the lack of a linker .CMD file in your project (I don't see one in the linker build command line).If you have a ControlSUITE package installed, you can find a suitable one at:

    C:\TI\controlSUITE\device_support\f2833x\v132\DSP2833x_common\cmd

    The second batch of errors:

    _DSP28x_usDelay    ./XGen_WIZnet.obj 

    Are caused by missing source files or (maybe) a library that contains all the missing functions. If the project was created with one of the older device support packages or with controlSUITE, then you would be able to find all these support files there. They need to be added or linked to your project for it to properly build.

    For example, the delay function above is defined in an assembly file <DSP2833_usDelay.asm> typically located at:

    C:\TI\controlSUITE\device_support\f2833x\v132\DSP2833x_common\source

    (the last version number and the master directory C:\ti may vary depending on the version of ControlSUITE you have)

    Others like _ConfigCpuTimer, _InitSysCtrl, etc. are defined in other source files in the same directory above.

    I suggest you either open an example project and compare the included source files or do a text search on the files at the directory above and see which functions are defined where.

    Hope this helps,

    Rafael

  • Thanks, I forgot to include my cmd file, that fixed all those warnings. I'm installing the controlSUITE right now, but what about the errors like this one:

    _velocity          ./EDM_2833xFlash.obj

    I have that varible (and several others) defined in a global.c and global.h file that are included in my project workspace.

    Thanks,

    -Dru 

     

  • Dru,

    If the file <global.c> somehow failed to compile, the linker will not find its .obj and will throw the error. I would repair all the controlSUITE dependencies before attempting to solve this particular one.

    Regards,

    Rafael

  • I added all of the files from the controlSUITE and the errors went away, the only ones I have remaining are from my global.c and global.h files:

    **** Build of configuration Mostly_RAM for project EDM_28335_Flash1 ****

    C:\ti\ccsv5\utils\bin\gmake -k all

    'Building target: EDM_28335_Flash1.out'

    'Invoking: C2000 Linker'

    "C:/ti/ccsv5/tools/compiler/c2000_6.1.0/bin/cl2000" -v28 -ml -mt --float_support=fpu32 -g --define="_DEBUG" --define="LARGE_MODEL" --define="MOSTLY_RAM" --diag_warning=225 --display_error_number --diag_wrap=off -z --stack_size=0x380 -m"EDM_28335_Flash1.map" --warn_sections -i"C:/Users/Brian/Desktop/QCTest2/EDM_28335_Flash1" -i"C:/Users/Brian/Desktop/QCTest2/EDM_28335_Flash1/include" -i"C:/ti/ccsv5/tools/compiler/c2000_6.1.0/lib" -i"C:/ti/ccsv5/tools/compiler/c2000_6.1.0/include" -i"C:/ti/bios_5_41_13_42/packages/ti/rtdx/lib/c2000" -i"C:/ti/bios_5_41_13_42/packages/ti/bios/lib" --reread_libs --define=MOSTLY_RAM=1 --display_error_number --diag_wrap=off --rom_model -o "EDM_28335_Flash1.out"  "./include/DSP2833x_usDelay.obj" "./include/DSP2833x_SysCtrl.obj" "./include/DSP2833x_Spi.obj" "./include/DSP2833x_PieVect.obj" "./include/DSP2833x_PieCtrl.obj" "./include/DSP2833x_MemCopy.obj" "./include/DSP2833x_I2C.obj" "./include/DSP2833x_Gpio.obj" "./include/DSP2833x_GlobalVariableDefs.obj" "./include/DSP2833x_EQep.obj" "./include/DSP2833x_EPwm.obj" "./include/DSP2833x_ECap.obj" "./include/DSP2833x_ECan.obj" "./include/DSP2833x_DisInt.obj" "./include/DSP2833x_DefaultIsr.obj" "./include/DSP2833x_DMA.obj" "./include/DSP2833x_DBGIER.obj" "./include/DSP2833x_CpuTimers.obj" "./include/DSP2833x_CodeStartBranch.obj" "./include/DSP2833x_CSMPasswords.obj" "./include/DSP2833x_Adc.obj" "./include/DSP2833x_ADC_cal.obj" "./XGen_WIZnet.obj" "./TestCmnds.obj" "./Global.obj" "./EDM_2833xFlash.obj" "./CAN_SCI.obj" -l"libc.a" -l"rts2800_fpu32.lib" "../include/IQmath_fpu32.lib" "../include/rts2800_mlxx.lib" "../cmd/DSP2833x_Headers_nonBIOS.cmd" "../cmd/F28335.cmd"

    <Linking>

    undefined   first referenced   

      symbol         in file        

    ---------   ----------------   

    _PID_output ./EDM_2833xFlash.obj

    _dTerm      ./EDM_2833xFlash.obj

    _iTerm      ./EDM_2833xFlash.obj

    _pTerm      ./EDM_2833xFlash.obj

    _velocity   ./EDM_2833xFlash.obj

    error #10234-D: unresolved symbols remain

    error #10010: errors encountered during linking; "EDM_28335_Flash1.out" not built

    >> Compilation failure

    gmake: *** [EDM_28335_Flash1.out] Error 1

    gmake: Target `all' not remade because of errors.

    **** Build Finished ****

     

     

    Thanks,

    -Dru

  • Nevermind, I fixed the global.c errors.

  • So back to the other project I was working on, with the error:

    undefined first referenced
    >> Compilation failure
    symbol in file
    --------- ----------------
    CPUcpsid ./interrupt.obj
    CPUcpsie ./interrupt.obj
    CPUwfi ./sysctl.obj
    ResetISR ./uart_echo_bfr.obj
    SysCtlDelay ./sysctl.obj

    I have the unmodified files (cpu.c and sysctl.c) added to my project along with their headers and I still get the unresolved symbols error. Here is the output of my build console: 


    **** Build of configuration Debug for project RTAHead ****

    C:\ti\ccsv5\utils\bin\gmake -k all
    subdir_rules.mk:28: warning: overriding commands for target `cpu.obj'
    subdir_rules.mk:21: warning: ignoring old commands for target `cpu.obj'
    'Building file: ../cpu.c'
    'Invoking: ARM Compiler'
    "C:/ti/ccsv5/tools/compiler/tms470_4.9.1/bin/cl470" -mv7M3 --code_state=16 --abi=eabi -me -g --include_path="C:/ti/ccsv5/tools/compiler/tms470_4.9.1/include" --include_path="C:/StellarisWare" --gcc --define=css --define=PART_LM3S8962 --diag_warning=225 --display_error_number --preproc_with_compile --preproc_dependency="cpu.pp" "../cpu.c"
    'Finished building: ../cpu.c'
    ' '
    'Building file: ../interrupt.c'
    'Invoking: ARM Compiler'
    "C:/ti/ccsv5/tools/compiler/tms470_4.9.1/bin/cl470" -mv7M3 --code_state=16 --abi=eabi -me -g --include_path="C:/ti/ccsv5/tools/compiler/tms470_4.9.1/include" --include_path="C:/StellarisWare" --gcc --define=css --define=PART_LM3S8962 --diag_warning=225 --display_error_number --preproc_with_compile --preproc_dependency="interrupt.pp" "../interrupt.c"
    'Finished building: ../interrupt.c'
    ' '
    'Building file: ../sysctl.c'
    'Invoking: ARM Compiler'
    "C:/ti/ccsv5/tools/compiler/tms470_4.9.1/bin/cl470" -mv7M3 --code_state=16 --abi=eabi -me -g --include_path="C:/ti/ccsv5/tools/compiler/tms470_4.9.1/include" --include_path="C:/StellarisWare" --gcc --define=css --define=PART_LM3S8962 --diag_warning=225 --display_error_number --preproc_with_compile --preproc_dependency="sysctl.pp" "../sysctl.c"
    'Finished building: ../sysctl.c'
    ' '
    'Building target: RTAHead.out'
    'Invoking: ARM Linker'
    "C:/ti/ccsv5/tools/compiler/tms470_4.9.1/bin/cl470" -mv7M3 --code_state=16 --abi=eabi -me -g --gcc --define=css --define=PART_LM3S8962 --diag_warning=225 --display_error_number -z --stack_size=256 -m"RTAHead.map" --heap_size=0 -i"C:/ti/ccsv5/tools/compiler/tms470_4.9.1/lib" -i"C:/ti/ccsv5/tools/compiler/tms470_4.9.1/include" --reread_libs --warn_sections --display_error_number --rom_model -o "RTAHead.out" "./watchdog.obj" "./uart_echo_bfr.obj" "./uart.obj" "./timer.obj" "./systick.obj" "./sysctl.obj" "./ssi.obj" "./rit128x96x4.obj" "./pwm.obj" "./interrupt.obj" "./gpio.obj" "./cpu.obj" "./can_net.obj" "./can.obj" -l"libc.a"
    <Linking>
    warning #10247-D: creating output section "vtable" without a SECTIONS
    specification


    undefined first referenced
    >> Compilation failure
    symbol in file
    --------- ----------------
    CPUcpsid ./interrupt.obj
    CPUcpsie ./interrupt.obj
    CPUwfi ./sysctl.obj
    ResetISR ./uart_echo_bfr.obj
    SysCtlDelay ./sysctl.obj

    error #10234-D: unresolved symbols remain
    error #10010: errors encountered during linking; "RTAHead.out" not built
    gmake: *** [RTAHead.out] Error 1
    gmake: Target `all' not remade because of errors.

    **** Build Finished ****

  • Hello Dru,

    I have a similar problem on TMS320C5505, as described above.As you said, all the warnings got fixed when you included cmd file,may I know where you found that cmd file.

    .

    Please check the error screen attached.

    Thanks

  • hi
    i found an error an cant able ale to resolve.

    **** Build of configuration Debug for project REYYAN ****

    "c:\\ti\\ccsv6\\utils\\bin\\gmake" -k all
    'Building target: REYYAN.out'
    'Invoking: C2000 Linker'
    "c:/ti/ccsv6/tools/compiler/c2000_6.2.5/bin/cl2000" -v28 -ml -mt -g --diag_warning=225 --display_error_number --diag_wrap=off -z -m"REYYAN.map" --stack_size=0x300 --warn_sections -i"c:/ti/ccsv6/tools/compiler/c2000_6.2.5/lib" -i"c:/ti/ccsv6/tools/compiler/c2000_6.2.5/include" --reread_libs --display_error_number --diag_wrap=off --xml_link_info="REYYAN_linkInfo.xml" --rom_model -o "REYYAN.out" "./Example_2802xCpuTimer.obj" "./DSP2802x_usDelay.obj" "./DSP2802x_SysCtrl.obj" "./DSP2802x_PieVect.obj" "./DSP2802x_PieCtrl.obj" "./DSP2802x_Gpio.obj" "./DSP2802x_DefaultIsr.obj" "./DSP2802x_CpuTimers.obj" "./DSP2802x_CodeStartBranch.obj" "../28027_RAM_lnk.cmd" "C:/ti/controlSUITE/device_support/f2802x/v129/DSP2802x_headers/cmd/DSP2802x_Headers_nonBIOS.cmd" -l"libc.a"
    <Linking>

    undefined first referenced
    symbol in file
    --------- ----------------
    _CpuTimer0Regs ./Example_2802xCpuTimer.obj
    _CpuTimer1Regs ./Example_2802xCpuTimer.obj
    _CpuTimer2Regs ./Example_2802xCpuTimer.obj
    _CsmPwl ./DSP2802x_SysCtrl.obj
    _CsmRegs ./DSP2802x_SysCtrl.obj
    _GpioCtrlRegs ./DSP2802x_SysCtrl.obj

    _PieCtrlRegs ./Example_2802xCpuTimer.obj
    >> Compilation failure
    _PieVectTable ./Example_2802xCpuTimer.obj
    _SysCtrlRegs ./DSP2802x_SysCtrl.obj

    error #10234-D: unresolved symbols remain
    error #10010: errors encountered during linking; "REYYAN.out" not built
    gmake: *** [REYYAN.out] Error 1
    gmake: Target `all' not remade because of errors.

    **** Build Finished ****
        

    these are the error i found


     

  • I think the problem coming due to the fact that the inline keyword is used in the latest version of ControlSuite files and this needs to be build in GCC compatibility mode thereby if files are being included else C compilers may choose to ignore that symbol in the Symbol Table. 

    Quick Solution is to add the --gcc compiler flag while building. 

    Regards

    Sandeep Acharya