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.

[参考译文] 编译器/TMS320C6678:IPC、XDC 和 SYSBIOS 的代码调用方法中的未解析符号

Guru**** 2601915 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/635893/compiler-tms320c6678-unresolved-symbols-in-code-calling-methods-from-ipc-xdc-and-sysbios

器件型号:TMS320C6678
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI C/C++编译器

您好!

我使用 PDK 4.01创建了一个新的 CCS 7空项目、在该项目中、我测试了教程中的示例代码。 我保留了所有自动参数。 问题是、在链接时未找到 IPC、XDC 和 SYSBIOS 中应用程序调用方法的多个源文件(但编译正常、与 DSP 的通信测试正常)。 我想它来自我的安装参数或我错过的配置。

我尝试从 XDC、IPC 和 PDK 的安装文件夹中添加多个库、但它只是创建了更多未解析的符号。 您是否对我的错误有任何了解?

我将错误的主要部分和 cfg 文件放在下面。 在链接命令中、您可以看到我尝试查找缺少库的文件夹(使用-i"/home/ahonorat/ti/...)。

谢谢

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

构建目标:Sobel-678.out
调用:C6000链接器
"/home/ahonorat/ti/ccsv7/tools/compiler/ti-cgt-c6000_8.1.4/bin/cl6x /home/ahonorat/ti/dsplib_c66x_3_4_0_0/packages/ti/dsplib/lib /home/ahonorat/ti/ccsv7/tools/compiler/ti-cgt-c6000_8.1.4/lib /generated/Core1.obj /generated/Core4.obj /generated/Core7.obj /src/dump.obj /src/memory.obj /src/splitMerge.obj /src/yuvRead.obj -mv6600 -g -define=SOC_C6678 --define=EVM_C6678 --define=use_BIOS --define=device_C6678 --diag_wrap=off --display_error_number --diag_warning=225 -z -m"reeel-6678.map"-i"/home/ahonorat/ti/pdk_c667x_2_0_7/packages/ti/platform/evmc6678l/platform_lib/lib/debug /home/ahonorat/ti/ipc_3_46_02_04/packages/ti/sdo/ipc/lib/ipc/instrumented /home/ahonorat/ti/ccsv7/tools/compiler/ti-cgt-c6000_8.1.4/include /generated/Core2.obj /generated/Core5.obj /src/cache.obj /src/fifo.obj /src/semaphore6678.obj /src/utils.obj -exit_exit_ex-exit.xml"-/home/ahonorat/ti/ti-cgt-c6000_8.1.3/lib -/home/ahonorat/ti/ipc_3_46_02_04/packages/ti/sdo/utils/lib/utils/instrumented -exit_ex-ex-exit.example.exctrines"-"-"-/generated/Core0.obj -"/generated/Core3.obj -exit.line"-"-example"-"/generated/Core6.obj -"/src/communication.obj -exit.line.ex-"-example"-"/src/main.obj -"/src/sobel.obj -line.example"-"/src/yuvDisplay.obj -excove"-"-example.example"-"-"-line"-example"-"-example"-"-exit.line"-example"-"-"-example"-"-example.example.example.example.exe"-example.example"-"  

警告#10247-D:在不使用 SECTIONS 规范的情况下创建输出段".neeardata"
警告#10247-D:在不使用 SECTIONS 规范的情况下创建输出段".rodata"
警告#10247-D:在不使用 SECTIONS 规范的情况下创建输出段".bss"
警告#10247-D:创建不带 SECTIONS 规范的输出段".text"
警告#10247-D:在不使用 SECTIONS 规范的情况下创建输出段".const"
警告#10247-D:在不使用 SECTIONS 规范的情况下创建输出段".fardata"
警告#10247-D:在不使用 SECTIONS 规范的情况下创建输出段".cinit"
警告#10247-D:在不使用 SECTIONS 规范的情况下创建输出段".stack"
警告#10247-D:创建不带 SECTIONS 规范的输出段".far"
警告#10247-D:创建不带 SECTIONS 规范的输出段".switch"
警告#10247-D:在没有 SECTIONS 规范的情况下创建输出段".mySharedMem"
警告#10247-D:在没有 SECTIONS 规范的情况下创建输出段".MSMCSRAM"
警告#10247-D:在不使用 SECTIONS 规范的情况下创建输出段".myInputVideoMem"
警告#10210-D:创建默认大小为0x400的".stack"段;使用-stack 选项更改默认大小

 未定义                       的首次引用       
 符号                                         
 ------                        --------       
 GateMP_Params_init              ./src/semaphore6678.obj
 GateMP_Close                    ./src/semaphore6678.obj
 GateMP_create                   ./src/semaphore6678.obj
 GateMP_DELETE                   ./src/semaphore6678.obj
 GateMP_enter                    ./src/semaphore6678.obj
 GateMP_leave                    ./src/semaphore6678.obj
 GateMP_open                     ./src/semaphore6678.obj
 ipc_start                       ./src/communication.obj
 MultiProc_self                  /src/communication.obj
 notify_registerEvent            /src/communication.obj
 notify_sendEvent                ./src/communication.obj
 TI_SYSBIOS_BIOS_exit__E         ./src/main.obj         
 TI_SYSBIOS_BIOS_start__E        ./src/main.obj         
 TI_SYSBIOS_KNL_Semaphore_create ./src/communication.obj
 TI_SYSBIOS_KNL_Semaphore_Pend__E ./src/communication.obj
 TI_SYSBIOS_KNL_Semaphore_post__E ./src/communication.obj
 xdc_runtime_System_abort__E     ./src/communication.obj
 xdc_runtime_System_printf__E    ./src/dump.obj         
 xdc_runtime_Timestamp_get32__E  ./src/dump.obj         

错误#10234-D:未解析的符号仍然存在
错误#10010:链接过程中遇到错误;未生成"sobre-678.out"

>>编译失败
Makefile: 159 :La recette pour la cible« è re é chel-678.out »a é chou é e
Makefile: 155 :la recette pour la cible« all »a ché ou é e
gmake[1]:***[sobre el-678.out] erreur 1.
gmake:***[全部] erreur 2.

****构建完成****
--------------------------------------------


VAR MultiProc = xdc.useModule('ti.sdo.utils.MultiProc');
VAR 内存= xdc.useModule('xdc.runtime.Memory');

/*
 * 获取构建设备支持的名称列表。
 * 即["CORE0"、"Core1"、"Core..."。]
 *
VAR namelist = MultiProc.getDeviceProcNames ();

/*
 * 由于这是一个单映像示例、因此我们不会(在构建时)生成该示例
 处理器 。  因此、我们提供"null"
 * 作为本地 procName 并允许 IPC 在运行时设置本地 ProcID。
 *
MultiProc.setConfig(null、名称列表);

/*
 * SysStd 系统提供程序是一个用于调试的好工具
 * 但没有最佳性能。 请使用 xdc.runtime.SysMin
 以 获得更好的性能。
 *
VAR 系统  = xdc.useModule('xdc.runtime.System');
VAR SysStd  = xdc.useModule('xdc.runtime.SysStd');
System.SupportProxy = SysStd;
/*在 printf 中支持%f */
System.extendedFormats ="%f%$S";

/*应用中明确使用的模块*/
VAR MessageQ   = xdc.useModule('ti.sdo.ipc.MessageQ');
VAR IPC        = xdc.useModule('ti.sdo.ipc.Ipc');
VAR HeapBufMP  = xdc.useModule('ti.sdo.ipc.heaps.HeapBufMP');
VAR MultiProc  = xdc.useModule('ti.sdo.utils.MultiProc');
VAR Notify = xdc.useModule('ti.sdo.ipc.Notify');
VAR 时间戳= xdc.useModule('xdc.runtime.Timestamp');


/* BIOS/XDC 模块*/
VAR BIOS       = xdc.useModule('ti.sysbios.BIOS');
BIOS.heapSize  = 0x8000;
VAR 任务       = xdc.useModule('ti.sysbios.knl.Task');

var tsk0 = Task.create ('&tsk0_func');
tsk0.instance.name ="tsk0";

/*同步所有处理器(这将在 IPC_START 中完成)*/
Ipc.procSync = IPC.ProcSync_All;

/*共享内存基址和长度*/
VAR SHAREMDE=          0x0C000000;
VAR SHAREDMEMSIZE      = 0x000FFFFC;// 1 MB - 4字节

/*
 * 需要定义共享区域。 IPC 模块使用此功能
 * 以制作可移植指针。 所有处理器都需要添加此内容
 * 使用其共享存储器区域的基址进行调用。
 * 如果处理器无法访问内存,请勿添加。
 *
VAR SharedRegion = xdc.useModule('ti.sdo.ipc.SharedRegion');
SharedRegion.setEntryMeta(0、
   {基地址:SHAREMMEM,
     Len: SHAREDMEMSIZE、
     ownerProId:0、
     IsValid:true、
     名称:"DDR2 RAM"、
   });

/*创建堆*/
/*仅在使用动态分配时取消注释以下行
VAR HeapMemMP = xdc.useModule('ti.sdo.ipc.heaps.HeapMemMP');
SharedRegion.setEntryMeta(1、
   {base:0x8000000、
     Len: 0x10000000、
     ownerProId:0、
     IsValid:true、
     名称:"DDR3"、
     createHeap:true、
   });
   *


/**共享内存部分*/
Program.sectMap[".mySharedMem"]="DDR3";
Program.sectMap[".MSMCSRAM"]="MSMCSRAM";

/**会议部分 DDR3*/
Program.sectMap[".myConstMem"]="DDR3";

Program.sectMap[".myInputVideoMem"]= new Program.SectionSpec ();
Program.sectMap[".myInputVideoMem"].loadSegment ="DDR3";
Program.sectMap[".myInputVideoMem"].type ="NOINIT";

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

    您使用的是哪个示例? 另外、请分享这是哪个 SDK 版本?

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

    您好!

    下面是我的 ti 文件夹的汇总:

    CCS7、BIOS_6_46_05_55、pdk_c667x_2_0_7、ti-cgt-C6000_8.1.3、ctoolslib _2_0_0、 DSPLIB_c66x_3_4_0_0、processor_sdk_rtos_c667x_4_01_00_06、 xdctools_3_50_03_33_core、IPC_3_46_02_04、UIA_2_00_06_52、 xDAIS_7_24_00_04。

    我使用的示例不是来自 TI、但它完全适用于 CCS5。

    此致、

    亚历山大

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

    您是否按照入门指南中的说明设置了 Processor SDK RTOS 环境:
    processors.wiki.ti.com/.../Processor_SDK_RTOS_Getting_Started_Guide

    如果要从头开始创建 SYSBIOS 和 IPC 工程、则需要确保将在工程中使用的 RTSC 产品链接到工程。 例如、右键点击工程并转至 CCS General 选项中的 Build Settings、选择 RTSC 选项卡并确保选择了 BIOS、IPC 和 XDC 工具选项。

    从.cfg 角度来看、我们在 IPC_3_44_01_01\examples\C6678_BIOS_elf 下提供了该器件的 IPC BIOS 使用示例。 您是否提到了该项目中提供的.cfg。

    就在您的构建日志中、它出现了、您的项目未链接到基本产品库。 您能否在文本文件中提供完整日志并将其附加到此处。 这将为我们提供更多的见解、以提供指导。

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

    您好!

    感谢您的回复、我使用 mcsdk 检查了 CCS5中同一项目的二进制文件、在使用 CCS7和 PDK 的安装中、它使用的某些库似乎不存在(库应位于 BIOS 和 xdctools 文件夹中)。 在您提到的 IPC 示例中、我看到我的 cfg 文件中缺少一些类似以下内容的行:

    /*选择 IPC 库*/
    VAR Build = xdc.useModule('ti.sdo.ipc.Build');
    build.libType =(rb? build.LibType_Non检测:build.LibType_Debug);
    build.assertsEnabled =(RB ? false:true);
    build.logsEnabled =(rb? false:true);



    VAR BIOS = xdc.useModule('ti.sysbios.BIOS');
    BIOS.libType =(rb? BIOS.LibType_NonInstrumented : BIOS.LibType_Instrumented;

    当然、这是否意味着 c6678的 BIOS 和 XDC 库与项目同时编译? (因此在安装 PDK 的过程中不提供二进制文件)上述代码行是否足以触发编译这些库? 此外,在哪里可以找到有关.cfg 文件语法和语义的一些详细信息?

    在我的项目配置中、确实选择了 RTSC、BIOS 和 XDC 产品、它们通过环境变量向编译器和链接器选项添加了一些路径。 遗憾的是、这些环境变量、如{XDC_library_path}未设置、并且未引用任何内容。 是否有办法自动设置它们?

    此致、

    亚历山大

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

    查看发行说明: processors.wiki.ti.com/.../Processor_SDK_RTOS_Release_Notes

    您的 XDC 工具版本(3.50.3.33)可能与 SDK 组件不兼容。 您可以尝试使用 SDK 附带的版本(3.2.1.22)吗?

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

    您好!

    我尝试通过修改 C6000编译器 Include 选项中 XDC 目录的直接路径、但它不起作用。

    但是、我尝试删除 cfg 文件并再次添加它、这次 ccs7打开了一个对话框、询问我是否要使用 XDC。 当然、我说"是"、似乎它在我的.cproject 文件中添加了以下行。

    -------------- .cproject

                         
                            
                            
                            
                         
    ---------------------- .cproject

    此自动添加配置中的 XDC 版本不同、但无论如何都正确调用 XDC 工具。 调用 XDC 后,编译仍然无法使用修改的,现在我得到以下错误:

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

    构建文件:./modelPreesm.cfg
    调用:XDCtools
    "/home/ahonorat/ti/xdctools_3_50_03_33_core/xs --xdcpath= xdc.tools.configuro -o configPkg -t ti.targets.elf.c66 -r debug -c "/home/ahonorat/ti/ccsv7/tools/compiler/ti-cgt-c6000_8.1.4 "../modelPreesm.cfg
    正在制作 package.mak (由于 package.bld)...
    正在制作 package.mak (由于 package.bld)...
    subdir_rules.mk:10 :la recette pour la cible« build-477185169-InProc »a é ch é e
    gmake[1] :on quitte le r é pertoire« /home/ahonorat/Documents/logiciels/sources/preesm-tutorials/sobel/org.ietr.preesm.sobel/CodeC6678/Debug »
    subdir_rules.mk:7 :la recette pour la cible« build-477185169 »A é ch é e
    JS:"./config.Bld"、第10行:错误:在路径"/home/ahonorat/ti/xdctools_3_50_03_33_core/packages;..;"上找不到名为"ti.targets.elf.c66"的目标:请检查目标名称的拼写、并检查目标名称是否存在于该路径上。

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

    该文件实际上既不存在于 ti 文件夹中、也不存在于我的工程文件夹中。

    我想这是配置问题、因为在查看发行说明后、我使用的函数没有已知问题。 我敢打赌有两个可能的原因:配置变量缺失或错误(如我在上一篇文章中提到的环境变量)以及 XDC 安装错误。

    此致、

    亚历山大

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

    您可以通过转至 Project Properties -> CCS General -> RTSC 选项卡并从下拉菜单中选择版本来设置 XDC 工具版本。 设置正确的版本后、转到 Project Properties -> CCS Build -> XDCtools -> Package Repositories、并确保列出的路径正确。

    请尝试上述操作、并告知我们您所处的位置。

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

    您好、Sahin、

    我再次尝试在新项目中复制我的所有文件、并选择了您提到的 XDC 版本3.32.2.25。 编译过程需要更多的时间、因此我想它比以前更好、但最后仍然有一些错误 两个变量被称为未定义。 但是、我签入了 include 文件夹、 它们在某些文件中定义得很好。 两个未定义的变量为:

    CSL_C66X_COREPAC_REG_BASE_ADDRESS_REGS

    CSL_DSP_DSP_XMC_CTRL_regs

    此致、

    亚历山大

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

    如果包含头文件、但它仍会提供该错误、则我怀疑您在项目设置中缺少 SOC_C6678预定义符号。 若要添加此内容、请右键点击工程并转至 Properties -> CCS Build -> C6000 Compiler -> Advanced Options -> Predefined Symbols、然后在 Pre-define NAME 下添加 SOC_C6678。

    希望这能解决这个问题。 如果您遇到任何其他问题、请告知我们。

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

    您好、Sahin、

    该编译不适用于 SOC_C6678符号、但适用于 DEVICE_C6678。 有什么想法为什么?

    现在、我将测试代码在器件上的执行情况、如果成功、我将关闭该主题。

    谢谢、

    亚历山大

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

    您好、Alexandre、

    您是对的、您还需要定义 DEVICE_C6678。 通常、您需要同时定义这两者、但您使用的示例可能不需要它。

    如果您的问题已解决、请将该主题标记为已解决、以便我们可以将其关闭。 如果没有、只需在下面发布回复即可。 谢谢!

    最棒的
    Sahin

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

    它显然是有效的,谢谢你萨欣!