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.
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
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.
//***************************************************************************** // // 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. //! @} // //*****************************************************************************
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
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 ****
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