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.

[参考译文] 编译器/TMS570LC4357:在引导加载程序中从 SRAM 执行。

Guru**** 2606725 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/752320/compiler-tms570lc4357-executing-from-sram-in-bootloader

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGEN

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

尝试从我在中找到的引导加载程序中生成有用的内容:

https://e2e.ti.com/support/microcontrollers/hercules/f/312/t/735341?Compiler-TMS570LC4357-Boot-loader-LC43x

这将为引导加载程序分配2 MB、这将使其无用。

我计划最初分配48KB、使用闪存0的前3 x 16KB 扇区。

我无法对闪存进行编程并从同一闪存执行代码、因为计划是从闪存开始
并使用 ramfuncs。

我声明要从 RAM 执行的许多函数。:

__attribute__((ramfunc) void f (void){...}

设置编译器以添加开关"--ramfunc=on"

在链接器命令文件中、我设置:

内存{

 (笑声)

   RAMFUNC (rwx):origin=0x08070000 length=0x00010000

 (笑声)

部分{
 (笑声)
   binit align (32):{}                   > FLASH0
   .status align (32):{__APP_STATUS_ADDRESS =.;}>         STATUS
   .app   align (32):{__APP_START_ADDRESS =.;}>         APP0 | APP1
   .TI.ramfunc align (32):{}load=FLASH0,run=RAMFUNC,table (BINIT)  
 (笑声)

在映射文件中、我会得到.TI.ramfunc 段

*         0   00000040   00006470    运行 ADDR = 08070000
                 00000040   00000af0    hL_sci.obj (.TI.ramfunc)
           (笑声)
我还会得到一个包含复制表的.binit 段

binit    0   00007c40   00000010     
                 00007c40   00000010    (.binit)

链接器生成的复制表

_TI_cinit_table @ 00007c30记录:2、大小/记录:8、表大小:16
   .data:load addr=00007c00、load size=00000015字节、run addr=08001500、run size=00000431字节、compression=lzss
   .bss:load addr=00007c28、load size=00000008字节、run addr=08001940、run size=000000c8字节、compression=zero_init
binit @ 00007c40记录:1、大小/记录:12、表大小:16
   .TI.ramfunc:load addr=00000040、load size=00006470、run addr=08070000、run size=00006470、compression=none

我可以看到 ramfunc 符号是在 RAM 中定义的

08070000 sciInit                             
080701d4 sciSetFunctional                    
080701f4 sciSetBudrate                      
08070290 sciIsTxReady                        

有几个问题:

  • 从闪存将 ramfuncs 复制到 SRAM 的什么位置?
    • 我是否需要在应用程序中进行复制?
  • 编译器能否生成调用 F021_API_CortexR4*.lib 的代码?
    • 如果是、我如何确保所有这些 F021代码都从 SRAM 运行?
  • 引导加载程序使用 RTI、但 RTI 代码和所有其他 HALCoGen 生成的代码不应从闪存运行。
    • 应该可以在 HALCoGen 中指定中断处理程序是 RAMFUNC
    • 是否有一个示例、可以在其中替换 VIM 中的中断处理程序?

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

    1、ramfuncs 将自动复制到 SRAM 中。 您无需在应用程序中复制。
    2.我不理解这个问题。 我认为编译器无法生成代码来调用 F021 API。
    HALCoGen 不包含此功能。 我们必须在 ISR 之前手动添加__attribute__(((ramfunc))或#pragma CODE_SECTION (func、".TI.ramfunc")。 然后将".TI.ramfunc align (32):{}load=FLASH0、run=RAMFUNC、table (BINIT)"添加到 CMD 文件中。

    我没有将 ISR 放置到 SRAM 的示例代码。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我仍然想知道哪个子例程包含将 RAMFUNC 复制到 RAM 的代码?

    我找到了"copy_in"例程、这是在 "main"中调用一些示例、用于将数据复制到 RAM 中。

    如果我对项目执行 grep 操作、除了实际的 copy_in 例程之外、我找不到并引用。

    我还会搜索在您使用 RAMFUNCs 时自动定义的__binIT__符号。

    我没有看到任何内容正在使用__binIT__。

    因此、我重复一个问题:

    • 将 RAMFUNC 复制到 RAM 的代码在哪里?
      我想全面了解这是如何工作的。
    • 好的、有一个小研究表明这可能是在"_TI_auto_init"内完成的。
      它不存在于项目中、但位于"rtsv7R4_T_be_v3D16_eabi.lib"内
      它位于 CCS 目录结构内。

    ===================

    好的、即使编译器不生成对 F021库的调用、 引导加载程序也会生成。

    我正在使用您编写的 TMS570LC4375引导加载程序。

    这将 F021库称为闪存编程的核心功能。

    我不认为这位于闪存中是好的。

    • 如何设置链接器以便将 F021库链接到 RAM?
    • 或者、是否提供 F021源代码?

    ===================

    当我指出 HALCoGen 不支持 RAMFUNC 时、
    我希望您向负责 HALCoGen 的团队提供反馈、
    这是他们应该考虑的功能。

    • 请将此想法提供给 HALCoGen 团队。

    ===================

    HALCoGen 生成的代码通常不支持函数之间的用户代码。
    这意味着在这些函数之前添加"__attribute__(ramfunc))"
    通常是不可能的。

    中断功能可能不同。 我生成了 RTI 中断0和1、然后
    能够在每个中断例程之间和之后添加用户代码、
    我认为这已经解决了。 我认为应该可以在每个 HALCoGen 生成的函数前后添加代码。

    • 请与 HALCoGen 团队讨论函数之间的用户代码。

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

    您好 Ulf、

    您要查找的文件位于 C:\ti\ccsv8\tools\compiler\ti-cgt-arm_18.1.LTS \lib\src\autocinit.c 中 有一个函数 Auto_init(),在 autoinit.h 文件中,您可以为#define AUTO_init __TI_auto_init 提供资金。

    我们没有 F021源代码。  

    我会将您的建议转发给 HALCoGen 团队。 谢谢

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

    .TI.ramfunc align (32):{./lib/F021_API_CortexR4_BE_L2FMC.lib (.text)} load=FLASH0,run=RAMFUNC,table (BINIT)

    这将把 F021库的".text"段放入 SRAM 中、这有望就足够了。

    当然、一切都需要进行测试。