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/TMS320F28377S:将闪存 API 库链接到 SYSBIOS 应用

Guru**** 2036780 points
Other Parts Discussed in Thread: TMS320F28377S, SYSBIOS, CONTROLSUITE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/581529/rtos-tms320f28377s-linking-the-flash-api-library-to-a-sysbios-application

器件型号:TMS320F28377S
Thread 中讨论的其他器件: SYSBIOScontrolSUITE

工具/软件:TI-RTOS

我正在尝试将闪存 API 库链接到我的应用、以访问闪存(F021_API_F2837xD_FPU32.lib)。

这 是命令文件的 SECTIONS 部分的摘录

Flash28_API:

-lF021_API_F2837xD_FPU32.lib<*。obj>(.text)

负载= FLASHD、

运行= D01SARAM、

load_start (_gFlash28ApiLoadStart)、

load_end (_gFlash28ApiLoadEnd)、

run_start (_gFlash28ApiRunStart)、

PAGE = 0

我收到以下警告"../TMS320F28377S_NO_APPL.cmd"、第116行:警告#10068-D:无匹配部分

第116行对应于指定加载库的行。

最终结果是库不会链接。

我曾在其他论坛上尝试过一些建议,但似乎没有一个可行。

       许多人建议对-load 库行 none 使用不同的语法、这会有所不同

       指定了链接顺序、因此先使用应用程序链接器命令文件、然后再使用其他文件。

       使用 了不同的段 (ramfuncs)而不是 Flash_API)

我阅读了其他文章(几年前以及旧版本的工具和不同的 f28xxx 处理器)

      CCS 中有一个错误、如果为 运行时库支持指定了自动、您可能会收到他的警告。

      由于矢量表顶部加载的常量数据和 BIOS 自动生成链接器命令文件的问题、无法加载闪存 API

我已经在多个早期版本的 SYSBIOS 和多个处理器上执行了此操作。

在 F28377S 上、我尝试的操作是否不再可行?

注:

在开始之前、我为 F28377S   FLASH_programming_CPU1_FLASH 构建了示例闪存应用

我能够构建并链接应用 程序、在地图中、我可以看到闪存库的加载位置。

以下是工具等的一些版本信息

SYSBIOS 版本6.42.3.35

CCS 版本6.1.1

f28377S 的控制套件器件支持版本为170 -请注意、此处指定的闪存 API 适用于 D

谢谢

Maury

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Maury:
    您是否可以附加您的 CCS 工程以便我尝试重现此情况? 如有必要、您可以将其缩小。
    谢谢、
    Janet
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Janet、

    我一直在努力处理语法和 NO 段错误、这会很好。

    我附加了一个 zip 文件、其中包含整个工程、因为它比尝试将其缩减更简单。

    您可能唯一需要做的就是进入应用程序链接器命令文件、并注释掉 闪存和 RAM 部分中外部 RAM 的使用。

    此外、在以下部分设置中添加注释以获取错误。

    请注意、此时我知道我没有将此代码(Flash28_API)复制到要执行的 RAM 中、并且不确定我是否定义了足够的空间(闪存或 RAM) 但我不能错过它将尝试并链接它的点、这样我就可以确定我是否需要扩展这些内容。 我了解如何做到这一点。

    /*

    Flash28_API:

    -lF021_API_F2837xD_FPU32.lib<*。obj>(.text)

    负载= FLASHD、

    运行= D01SARAM、

    load_start (_gFlash28ApiLoadStart)、

    load_end (_gFlash28ApiLoadEnd)、

    run_start (_gFlash28ApiRunStart)、

    PAGE = 0

    *

    如果您需要有关我在项目属性中尝试、完成或更改的内容的更多信息

    谢谢

    Maury

    e2e.ti.com/.../8637.TI-test-Source.zip

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

    尊敬的 Maury:

    我能够使用 TMS320F28377S_NO_APPL.cmd 链接器命令文件在您的工程中重现此警告。  我无法解决您项目中的问题、因此我尝试在更小、更简单的情况下重现问题。  我从 controlSUITE flash_programming_cpu01示例开始、链接器命令文件中 F021_API_F2837xD_FPU32.lib 库中的链接与您的操作非常相似:

       组
       {
           ramfuncs
           {-l F021_API_F2837xD_FPU32.lib}
        
       }负载= FLASHD,
         运行 = RAMLS03、
         load_start (_RamfuncsLoadStart)、
         load_size (_RamfuncsLoadSize)、
         load_end (_RamfuncsLoadEnd)、
         run_start (_RamfuncsRunStart)、
         run_size (_RamfuncsRunSize)、
         run_end (_RamfuncsRunEnd)、
         PAGE = 0

    此示例构建时没有任何问题。  然后、我采用了一个简单的 BIOS 程序、并将闪存编程示例合并到其中。  这也是毫无问题地构建的。  我仍然不知道您的程序有什么问题、需要更多的时间来研究。  我正在连接我的 BIOS 闪存项目、以便您可以与您的项目进行比较。

    e2e.ti.com/.../8272.flash_5F00_TMS320F28377S.zip.txt

    此致、

    Janet

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Janet、
    感谢您连接可正常工作的 BIOS 项目。 我也会看一下配置有何差异。
    我最初使用的是加载闪存库的同一组命令、但同样的问题是库未链接、因此我将其移至另一个闪存 API 部分、希望获得更多信息。 我这么做的映射将该段显示为未初始化。
    请注意、在我发送给您的代码中、对闪存库的调用会进行注释、我现在知道、如果未使用、可能会使链接器不会链接库、但如果我在中注释这些调用、我会得到未解析的外部变量。
    要在 unloadd.cpp FlashApiInit()中获取未解析的值,请将 #if 0更改为 #if 1
    感谢你的帮助
    Maury
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Janet、
    感谢您的帮助、它引导我了解解决方案的方向。
    事实上、闪存 API 库的头文件 f021.h 不包含 C++结构
    #ifdef __cplusplus
    extern "C"{
    #endif
    所有函数都是看不见的、因此库没有被调用、因此没有链接。
    当我向函数添加调用时、由于 C++名称改编、这些调用未解析。
    Maury
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Janet、
    但是、在查看您的示例 BIOS 应用程序后、我有另一个问题。
    这涉及 SysBIOS 在加电时执行的所有初始化操作。
    我看到您已注释掉了对 SysCtrlInit()和 ramfuncs 的 memcpy 的调用。
    是否有一个文档描述了 SYSBIOS 完成的所有初始化、以及我想要修改或添加更多操作到该初始化中需要执行的操作?
    您能否告诉我启动的源代码在哪里? 它以前是 c_init00.c
    谢谢
    Maury
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Maury:

    我很高兴您发现了这个问题。  在转换为 C++并将 UnloadApp.cpp 文件添加到其中后、我刚刚构建了我的示例闪存项目。

    我确实必须在包含头文件的周围添加#ifdef __cplulplus。  我还必须将 main.cpp 中的 pragma (从 hello.c 重命名)更改为:

    #if 已定义(_cplusplus)
    #pragma CODE_SECTION ("ramfuncs")
    其他
    #pragma CODE_SECTION (example_CallFlashAPI、"ramfuncs");
    #endif

    与其他 pragma 类似。

    此致、

    Janet

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

    尊敬的 Maury:

    查看 SysCtrlInit()的代码,我似乎不应该将该函数包含在#if 0块中。  我想在 main()中排除的是用于初始化中断矢量表的代码,因为所有这些都是由 BIOS 处理的。

    注释出的 memcpy()行来自原始示例。   如果 F2837xS_SYSCTRL.c 是使用-D_FLASH 编译的、则看起来这在 InitSysCtrl()中是处理的。  InitSysCtrl()也在#ifdef _flash 块内调用 InitFlash_BANK0()。  因此需要调用 memcpy(),我想您可以选择在哪里执行它。

    BIOS 引导代码定义了_c_int00。  您可以在中找到它 /packages/ti/targets/rts2800/boot_cg.asm.  您还可以在"SYS/BIOS 启动序列"一节中查看 SYS/BIOS 用户指南、以查看在进入 main()之前完成的所有操作。

    此致、

    Janet