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 All
I am using UCD3138 for an LLC resonant converter, and am working with CCS 5.4. I got the following erros and have no idea how to fix it. If you know, please help me to fix these errors:
**** Build of configuration Debug for project UCD3138LLCEVM_028 ****
"C:\\codecomposer5.3\\ccsv5\\utils\\bin\\gmake" -k all
(rm device_id.obj) & (perl ../../build_scripts/create_date_dot_h_CCS5.pl)
'rm' is not recognized as an internal or external command,
operable program or batch file.
'perl' is not recognized as an internal or external command,
operable program or batch file.
gmake[1]: [pre-build] Error 1 (ignored)
' '
'Building target: UCD3138LLCEVM_028.out'
'Invoking: ARM Linker'
"C:/codecomposer5.3/ccsv5/tools/compiler/arm_5.0.5/bin/armcl" -mv4 --code_state=16 --abi=tiabi -O1 -g --preproc_with_compile --preproc_with_comment --diag_warning=225 --display_error_number -z --stack_size=200 -m"C:/test1/CCSv5-untested/UCD3138LLCEVM_028/UCD3138LLCEVM_028.map" --heap_size=10 -i"C:/codecomposer5.3/ccsv5/tools/compiler/arm_5.0.5/lib" -i"C:/codecomposer5.3/ccsv5/tools/compiler/arm_5.0.5/include" --reread_libs --warn_sections --display_error_number --rom_model -o "UCD3138LLCEVM_028.out" "./zero_out_integrity_word.obj" "./uart.obj" "./store_restore_functions.obj" "./standard_interrupt.obj" "./software_interrupt_wrapper.obj" "./scale.obj" "./pmbus_vout_sequencing_commands.obj" "./pmbus_vout_commands.obj" "./pmbus_status_commands.obj" "./pmbus_read_param_commands.obj" "./pmbus_other_commands.obj" "./pmbus_manuf_specific_commands.obj" "./pmbus_manuf_info_commands.obj" "./pmbus_handler.obj" "./pmbus_fault_commands.obj" "./pmbus_cml_commands.obj" "./pmbus.obj" "./main.obj" "./load.obj" "./interrupts.obj" "./init_watchdog.obj" "./init_pmbus.obj" "./init_loop_mux.obj" "./init_front_ends.obj" "./init_filters.obj" "./init_fault_mux.obj" "./init_dpwms.obj" "./init_current_sharing.obj" "./init_cpcc.obj" "./init_adc12.obj" "./gpio.obj" "./flash.obj" "./device_id.obj" "./cyclone_global_variables_defs.obj" "./constants.obj" "./configuration_functions.obj" "./clear_program_flash.obj" -l"C:\codecomposer5.3\ccsv5\tools\compiler\arm_5.0.5\lib\libc.a" "../cyclone.cmd" "../cyclone_headers.cmd"
<Linking>
undefined first referenced
>> Compilation failure
symbol in file
--------- ----------------
$c_int00 ./load.obj
error #10234-D: unresolved symbols remain
error #10010: errors encountered during linking; "UCD3138LLCEVM_028.out" not
built
gmake[1]: *** [UCD3138LLCEVM_028.out] Error 1
gmake[1]: Target `main-build' not remade because of errors.
gmake: *** [all] Error 2
**** Build Finished ****
Thanks,
Mehran
Do I have to add any other libraries to my project? If so, which library?
Thanks,
Mehran
Mehran Ahmadi said:(rm device_id.obj) & (perl ../../build_scripts/create_date_dot_h_CCS5.pl)
'rm' is not recognized as an internal or external command,
operable program or batch file.
'perl' is not recognized as an internal or external command,
operable program or batch file.
gmake[1]: [pre-build] Error 1 (ignored)
These errors appear to be coming from a pre-build step. The pre-build step is not executing successfully because the commands are not recognized.
Is this a project provided by TI or your own project? Was it migrated from an older version of CCS?
The symbol undefined error from the linker is explained here: http://processors.wiki.ti.com/index.php/Build_Errors_in_CCS#Error:_unresolved_symbols_remain
Thanks for your help. Yes, we are trying to convert the code v3.3 to CCS5.4. This code is provided by TI for version 3.3.
My problem is that I have no idea what library I have to add to get these errors fixed. I would highly appreciate if you could give me some help on that.
Thanks,
Mehran
This project seems to be built for -mv4 and --abi=tiabi which is a very old abi format. As such, for this to link properly, all object files and libraries should be built for TIABI format. You may be able to get this project to build for the older TI ABI format but note that moving forward, for the long term, it is best to consider porting all code to one of the newer ABI formats - either TI ARM9 ABI or EABI. I have attached a readme file below from an older version of ARM compiler tools when this change was introduced that has some background on the TIABI and ARM9ABI formats.
TMS470 C/C++ CODE GENERATION TOOLS Release 4.1.4 April 2006 NOTE: The code generated by default with this release is not compatible with previous versions of the compiler. The convention used to label functions has changed to support the ARM9/ARM11 BLX instruction and linker generated veneers. See item 3 for details. This includes a description on how to achieve backwards compatibility. ================================================================================ Table of Contents ================================================================================ 1. New Application Binary Interface 2. New ARM Processor Support 3. New Compiler Switches 4. C++ Exception Support 5. List of Available RTS Libraries 6. New CPSR intrinsics 7. Default DWARF2 Debug Support 8. Integer Division With Constant Divisor 9. The MUST_ITERATE Pragma 10. The UNROLL Pragma 11. New linker command file operator, palign 12. 64-Bit Integer Support 13. Static Stack Depth Analysis 14. Improved -mn Switch 15. Branch Chaining 16. New Utility strip470 17. Updated Utility: nm470 18. Expanded Assembler Option -D (and -ad) 19. Pragmas to Control Diagnostic Messages 20. Filtering the Usage Information ("the help screen") 21. Predefined Symbols for Tool Version Numbers 22. TMS470_C_DIR and TMS470_A_DIR Environment Variables (also C_DIR & A_DIR) 23. -ppd and -ppi Options Allow Optional Filename 24. REMINDER: Calling Assembler Directly is Deprecated ================================================================================ New Features In Separate Readme Files ================================================================================ 1. New Object File Display Utility - see file ofd470_readme.txt 2. Sharing C Header Files With Assembly Source - see file c_headers_asm.txt 3. Linker-generated Copy Tables - see file linker_copy_tables.txt ================================================================================ 1. New Application Binary Interface ================================================================================ TMS470 compiler versions 4.1.0 and later contain 2 different ABI's (Application Binary Interfaces). An ABI defines manner in which an entire object file is compiled. It covers items including language specifics, calling conventions, or the object file format. For the TMS470 compiler, these changes are limited to the function naming convention and linking dual-mode code. The changes were made to take advantage of the new capabilities that are present, beginning with the V5E architectures. With compiler version 4.1.0 and later, the default ABI changes how function names are generated. There is now a uniform naming convention for a functions regardless whether a module is compiled in 16-bit mode or 32-bit mode. All function name are prefixed with the '_' (underscore). This change is due to the change where the linker (lnk470) now controls any necessary mode changes. The linker will determine the mode of both the caller and callee and generate the necessary code to make the call. For example, if the compiler is targeted for the V5E architecture, the linker will replace a BL instruction with a BLX instruction. If the target is V4, or the linker cannot determine the mode of the caller, the linker will generate the necessary veneer code. The code generator will no longer generate a veneer function in the assembly file. This means object code generated with earlier versions of the compiler will not correctly link with this new ABI. Backward compatibility is available as described below. The abi option is passed to the compiler through the --abi command-line switch. The available options are: 1. ti_arm9_abi This option also disables the "-md" switch (dual-state). For ti_arm9_abi, the same code is generated with and without "-md" switch and hence this switch has no effect. 2. tiabi This is the old-style ABI where functions are prefixed depending on whether the function is compiled in 32-bit or 16-bit mode. Also, the code-generator generates the veneers explicitly. This option is valid only for ARM7 (-mv4) and is provided strictly for backward compatibility. NOTE: Necessary Changes For Hand-Written Assembly Code ------------------------------------------------------ 1. A new pre-defined symbol has been added to the assembler. The symbol __TI_ARM9ABI_ASSEMBLER will be set to 1 if compiling for ti_arm9_abi and 0 otherwise. If the code will be used under both ABI's (ti_arm9_abi and tiabi) the assembly must use this predefined symbol to conditionaly set the correct function names. An example is given below. 2. Under the ti_arm9_abi, all 32-bit and 16-bit routines must be explicitly identified using the ".armfunc" and ".thumbfunc" assembler directives. These directives are required for the linker to properly generate dual mode code. Assembly code without these directives may result in compiler errors and possibly incorrect execution. Example: If function foo() is to be defined in 16-bit mode, the following is the desired assembly sequence: .if __TI_ARM9ABI_ASSEMBLER .thumbfunc _foo .endif .if __TIARM9ABI_ASSEMBLER _foo: .else $foo: .endif Generating Linknames -------------------- The compiler transforms the names of externally visible identifiers when creating their linknames. The algorithm used depends on the scope within which the identifier is declared. For objects, an underscore ( _ ) is prepended to the identifier name. For C code, this will take place for both 32-bit mode and 16-bit mode functions with the new ti_arm9_abi. In the backward compatible tiabi ABI, 32-bit mode functions have an underscore ( _ ) prepended to their names and 16-bit mode functions have a dollar sign ($) prepended. C++ functions have the same initial character ( _ ) for ti_arm9_abi (or (_ or $) for tiabi) prepended, but also have the function name further mangled. Mangling is the process of embedding a function's signature (the number and types of its parameters) into its name. The mangling algorithm used closely follows that described in The C++ Annotated Reference Manual (ARM). Mangling allows function overloading, operator overloading, and type-safe linking. ================================================================================ 2. New ARM Processor Support ================================================================================ V5E (ARM9) Architecture Support ------------------------------- The V5E support is included in compiler versions 4.1.0 and later. The V5E instruction set consists of all V4 (ARM7) instructions in addition to DSP extensions for performing saturated arithmetic, as well as new branch-and-link instructions. Some of the DSP extensions such as SMULBB, SMLABB are generated by the compiler automatically wherever possible. Other instructions can be generated using in the intrinsics described below. The command-line option "--silicon_version=5e" or "-mv5e" should be passed to the compiler to compile for V5E. The only ABI currently supported for V5E is ti_arm9_abi. Hence the function naming style and veneer generation conform to ti_arm9_abi specification. Intrinsics: The following are the intrinsics available to access V5E DSP extensions. Each intrinsic is described along with the arguments it takes and its corresponding instruction. Please refer instruction set reference manual for a description of these instructions. 1. Normalize floating point int dst = _norm(int src) CLZ dst, src 2. Saturated add int dst = _sadd(int src1, int src2) QADD dst, src1, src2 3. Saturated subtract int dst = _ssub(int src1, int src2) QSUB dst, src1, src2 4. Saturated double-add int dst = _sdadd(int src1, int src2) QDADD dst, src1, src2 5. Saturated double-subtract int dst = _sdsub(int src1, int src2) QDSUB dst, src1, src2 6. Saturated multiply int dst = _smpy(int src1, int src2) SMULBB dst, src1, src2 QADD dst, dst, dst 7. Saturated multiply-accumulate int dst = _smac(int src1, src2) SMULBB tmp, src1, src2 QDADD dst, dst, tmp 8. Saturated multiply-subtract int dst = _smsub(int src1, src) SMULBB tmp, src1, src2 QDSUB dst, dst, tmp 9. Signed multiply a. bottom half-words int dst = _smulbb(int src1, int src2) SMULBB dst, src1, src2 b. top and bottom half-words int dst = _smultb(int src1, int src2) SMULTB dst, src1, src2 c. bottom and top half-words int dst = _smulbt(int src1, int src2) SMULBT dst, src1, src2 d. Top half-words int dst = _smultt(int src1, int src2) SMULTT dst, src1, src2 10. Signed multiply-accumulate a. bottom half-words int dst = _smlabb(int src1, int src2, int acc) SMLABB dst, src1, src2, acc b. top and bottom half- words int dst = _smlatb(int src1, int src2, int acc) SMLATB dst, src1, src2, acc c. bottom and top half-words int dst = _smlabt(int src1, int src2, int acc) SMLABT dst, src1, src2, acc d. Top half-words int dst = _smlatt(int src1, int src2, int acc) SMULTT dst, src1, src2 11. Signed multiply-long and accumulate a. bottom half-words long long dst = _smlalbb(int src1, int src2) SMLALBB dstlo, dsthi, src1, src2 b. top and bottom half-words long long dst = _smlaltb(int src1, int src2) SMLALTB dstlo, dsthi, src1, src2 c. bottom and top half-words long long dst = _smlalbt(int src1, int src2) SMLALBT dstlo, dsthi, src1, src2 d. Top half-words long long dst = _smlaltt(int src1, int src2) SMULTT dstlo, dsthi, src1, src2 12. Signed multiply word and half-word a. Word and bottom-half int dst = _smulwb(int src1, short src2) SMULWB dst, src1, src2 b. Word and top-half int dst = _smulwt(int src1, short src2) SMULWT dst, src1, src2 13. Signed multiply-accumulate word and half-word a. Word and bottom-half int dst = _smlawb(int src1, short src2, int acc) SMLAWB dst, src1, src2, acc b. Word and top-half int dst = _smlawt(int src1, short src2, int acc) SMLAWT dst, src1, src2, acc 14. Subtract with carry int dst = _subc(int src1, int src2) SUBC dst, src1, src2 V6 (ARM11) Architecture Support ------------------------------- The V6 support is included in compiler versions 4.1.0 and later. The support for V6 includes - All new SIMD/media instructions through intrinsics. - All new thumb instructions (automatically generated). - Removal of restrictions for instructions such as MUL required for older architectures (ARM V4). There is no support for the following features - Unaligned reads and writes - Mixed-endian mode and instructions The compiler will automatically generate all the new thumb instructions wherever required. It will also generate the new V6 32-bit mode sign-extension instructions wherever possible. The command-line option "--silicon_version=6" or "-mv6" should be passed to the compiler to compile for V6. The only ABI currently supported for V6 is ti_arm9_abi. Hence the function naming style and veneer generation conform to ti_arm9_abi specification. 1. SIMD/Media extension instrinsics. The ARM11 processor supports provides a large set of media instructions. The intrinsics are classified as groups and described below. a. Parallel add/subtract instructions. These instructions perform parallel halfword-wise and byte-wise addition and subtraction of general purpose registers. These instructions are ADD16, ADDSUBX, SUBADDX, SUB16, ADD8, SUB8. The different types of arithmetic (such as signed, unsigned, saturated etc) is specified using a prefix. The allowed prefixes are S, Q, SH, U, UQ, UH. Any of these prefixes can be combined with any of the above add/subtract operations. The intrinsics are int dst = _{s,sh,q,u,uq,uh}{add16,addsubx,subaddx,sub16,add8,sub8} (int src1, int src2) {S,SH,Q,U,UQ,UH}{ADD16, ADDSUBX, SUBADDX, SUB16, ADD8, SUB8} dst, src1, src2 where the braces indicate a choice of any one of the comma-separated list. b. Halfword packing instructions int dst = _pkhbt(int src1, int src2, imm5 shift) PKHBT dst, src1, src2, LSL #shift int dst = _pkhtb(int src1, int src2, imm5 shift) PKHBT dst, src1, src2, LSL #shift c. Parallel half-word saturating instructions int dst = _ssat16(int src, imm5 satimm) SSAT16 dst, src, #satimm int dst = _usat16(int src, imm5 satimm) USAT16 dst, src, #satimm d. Selection instructions int dst = _sel16(int src1, int src2) SEL16 dst, src1, src2 int dst = _sel8(int src1, int src2) SEL8 dst, src1, src2 e. Sign/Zero-extend instructions int dst = _sunpk8to16(int src,imm5 rotamt) SUNPK8TO16 dst, src, ROR #rotamt int dst = _sunpk8to32(int src,imm5 rotamt) SUNPK8TO32 dst, src, ROR #rotamt int dst = _sunpk16to32(int src,imm5 rotamt) SUNPK16TO32 dst, src, ROR #rotamt int dst = _uunpk8to16(int src,imm5 rotamt) UUNPK8TO16 dst, src, ROR #rotamt int dst = _uunpk8to32(int src,imm5 rotamt) UUNPK8TO32 dst, src, ROR #rotamt int dst = _uunpk16to32(int src,imm5 rotamt) UUNPK16TO32 dst, src, ROR #rotamt f. Sign/Zero-extend and add instructions int dst = _sadd8to16(int src1, int src2, imm5 rotamt) SUNPK8TO16 dst, src1, src2, ROR #rotamt int dst = _sadd8to32(int src1, int src2, imm5 rotamt) SUNPK8TO32 dst, src1, src2, ROR #rotamt int dst = _sadd16to32(int src1, int src2, imm5 rotamt) SUNPK16TO32 dst, src1, src2, ROR #rotamt int dst = _uadd8to16(int src1, int src2, imm5 rotamt) UUNPK8TO16 dst, src1, src2, ROR #rotamt int dst = _uadd8to32(int src1, int src2, imm5 rotamt) UUNPK8TO32 dst, src1, src2, ROR #rotamt int dst = _uadd16to32(int src1, int src2, imm5 rotamt) UUNPK16TO32 dst, src1, src2, ROR #rotamt g. Signed multiply instructions operand acc is the value with which the product is accumulated int dst = _smlad(int src1, int src2, int acc) SMLAD dst, src1, src2, acc int dst = _smladx(int src1, int src2, int acc) SMLADX dst, src1, src2, acc int dst = _smlsd(int src1, int src2, int acc) SMLSD dst, src1, src2, acc int dst = _smlsdx(int src1, int src2, int acc) SMLSDX dst, src1, src2, acc int dst = _smmla(int src1, int src2, int acc) SMMLA dst, src1, src2, acc int dst = _smmlar(int src1, int src2, int acc) SMMLAR dst, src1, src2, acc int dst = _smmls(int src1, int src2, int acc) SMMLS dst, src1, src2, acc int dst = _smmlsr(int src1, int src2, int acc) SMMLSR dst, src1, src2, acc int dst = _smuad(int src1, int src2) SMUAD dst, src1, src2 int dst = _smuadx(int src1, int src2) SMUADX dst, src1, src2 int dst = _smusd(int src1, int src2) SMUSD dst, src1, src2 int dst = _smusdx(int src1, int src2) SMUSDX dst, src1, src2 int dst = _smmul(int src1, int src2) SMMUL dst, src1, src2 int dst = _smmulr(int src1, int src2) SMMULR dst, src1, src2 long long dst = _smlald(int src1, src2) SMLALD dstlo, dsthi, src1, src2 long long dst = _smlaldx(int src1, src2) SMLALDX dstlo, dsthi, src1, src2 long long dst = _smlsld(int src1, src2) SMLSLD dstlo, dsthi, src1, src2 long long dst = _smlsldx(int src1, src2) SMLSLDX dstlo, dsthi, src1, src2 h. Unsigned multiply-accumulate-accumulate long long long dst = _umaal(int src1, int src2) UMAAL dstlo, dsthi, src1, src2 j. Unsigned sum-of-absolute differences int dst = _usad8(int src1, int src2) USAD8 dst, src1, src2 int dst = _usada8(int src1, int src2, int acc) USADA8 dst, src1, src2, acc ================================================================================ 3. New Compiler Switches ================================================================================ -ab=<num> Specify length of maximum branch chain for branch chaining optimization. -abi=ti_arm9_abi,tiabi This applies to any compiler version 4.1.0 and later. In these compilers the application binary interface has changed to support a different function naming scheme and linker generated veneers. The default is the ti_arm9_abi. For backward compatibility, for example to add the '$' prefix for thumb functions, and '_' prefix far arm functions, use tiabi. See below for details. --align_structs=<n> Structure alignment can be forced to a minimum "n" byte boundary where "n" is a power of 2 with this switch. To align all structs to a word boundary use: cl470 --align_structs=4 All structs in the file will contain that minimum alignment, including nested structs. This will only set a minimum alignment, this does not "pack" data structures. This can also break a program if one file is compiled with this switch and another is not, or a different alignment is used. The offsets of a nested switch could be incorrect in such a case. -args=size Set C argc/argv memory size. See section 7.4.3 in the Assembly Language Tools User's Guide. --code_state=16,32 Set the TMS470 compilation mode. If set to 32, the compiler will generate 32-bit code. This is the default setting. If set to 16, the compiler will generate 16-bit code. The switch --code_state=16 and the -mt switch are equivalent. --default_order The default linker algorithm to allocate sections not listed in a linker command file changed with version 2.52. The new algorithm is a sized-based algorithm. This meant applications relying on the old behavior encountered linker errors. The old behavior found in version 2.51 and earlier is available with a new linker switch, --default_order. For example: cl470 file.c -z --default_order lnk.cmd ... or lnk470 --default_order file.obj lnk.cmd ... --disable_branch_chaining Disable branch chaining optimization --endian=big,litte Set the endianness of the compiled code. The default is big-endian. The switch --endian=litte and the -me switch are equivalent. --exceptions Enable C++ exception handling -mv=4,5e,6 This applies to any compiler version 4.1.0 and later. Set the target ARM architecture for the compiler. Use 4 for ARM version 4 architectures. Use 5e for ARM version 5E architectures. Use 6 for ARM version 6 architectures. Without this switch, the target architecture is version 4. See below for details on targeting the compiler for versions 5E and 6. --plain_char=signed,unsigned Specify how plain char data types will be compiled. The char data type is treated as unsigned by default. --static_template_instantiation This arm release contains an updated shell tool, cl470.exe, with the following new switch: --static_template_instantiation For example: cl470 --static_template_instantiation aa.cpp With this switch all template entities are instantiated as needed in that file by the parser. These instantiations are also given internal linkage. --verbose Display the banner while compiling. This includes the compiler version number and copyright. For example: cl470 --vebose file.c TMS470 C/C++ Compiler Version 3.00 Tools Copyright (c) 1996-2003 Texas Instruments Incorporated "file.c" ==> main -version Print the version number for each tool in the compiler. No compiling will take place. For example: cl470 --version TMS470 C/C++ Compiler Version 3.00 Build Number 1DK2N-8A0FEEH-UASQC-VAV-DZAZE_T_QQ_1S TMS470 C/C++ Parser Version 3.00 Build Number 1DK2N-8A0FEEH-UASQC-VAV-DZAZE_T_QQ_1S TMS470 C/C++ Optimizer Version 3.00 Build Number 1DK2N-8A0FEEH-UASQC-VAV-DZAZE_T_QQ_1S TMS470 C/C++ Codegen Version 3.00 Build Number 1DK2N-8A0FEEH-UASQC-VAV-DZAZE_T_QQ_1S TMS470 COFF Assembler Version 3.00 Build Number 1DK2N-8A0FEEH-UASQC-VAV-DZAZE_T_QQ_1S TMS470 COFF Linker Version 3.00 Build Number 1DK2N-8A0FEEH-UASQC-VAV-DZAZE_T_QQ_1S --xml_link_info=file Produce detailed link information data-base in <file>. See section 7.4.21 in the Assembly Language Tools User's Guide. ================================================================================ 4. C++ Exception Support ================================================================================ The --exceptions switch will enables C++ exception handling. The compiler will generate code to handle try/catch/throw statements in C++ code. It is necessary to use a run-time library that contains the necessary functions that control exception handling. This code is not included in the standard TMS470 libraries. To link code compiled with exceptions use one of the following libraries: 16-bit mode, big endian ----------------------- rts16_eh.lib rts16arm9_eh.lib rts16tiabi_eh.lib 16-bit mode, little endian ----------------------- rts16e_eh.lib rts16earm9_eh.lib rts16etiabi_eh.lib 32-bit mode, big endian ----------------------- rts32_eh.lib rts32earm9_eh.lib rts32arm9_eh.lib 32-bit mode, little endian ----------------------- rts32etiabi_eh.lib rts32e_eh.lib rts32tiabi_eh.lib For details on the TMS470 run-time libraries, see next section. ================================================================================ 5. List of Available RTS Libraries ================================================================================ Separate libraries are provided for each mode, big and little endian, each abi, v4 and v5e architectures, and with C++ exception support. 16-bit Mode Libraries --------------------- Library Name Arch ABI Endianness C++ Version Exceptions ------------------------------------------------------------------------------- rts16.lib | V4 | ti_arm9_abi | big | No ------------------------------------------------------------------------------- rts16e.lib | V4 | ti_arm9_abi | little | No ------------------------------------------------------------------------------- rts16arm9.lib | V5E | ti_arm9_abi | big | No ------------------------------------------------------------------------------- rts16earm9.lib | V5E | ti_arm9_abi | little | No ------------------------------------------------------------------------------- rts16_eh.lib | V4 | ti_arm9_abi | big | Yes ------------------------------------------------------------------------------- rts16e_eh.lib | V4 | ti_arm9_abi | little | Yes ------------------------------------------------------------------------------- rts16arm9_eh.lib | V5E | ti_arm9_abi | big | Yes ------------------------------------------------------------------------------- rts16earm9_eh.lib | V5E | ti_arm9_abi | little | Yes ------------------------------------------------------------------------------- rts16tiabi.lib | V4 | tiabi | big | No ------------------------------------------------------------------------------- rts16etiabi.lib | V4 | tiabi | little | No ------------------------------------------------------------------------------- rts16tiabi_eh.lib | V4 | tiabi | big | Yes ------------------------------------------------------------------------------- rts16etiabi_eh.lib | V4 | tiabi | little | Yes 32-bit Mode Libraries --------------------- Library Name Arch ABI Endianness C++ Version Exceptions ------------------------------------------------------------------------------- rts32.lib | V4 | ti_arm9_abi | big | No ------------------------------------------------------------------------------- rts32e.lib | V4 | ti_arm9_abi | little | No ------------------------------------------------------------------------------- rts32arm9.lib | V5E | ti_arm9_abi | big | No ------------------------------------------------------------------------------- rts32earm9.lib | V5E | ti_arm9_abi | little | No ------------------------------------------------------------------------------- rts32_eh.lib | V4 | ti_arm9_abi | big | Yes ------------------------------------------------------------------------------- rts32e_eh.lib | V4 | ti_arm9_abi | little | Yes ------------------------------------------------------------------------------- rts32arm9_eh.lib | V5E | ti_arm9_abi | big | Yes ------------------------------------------------------------------------------- rts32earm9_eh.lib | V5E | ti_arm9_abi | little | Yes ------------------------------------------------------------------------------- rts32tiabi.lib | V4 | tiabi | big | No ------------------------------------------------------------------------------- rts32etiabi.lib | V4 | tiabi | little | No ------------------------------------------------------------------------------- rts32tiabi_eh.lib | V4 | tiabi | big | Yes ------------------------------------------------------------------------------- rts32etiabi_eh.lib | V4 | tiabi | little | Yes ================================================================================ 6. New CPSR intrinsics ================================================================================ The following intrinsics have been added to get/set the CPSR register and to enable/disable interrupts: Intrinsic prototypes: a) To set the CPSR register: void _set_CPSR(uint src) void _restore_interrupts(uint src) --> MSR CPSR,src b) To set the CPSR flag bits (the src is rotated by the intrinsic): void _set_CPSR_flg(uint src) --> MSR CPSR_FLG,src c) To get the CPSR register: dst = uint _get_CPSR() --> MRS dst,CPSR d) To call a software interrupt (src must be an immediate): void _call_swi(uint src) --> SWI $src e) To enable/disable IRQ interrupts and return previous CPSR value: dst = uint _enable_IRQ() --> MRS dst,CPSR BIC tmp,dst,#0x80 MSR CPSR,tmp dst = uint _disable_IRQ() --> MRS dst,CPSR ORR tmp,dst,#0x80 MSR CPSR,tmp f) To enable/disable FIQ interrupts and return previous CPSR value: dst = uint _enable_FIQ() --> MRS dst,CPSR BIC tmp,dst,#0x40 MSR CPSR,tmp dst = uint _disable_FIQ() --> MRS dst,CPSR ORR tmp,dst,#0x40 MSR CPSR,tmp g) To enable/disable all interrupts and return previous CPSR value: dst = uint _enable_interrupts() --> MRS dst,CPSR BIC tmp,dst,#0xc0 MSR CPSR,tmp dst = uint _disable_interrupts() --> MRS dst,CPSR ORR tmp,dst,#0xc0 MSR CPSR,tmp ================================================================================ 7. Default DWARF2 Debug Support ================================================================================ The TMS470 C/C++ Code Generation Tools support the generation of DWARF symbolic debug information in the output object code. The DWARF debug output contains detailed type information about objects and functions used in an application. This is the default debug information generated with the -g shell switch. The compiler will normally generate some amount of DWARF debug information, even without the -g switch. This may include information on functions, files, and global variables. This information does not hinder any optimizations. It is possible to disable the generation of all symbolic debugging with the use of the -gn shell switch. Previous releases of the compiler generated STABS debug information by default. The compiler can still generate STABS if necessary. This is available with the -gt shell switch. Debug type merging and type checking are performed by default in the linker. Any type inconsistencies in the uses of symbols from different object files are now reported. This feature can be turned off by passing the -b switch to the linker. ================================================================================ 8. Integer Division With Constant Divisor ================================================================================ The optimizer will attempt to rewrite integer divide operations with constant divisors. The integer divides are rewritten as a multiply with the reciprocal of the divisor. This occurs at level -o2 and higher. It is also necessary to use the compile-for-speed shell switch: -mf. ================================================================================ 9. The MUST_ITERATE Pragma ================================================================================ Two pragmas have been added in this release that aid the user in unrolling loops. It is necessary to use optimization level -o1 or higher for these pragmas. The MUST_ITERATE pragma specifies to the compiler certain properties of a loop. Through the use of the MUST_ITERATE pragma, you can guarantee that a loop executes a certain number of times. The pragma can help the compiler eliminate unnecessary code. Any time the UNROLL pragma is applied to a loop, MUST_ITERATE should be applied to the same loop. In this case, the MUST_ITERATE pragma's third argument, multiple, should always be specified. No statements are allowed between the MUST_ITERATE pragma and the for, while, or do-while loop to which it applies. However, other pragmas, such as UNROLL, can appear between the MUST_ITERATE pragma and the loop. The syntax of the pragma for C and C++ is: #pragma MUST_ITERATE ( min, max, multiple) [;] The arguments min and max are programmer-guaranteed minimum and maximum trip counts. The trip count is the number of times a loop iterates. The trip count of the loop must be evenly divisible by multiple. All arguments are optional. For example, if the trip count could be 5 or greater, you can specify the argument list as follows: #pragma MUST_ITERATE(5); However, if the trip count could be any nonzero multiple of 5, the pragma would look like this: #pragma MUST_ITERATE(5, , 5); /* A blank field for max*/ It is sometimes necessary for you to provide min and multiple in order for the compiler to perform unrolling. This is especially the case when the compiler cannot easily determine how many iterations the loop will perform (i.e., the loop has a complex exit condition). When specifying a multiple via the MUST_ITERATE pragma, results of the program are undefined if the trip count is not evenly divisible by multiple. Also, results of the program are undefined if the trip count is less than the minimum or greater than the maximum specified. If no min is specified, zero is used. If no max is specified, the largest possible number is used. If multiple MUST_ITERATE pragmas are specified for the same loop, the smallest max and largest min are used. ================================================================================ Using MUST_ITERATE to Expand Compiler Knowledge of Loops ================================================================================ Through the use of the MUST_ITERATE pragma, you can guarantee that a loop executes a certain number of times. The example below tells the compiler that the loop is guaranteed to run exactly 10 times: #pragma MUST_ITERATE(10,10); for(i = 0; i < trip_count; i++) { ... If the MUST_ITERATE pragma is not specified for a loop such as this, the compiler generates code to bypass the loop, to account for the possibility of 0 iterations. With the pragma specification, the compiler knows that the loop iterates at least once and can eliminate the loop-bypassing code. MUST_ITERATE can specify a range for the trip count as well as a factor of the trip count. For example: #pragma MUST_ITERATE(8,48,8); for(i = 0; i < trip_count; i++) { ... This example tells the compiler that the loop executes between 8 and 48 times and that the trip_count variable is a multiple of 8 (8, 16, 24, 32, 40, 48). The multiple argument allows the compiler to unroll the loop. You should also consider using MUST_ITERATE for loops with complicated bounds. In the following example: for(i2 = ipos[2]; i2 < 40; i2 += 5) { ... the compiler would have to generate a divide function call to determine, at run-time, the exact number of iterations performed. The compiler will not do this. In this case, using MUST_ITERATE to specify that the loop always executes 8 times allows the compiler to generate a hardware loop: #pragma MUST_ITERATE(8,8); for(i2 = ipos[2]; i2 < 40; i2 += 5) { ... ================================================================================ 10. The UNROLL Pragma ================================================================================ The UNROLL pragma specifies to the compiler how many times a loop should be unrolled. The optimizer must be invoked (use -o1, -o2, or -o3) in order for pragma-specified loop unrolling to take place. The compiler has the option of ignoring this pragma. No statements are allowed between the UNROLL pragma and the for, while, or do-while loop to which it applies. However, other pragmas, such as MUST_ITERATE, can appear between the UNROLL pragma and the loop. The syntax of the pragma for C and C++ is: #pragma UNROLL ( n) [;] If possible, the compiler unrolls the loop so there are n copies of the original loop. The compiler only unrolls if it can determine that unrolling by a factor of n is safe. In order to increase the chances the loop is unrolled, the compiler needs to know certain properties: * The loop iterates a multiple of n times. This information can be specified to the compiler via the multiple argument in the MUST_ITERATE pragma. * The smallest possible number of iterations of the loop. * The largest possible number of iterations of the loop. The compiler can sometimes obtain this information itself by analyzing the code. However, the compiler can be overly conservative in its assumptions and may generate more code than is necessary when unrolling. This can also lead to not unrolling at all. Furthermore, if the mechanism that determines when the loop should exit is complex, the compiler may not be able to determine these properties of the loop. In these cases, you must tell the compiler the properties of the loop by using the MUST_ITERATE pragma. The following pragma specification: #pragma UNROLL(1); asks that the loop not be unrolled. Automatic loop unrolling also is not performed in this case. If multiple UNROLL pragmas are specified for the same loop, it is undefined which UNROLL pragma is used, if any. ================================================================================ 11. New linker command file operator, palign ================================================================================ The linker will now support the use of a "palign" operator in the linker command file. Details are found in the CGTLinker.txt document. ================================================================================ 12. 64-bit Integer Support ================================================================================ The TMS470 Compiler now supports the following new data types. The range values are available as standard macros in the header file limits.h. ------------------------------------------------------------------------------- Type Size Representation Minimum Maximum Value Value ------------------------------------------------------------------------------- long long signed long long 64bits 2's -9223372036854775808 9223372036854775807 complement unsigned long long 64bits Binary 0 18446744073709551615 ------------------------------------------------------------------------------- The long long data types are stored in register pairs. In memory they are stored as 64-bit objects at word (32-bit) aligned addresses. The ordering of the bytes in the 64-bit object depends on the endianness of the target. For example in big endian target the value 0x0011223344556677 will be stored as follows: Address x 00112233 Address x+4 44556677 long long integer constant can have an "ll" or "LL" suffix. Without the suffix the value of the constant will determine the type of the constant. The formatting rules for long long in C I/O require "ll" in the format string. For example: printf("%lld", 0x0011223344556677); printf("%llx", 0x0011223344556677); The following new library functions are added: llabs(), strtoll() and strtoull(). ================================================================================ 13. Static Stack Depth Analysis ================================================================================ The static stack depth profiler will provide information to the user about the maximum stack depth requirements of their application based on the static information available to it in the output file generated by the linker. The profiler is implemented as a stand-alone application called sdp470. The profiler will take a linked output file as input and produce a listing that details the stack usage of all of the functions defined in the application. If an application contains indirect calls and/or reentrant procedures, then a configuration file should also be provided as input to the profiler. The syntax for invoking the static stack depth profiler is as follows: sdp470 [-c config] out-file -c config Identifies a configuration file to be used by the profiler to supply information about indirectly called functions and reentrant procedures. out-file Identifies linked output file for an application to be analyzed by the profiler. This file will contain debug information about all functions included in the final link of an application. Details of the static stack depth profiler are provided in a separate document, sdprof.htm (unix platforms) or sdprof.doc (PC platforms). ================================================================================ 14. Improved -mn Switch ================================================================================ The existing -mn shell switch is documented as reenabling optimizations disabled by the -g option. In previous releases there existed some optimizations that were still disabled under -mn. This is no longer the case; equivalent code should now be produced with "-g -mn" as compared to when those switches are omitted. Note that if only the -g switch is used, a variety of optimizations may be disabled to ensure the maximum debugging support possible. ================================================================================ 15. Branch Chaining ================================================================================ Support for branch chaining, in 16-BIS mode only, has been added. a. What is Branch Chaining? Consider the following code sequence LAB1: BR L10 .... LAB2: BR L10 .... .... L10: If L10 is far away from LAB1 (large offset), the assembler would convert BR into a sequence of branch around and unconditional branch, resulting in a sequence of 2 instructions that are either 4 or 6 bytes long. Instead, if the branch at LAB1 can jump to LAB2, and LAB2 is close enough so that BR can be replaced by a single, short branch instruction, the resulting code is smaller as the BR in LAB1 would be converted into one instruction that is 2 bytes long. This method of branching to branches that jump to the desired target is known as "branch chaining". Note that LAB2 can in turn jump to another branch if L10 is too far away from LAB2. Thus, branch chaining can be extended to arbitrary depths. b. How does it work? The codegen generates the following (new pseduo) instructions 1. BTcc instead of BRcc Format: BTcc target,#depth The #depth is an optional argument and if not specified, is set to the default branch chaining depth. If specified, the chaining depth for this branch instruction is set to #depth. The assembler issues a warning if #depth is less than zero and sets the branch chaining depth for this instruction to zero. 2. BQcc instead of Bcc Format: BQcc target,#depth The #depth argument is similar to the one in BT instruction. The BT pseudo instruction replaces BR (pseduo branch) instruction. Similarly, BQ replaces B. The assembler performs branch chain optimizations for these instructions, if branch chaining is enabled. The assembler replaces the BT and BQ jump targets with the offset to the branch to which these instructions jump. The default branch chaining is 10 (to prevent longer branch chains from impeding performance). c. How to control branch chaining? The shell supports the command-line argument "-ab num" that controls the depth of branch chaining. num is the depth of branch chaining. A value of zero indicates that no branch chaining should be performed (branch chaining disabled). A negative value for num results in an assembler warning and the branch chaining depth is taken as zero. Alternatively, the argument "--max_branch_chain num" can be passed to the assembler directly. Note that the pseudo instructions for branch chaining are generated only if compiling in thumb mode and compiling for code size. In all other cases, these instructions (BT and BQ) are not generated. Assembly language programmers can use the BT and BQ instructions to enable the assembler to perform branch chaining. The programmer can control the branch chaining depth for each instruction using the second (optional) argument. Assembly programmers must use the BR and B instructions if they wish to prevent branch chaining for those branches Branch chaining can be turned off by using the --disable_branch_chaining switch. ================================================================================ 16. New Utility strip470 ================================================================================ The strip utility, strip470, is used to remove symbol table and debugging information from object files. The following command invokes the strip utility: strip470 [-options] <input filename> [ <input filename> ... ] <input filename> is a COFF object file (.obj) or an executable file (.out). The options are as follows: -p Remove all information not required for execution. This option causes more information to be removed than the default behavior, but the object file is left in a state that cannot be linked. This option should only be used with executable (.out) files. When strip470 is invoked, it will replace the input files with their stripped versions. ================================================================================ 17. Updated Utility: nm470 ================================================================================ The name utility, nm470, is used to print the list of names defined and referenced in a COFF object file (.obj), an executable file (.out), or an archive library (.lib). The value associated with the symbol and an indication of the kind of symbol is also printed. The following command invokes the name utility: nm470 [-options] <input filename> [ <input filename> ... ] <input filename> is a COFF object file (.obj), an executable file (.out), or an archive library (.lib). The name utility options are as follows: -a List all symbols -c Include C NULL symbols in listing -l Lists symbol information from an object or archive library using a longer, more detailed format -d Include debug symbols in listing -f Prepend file name to each symbol -g List global symbols only -h Display a help message that includes usage and option information -n Sort symbols by value rather than alphabetically -o <file> Prints the listing to <~Ale> rather than to stdout -p Do not sort symbols -q Quiet -r Sort symbols in reverse order -t Include tag info symbols in listing -u List undefined symbols only ================================================================================ 18. Expanded Assembler Option -D (and -ad) ================================================================================ Previously the -D option (and -ad option) could be used to equate a symbol to a constant numeric value acting as the equivalent of a .set directive. This option has been extended to allow a symbol to be equated to a string, the option acting as the equivalent of an .asg directive. The syntax of this option remains the same, -Dname=[value], except that when 'value' is a non-numeric string, the new form is invoked. Note that when 'value' is empty, 1 is used as the default operand. ================================================================================ 19. Pragmas to Control Diagnostic Messages ================================================================================ The following pragmas may be used to control diagnostic messages in the same ways as the corresponding command line options: pragma option meaning #pragma diag_suppress id -pds=id Suppress diagnostic <id> #pragma diag_remark id -pdsr=id Treat diagnostic <id> as a remark #pragma diag_warning id -pdsw=id Treat diagnostic <id> as a warning #pragma diag_error id -pdse=id Treat diagnostic <id> as an error #pragma diag_default id N/A Use default severity of the diagnostic The pragma syntax is the following: #pragma diag_xxx [=] error_number_or_tag, error_number_or_tag ... The diagnostic affected is specified using either an error number or an error tag name. The "=" is optional. Any diagnostic may be overridden to be an error, but only diagnostics with a severity of discretionary error or below may have their severity reduced to a warning or below, or be suppressed. The diag_default pragma is used to return the severity of a diagnostic to the one that was in effect before any pragmas were issued (i.e., the normal severity of the message as modified by any command-line options). The diagnostic identifier number is output along with the message when the -pden command line option is specified. ================================================================================ 20. Filtering the Usage Information ("the help screen") ================================================================================ The cl470 help option, -h or --help, normally displays the syntax for invoking cl470 and the list of available options. When this option is followed by another option or phrase it will display detailed information about the option or will display options related to the phrase. For example to see information about options associated with debugging use 'cl55 -h debug'. ================================================================================ 21. Predefined Symbols for Tool Version Numbers ================================================================================ The format of the tool versions numbers has changed to include three levels of qualification. The compiler and assembler each predefine a symbol that represents the version number of the tools. These symbols are integer values with three digits for each level of qualification. Version x.y.z is mapped to the integer 1000000*x + 1000*y + z. Thus version 4.1.2 is represented by the integer 004001002. The compiler predefined symbol is __TI_COMPILER_VERSION__. This symbol existed in previous versions but was encoded differently. The new encoding still has the property that this version has a larger value than the value for any preceding version. New in this release, the assembler predefines the symbol __TI_ASSEMBLER_VERSION__. ================================================================================ 22. TMS470_C_DIR and TMS470_A_DIR Environment Variables (also C_DIR & A_DIR) ================================================================================ As described in existing documentation these environment variables may be used to supply a list of pathnames for directories to be searched by the compiler, assembler or linker for such things as include files, macro libraries, and object libraries. The specification of the exact format of the values to be assigned to these variables has been tightened up to avoid various ambiguities that occur when spaces are allowed in pathnames. Semicolons are now the ONLY legal separators. Spaces before and after semicolons, at the beginnings and ends of pathnames are ignored. Other spaces are considered to be part of the pathnames. This holds for all platforms. This matches the convention which was previously supported on Windows PC hosts. As far as search order goes, the assembly parser and assembler check A_DIR directories and then C_DIR directories. The linker checks C_DIR and then A_DIR. The C/C++ compiler checks C_DIR only. ================================================================================ 23. -ppd and -ppi Options Allow Optional Filename ================================================================================ The -ppd and -ppi options used to generate dependency lists may specify an optional filename. As before the file <sourcefile>.pp is used if no filename is specified. The syntax is -ppd[=filename] and -ppi[=filename]. ================================================================================ 24. REMINDER: Calling Assembler Directly is Deprecated ================================================================================ This reminder is primarily a "heads up" to users moving from Code Composer Studio versions 2.0x and 2.1x to this version of the tools. Direct invocation of (asm470) assembler has been deprecated in favor of invocation via cl470. cl470 considers any file with the extension .asm to be an assembly file and will call the assembler. For the most part existing options continue to be supported by asm470, but all new options are available only through cl470.
The specific linker error is about undefined symbol $c_int00. The message is saying that load.c is referencing $c_int00 but the linker cannot find a definition for it. Usually the symbol _c_int00 (with the underscore rather than $) is defined in the runtime library rts.lib.
Did the original project have an rts.lib explicitly specified in the project? If you have access to a build of the original project can you check which runtime library is being linked in - you should be able to check in the link map file if you have one generated by an original build).
For your CCSv5 build, the appropriate library should be automatically built and selected since you have -l"C:\codecomposer5.3\ccsv5\tools\compiler\arm_5.0.5\lib\libc.a" in your build options. Do you see a library build step happening in the CCS build console?
Hello Mehran,
I was facing the same issue and I seem to have been able to solve it by updating to CCS5.5 which uses the ARM compiler 5.1.1. Make sure you set up your runtime support library option under the project options to <automatic>.
After you are set with CCS5.5 go ahead and change line 195 in the file "load.asm" to read:
BL _c_int00
This seems to have fixed the problem for me as I was able to successfully compile the code and load it to the UCD3138.