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.

[参考译文] RTOS/TMS320F28075:链接器错误:#10008-D 找不到文件

Guru**** 2589300 points
Other Parts Discussed in Thread: SYSBIOS, TMS320F28335, TMS320F28075

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/588319/rtos-tms320f28075-linker-error-10008-d-cannot-find-file

器件型号:TMS320F28075
主题中讨论的其他器件:SYSBIOSTMS320F28335

工具/软件:TI-RTOS

您好!

我正在使用 SYS/BIOS 开发一个项目、并且在文件 project.cmd 中具有以下链接器指令:

   FwFlash                :fill = 0h > FLASH_FW、            page = 0、align (4)
   {
       file1.obj (.text)
       file2.obj (.text)
       file3.obj (.text)
            
       BIOS.obj (.text)
   }
      
file1.obj、file2.obj 和 file3.obj 是 file1.c、file2.c 和 file3.c 编译的结果、而 BIOS.obj 是一个 SYS/BIOS 文件。

file1.obj、file2.obj 和 file3.obj 自动位于"project\Debug\Source"目录中、而 BIOS.obj 自动位于"project\src\SysBIOS"目录中。

问题是链接过程失败、出现错误"#10008-D cannot find file 'BIOS.obj"。

是否有解决此错误的提示?

谢谢、

演示

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

    您无需在链接器文件 j 中包含 BIOS.ob。 内核库由生成的链接器文件(Debug\configPkg\linker.cmd)引入。 例如、在我有的工程中、该文件中包含以下内容

    l"C:\workspace\rov2\task_TMS320F28335\Debug\configPkg\package\ccfg\mutex_p28fp.o28fp"
    -l:C:\workspace\rov2\task_TMS320F28335\src\SysBIOS\SysBIOS.a28fp"
    -l"C:\ti\BIOS_6_50_01_12\packages/ti\catalog\c2800\init\lib\Boot.a28fp"
    -l"C:\ti\BIOS_6_50_01_12\packages/ti\targets\rts2800\lib\ti.targets.rts2800.a28fp"
    -l"C:\ti\BIOS_6_50_01_12\packages/ti\targets\rts2800\lib\boot.a28fp"

    快速完整性检查...在您的项目上、项目的文件夹图标上有一个"RTSC"、对吧?

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

    您好、Todd、

    感谢您的回答。

    首先、我确认我的项目的文件夹图标上有一个小"RTSC"、所以我认为项目是可以的。

    然后、我添加了使用默认链接器文件 TMS320F28075.cmd 的链接过程正确结束并且软件工作正常。

    在项目的 Debug\configPkg\linker.cmd 中、有以下行:

    -l"C:\job\cp4pwm\Debug\configPkg\package\ccfg\app_p28fp.o28fp"
    -l"C:\ti\UIA_2_00_06_52\packages/ti\UIA\SYSBIOS\lib\release\ti.UIA.SysBIOS.a28fp"
    -l"C:\ti\UIA_2_00_06_52\packages/ti\UIA\loggers\lib\release\ti.UIA.loggers.a28fp"
    -l"C:\job\Cp4pwm\src\SysBIOS\SysBIOS.a28fp"
    -l"C:\ti\BIOS_6_46_01_38\packages/ti\catalog\c2800\init\lib\Boot.a28fp"
    l"C:\ti\UIA_2_00_06_52\packages/ti\UIA\Runtime\lib\release\ti.uia.runtime.a28FP"
    -l"C:\ti\UIA_2_00_06_52\packages/ti\UIA\Events\lib\release\ti.UIA.events.a28fp"
    -l"C:\ti\BIOS_6_46_01_38\packages/ti\targets\rts2800\lib\ti.targets.rts2800.a28fp"
    -l"C:\ti\BIOS_6_46_01_38\packages/ti\targets\rts2800\lib\boot.a28fp"
    -l"C:\ti\BIOS_6_46_01_38\packages/ti\catalog\c2800\initF2837x\lib\Boot.a28fp"

    但是、由我的文件生成的代码(file1.c、file2.c 等)和由 SYS/BIOS 文件生成的代码(BIOS.obj、c28_Hwi_asm.obj 等)都被放置在同一个闪存扇区中。

    现在、在相反的情况下、我想将其中的一些放在不同的扇区中、例如:

     FwFlash                :fill = 0h > FLASH_FW、            page = 0、align (4)
       {
           file1.obj (.text)
           file2.obj (.text)
           file3.obj (.text)
                
           BIOS.obj (.text)
       }

     FwFlash1               :fill = 0h > FLASH_FW1、            page = 0、align (4)
       {
           C28_Hwi_asm.obj (.text)
           C28_Hwi_disp_asm.obj (.text)
           C28_IntrinsicsSupport_asm.obj (.text)
       }

    但这些指令不起作用。

    是否有任何权变措施将 SYS/BIOS 代码置于我想要的扇区中?

    谢谢、

    演示

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

    您可以显式放置项目(通配符也起作用)。 例如(我将闪存拆分为闪存和 FLASH2)

    .text:_ti_sysbios_family_c28_Hwi_*:> FLASH2 PAGE = 0
    .text:>闪存页= 0

    可能有一种切片器方法可以将整个 obj 发送到某个位置、但我们需要与编译器人员核实这一点。 我将要求其中一个成员在这个线程上蜂鸣。

    Todd

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

    我对如何更好地控制来自库的输入段提出了一些建议、并将其定向到特定的存储器范围。

    为了让我的建议有意义、您需要一些背景知识。  请阅读有关  输入段和输出段的 Wiki 文章链接器命令文件入门的第一部分。

    您还需要熟悉如何从 SYSBIOS.a64FP 等库命名输入段 。  为此、请参阅 《C28x 汇编语言工具手册》中标题为"将库或存档成员指定为输入到输出"部分。  

    我以 SYSBIOS.a64FP 库为例。  您在这些示例中看到的示例可能与您拥有的示例不同。

    要查看库中的文件,请使用带有选项-t...的库归档器命令。

    $ AR2000 -t SYSBIOS.a28FP
    
    尺码日期 文件名
    ---------------------------------------------------- -------------- --------
    691945 Mon Sep 19 07:37:51 2016 manifl_ti.sysbios.family.c28.Hwi_config_lib.obj
    11317 Mon 9月19日07:37:45 2016 family_c28_Hwi_asm_lib.obj
    11617 Mon 9月19日07:37:45 2016 family_c28_Hwi_disp_asm_lib.obj
    1832年9月19日07:37:45 2016 family_c28_IntrinsicsSupport_ASM_lib.obj
    3031 Mon 9月19日07:37:46 2016 family_c28_TaskSupport_ASM_lib.obj 

    基于此,您可以创建一个输出段,如下所示...

    SysBIOS_text
    {
    --library=SysBIOS.a28FP (.text)
    }> FLASH2 page=0 

    您可以通过目标文件显示实用程序 ofd2000在库中看到输入段的名称,如下所示...

    $ ofd2000 -v --obj_display=none、sections sysbios.a28fp | grep text
    <2>".text"
    <6>".text:_ti_sysbios_KNL_Task_yield __E__man翻转__"
    <7>".text:_ti_sysBIOS_KNL_Task_unlockSted_E__E__man翻转__"
    <8>".text:_ti_sysbios_KNL_Task_unball_e_e_e_e_e_e_man翻转__"
    <9>".text:_ti_sysbios_KNL_Task_unblocki__E__man翻转__"
    <10>".text:_ti_sysbios_KNL_Task_stat_E__man翻转___"
    <11>".text:_ti_sysbios_KNL_Task_startup_E___man翻转__"...
    等等...
    

    使用此信息,您可能决定利用输入段名称中的模式...

    SysBIOS_text
    {
    *(.text:_ti_SysBIOS_KNL_Task_*)
    *(.text:_ti_SysBIOS_KNL_Swi_*)
    //以此类推
    }> FLASH2 page=0 

    对于任何一个库、请使用一种技术或另一种技术。  在同一个库中同时使用这两个库会很快变得令人困惑。

    谢谢、此致、

    乔治

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

    我将在接下来的几天内回答这个问题。

    谢谢、祝您复活节快乐。