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.

[参考译文] TMS320F28379D:用于 API 闪存写入库的.TI.ramfunc

Guru**** 2465890 points
Other Parts Discussed in Thread: SYSCONFIG, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1520192/tms320f28379d-ti-ramfunc-for-api-flash-writing-library

部件号:TMS320F28379D
Thread 中讨论的其他器件:SysConfigC2000WARE

工具/软件:

您好:

我使用 F021_API 在闪存中写入数据。

我创建的用户函数必须在 RAM 中写入并执行。

我预计将复制表放置在 BINIT 段就足以将该函数从闪存复制到 RAM、因为 c_int00 会调用调用调用 copy_in 的_TI_auto_init

这就是这个论坛上有人向我解释的关于 CLA 的内容。

但是、尝试编译我的函数时、链接器会询问我符号 RamfuncsLoadStart、...

为什么 BINT 表是不够的?

此外、如果我要求 SysConfig 使 cmd 文件生成这个符号、我会看到生成的符号不正确:  

因此、我必须自行要求正确的符号:

为什么 SysConfig 无法生成正确的符号?

感谢你的帮助。

Vincent

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

    尊敬的 Vincent:

    我最近在尝试使用 BINIT 表自动加载存储器段时遇到了类似的问题。 在我的示例中、BINIT 有效—但在代码中的其他地方、memcpy()需要手动调用才能使用您需要的链接器符号。

    以下是使链接器期望使用这些符号的代码示例:

    #ifdef _FLASH
    #ifndef CMDTOOL
        //
        // Copy time critical code and flash setup code to RAM. This includes the
        // following functions: InitFlash();
        //
        // The RamfuncsLoadStart, RamfuncsLoadSize, and RamfuncsRunStart symbols
        // are created by the linker. Refer to the device .cmd file.
        //
        memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
    #endif
        //
        // Call Flash Initialization to setup flash waitstates. This function must
        // reside in RAM.
        //
        Flash_initModule(FLASH0CTRL_BASE, FLASH0ECC_BASE, DEVICE_FLASH_WAITSTATES);
    #endif


    此调用可能是链接器抱怨的原因 — 它要求在链接器命令文件中定义这些符号。 memcpy

    如果您使用的是 SysConfig、请检查该.genlibs文件。 --define=CMDTOOL传递后、#ifndef CMDTOOL会跳过该块、而memcpy不执行、这意味着不需要这些符号。

    希望这有助于澄清事情!

    此致、
    Sebastian

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

    Sebastian 您好:

    感谢您的评分 人很好。

    我非常熟悉 CMDTOOL 符号、因为我在 CLA 上工作。 就像在 CLA 中一样、在 device_cmd.cmd.genlibs 中定义了 CMDTOOL

    因此、会跳过任何受此符号不存在影响的代码。

    例如、CLA 跳过的代码为:

    实际上需要跳过此代码、因为 BINIT 表会在 main 函数之前将从闪存复制到 RAM。

    但在这里:

    -虽然 BINT 表是定义的,编译器要求这些符号(但可能符号不是用于复制,而是用于其他)

    -符号不是由 SysConfig 定义的符号

    -我没有找到使用这些符号的函数。 在编译器返回错误之前、我怎么可能知道我必须定义它们?

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

    尊敬的 Vincent:

    感谢您提出这个问题、让我在内部进行讨论、明天我会回来联系您。

    此致、

    Skyler

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

    你好。 感谢您的评分

    等待您的消息、我进行了一些测试:

    1) 解析器似乎无法识别符号 CMDTOOL、但它确实存在

    我在 去汇编代码中进行了检查:不调用 device_int () 函数中的 memcpy

    2) 在闪存中编写的代码被复制到内存中的 main () 函数之前,当然要归功于 BINT 表

    3) 实际上,符号 RamfuncsLoadStart,...在 InitSysctrl() 函数中对 memcpy 的其他调用是有用的:

    CMDTOOL 存在不会取消此副本。

    因此、闪存代码在 RAM 中复制了两次。 为什么?

    用户必须定义正确的符号,因为由 sysconfig 定义的符号(由 cmd 文件,实际上是由 sysconfig 生成的)不是好的: loadStart_ramfunc 而不是 RamfuncsLoadStart 等...

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

    编辑:实际上 不调用 InitSysCtrl()、而是定义 jsut、它使用必须定义的符号。 因此、我们对符号进行定义是为了使编译正常。 我必须说、我不知道为什么我的工程中包含 F2837xD/sysctrl.c(我刚刚从 TI 示例开始)

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

    尊敬的 Vincent:

    1) 解析器似乎无法识别符号 CMDTOOL、但它确实存在

    我认为符号在 定义时不存在问题。

    我从文件夹结构中看到、您有另一个 cmd 文件链接到工程。

    您当前面临的问题是什么?  

    是否可以压缩项目并进行共享、以便我们进行分析?

    谢谢

    Aswin

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

    您好、Aswin、

    感谢您向我请求我的项目存档。 你可以在附件中找到它。

    我从您的文件夹结构中看到您有另一个 cmd 文件链接到项目

    唯一处于活动状态的 CMD 文件是以下文件:

    您当前面临的问题是什么?  [/报价]

    我认为最后一个问题是、我被迫在此文件中声明符号、只是因为符号用于定义的函数 InitSysCtrl (void)(在 F2837xD/sysctrl.c 中):

    但似乎从未调用该函数。

    我认为符号 定义时不存在问题。

    在 device.c 中、不会执行以下行:

    此复制在 TI_auto_init 中完成、因为二进制表中描述了必须在 RAM 中执行的代码

    我在代码中的其他位置放置一个“ifdef",“,ti、ti 检查 CMDTOOL 是否定义、如下所示:

    e2e.ti.com/.../2025_5F00_06_5F00_23_5F00_TISupport.zip

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

    尊敬的 Vincent:  

    对不起晚回复,我是 OOO 三个星期.

    我已经完成了工程、但我看到您的 syscfg 文件中添加了 cmd 选项、那么您是否使用该工具或外部工具生成的 cmd 文件?

    如果您使用的是扩展、请从 syscfg 中禁用 cmd 选项。 如果启用 cmd 选项、则 会定义 CMDTOOL 宏、进而跳过执行 memcpy 函数。

    另外、如果您使用的是位域、我建议您使用 InitSysCtrl 函数而不是 Device_init 函数。

    请查看 LED 闪烁示例(Driverlib、非 syscfg 一个)- C2000Ware\driverlib\f2837xd\examples\cpu1\led  

    GPIO 切换示例 (Bitfield、non syscfg one)- C2000Ware\device_support\f2837xd\examples\cpu1\gpio_toggle\cpu01

    谢谢

    Aswin