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.

[参考译文] TMS320F280039C:有关 FPUmathTables 默认加载行为的问题部分

Guru**** 2989100 points

Other Parts Discussed in Thread: TMS320F280039C, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1665223/tms320f280039c-questions-about-the-default-loading-behavior-of-fpumathtables-section

器件型号: TMS320F280039C
主题: C2000WARE 中讨论的其他器件

尊敬的 TI 专家:

我 rts2800_fpu32_fast_supplement.lib 在 TMS320F280039C 上使用 expf (),对该 FPUmathTables 段的行为有一些疑问。

我观察到的情况

在我的工程中、CMD 文件   FPUmathTables 根本没有配置该段、并且我没有添加任何手动复制代码。 然而,在调试期间,我发现数学表似乎自动从 ROM 复制到 BOOT_RSVD  0x000002RAM 中的区域(周围)。

我的问题

1:此自动复制是否由 引导 ROM 本身执行? 还是由链接器/启动代码完成? 是什么触发了这种行为?

2:当 CMD 文件 根本没有配置时  FPUmathTables,链接器的默认处理逻辑是什么?

3:我也收到了链接器警告(请参阅下面的详细信息)。 如何正确消除它

MEMORY
{
   BEGIN            : origin = 0x00090000, length = 0x00000002
   BOOT_RSVD        : origin = 0x00000002, length = 0x00000126

   RAMM0            : origin = 0x00000128, length = 0x000006D0
//   RAMM0            : origin = 0x00000128, length = 0x000002D8
//   RAMM1            : origin = 0x00000400, length = 0x000003F8
   // RAMM1_RSVD       : origin = 0x000007F8, length = 0x00000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */

   RAMLS_CLAprog   	: origin = 0x00008000, length = 0x00002000
   RAMLS4567      	: origin = 0x0000A000, length = 0x00002000

   RAMGS012       	: origin = 0x0000C000, length = 0x00003000
//   RAMGS1           : origin = 0x0000D000, length = 0x00001000
//   RAMGS2           : origin = 0x0000E000, length = 0x00001000
   RAMGS3           : origin = 0x0000F000, length = 0x00000F60
   // RAMGS3_RSVD      : origin = 0x0000FFF8, length = 0x00000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */

   BOOTROM          : origin = 0x003F8000, length = 0x00007FC0
   SECURE_ROM       : origin = 0x003F2000, length = 0x00006000

   RESET            : origin = 0x003FFFC0, length = 0x00000002

   /* Flash sectors */
   //FLASH_BANK0     : origin = 0x080000, length = 0x10000			//BOOTLOADER AND DATA_STORAGE
   FLASH_BANK1     		: origin = 0x090002, length = 0x0FFDE			//CODE
   //FLASH_BANK2     : origin = 0x0A0000, length = 0x10000			//PROGRAM_BACKUP

   CLA1_MSGRAMLOW   : origin = 0x001480, length = 0x000080
   CLA1_MSGRAMHIGH  : origin = 0x001500, length = 0x000080

   DMA_CPUData_FSIRX	: origin = 0x0000FF60, length = 0x00000020
   DMA_CPUData1	    : origin = 0x0000FF80, length = 0x00000020
   DMA_CPUData2	    : origin = 0x0000FFA0, length = 0x00000020
   DMA_CPUData3	    : origin = 0x0000FFC0, length = 0x00000020
   DMA_CPUData4	    : origin = 0x0000FFE0, length = 0x00000020

   CLA2_MSGRAMLOW   : origin = 0x001680, length = 0x000080
//   CLA2_MSGRAMHIGH  : origin = 0x001700, length = 0x000080
   DMA_Data1	    : origin = 0x001700, length = 0x000020
   DMA_Data2	    : origin = 0x001720, length = 0x000020
   DMA_Data3	    : origin = 0x001740, length = 0x000020
   DMA_Data4	    : origin = 0x001760, length = 0x000020
}


SECTIONS
{
   .cinit           : > FLASH_BANK1, ALIGN(4)
   .text            : >>FLASH_BANK1, ALIGN(4)
   codestart        : > BEGIN, ALIGN(4)

   .stack           : > RAMM0
   .switch          : > FLASH_BANK1, ALIGN(4)

   .init_array      : > FLASH_BANK1,       ALIGN(4)
   .bss             : > RAMLS4567
   .bss:output      : > RAMLS4567
   .bss:cio         : > RAMLS4567
   .data            : > RAMLS4567
   .sysmem          : > RAMLS4567
   .const           : > FLASH_BANK1       ALIGN(4)
   .ebss            : > RAMLS4567
   ramgs           	: > RAMGS3

   .reset           : > RESET,          TYPE = DSECT /* not used, */

   dclfuncs         : > FLASH_BANK1,     ALIGN(4)


    /* CLA specific sections */
    Cla1Prog        : LOAD = FLASH_BANK1,
                      RUN = RAMLS_CLAprog,
                      LOAD_START(Cla1ProgLoadStart),
                      RUN_START(Cla1ProgRunStart),
                      LOAD_SIZE(Cla1ProgLoadSize),
                      ALIGN(4)

   //
   //Load tables to Flash and copy over to RAM
   //
   CLA1mathTables    :  LOAD = FLASH_BANK1,
                        RUN = RAMLS4567,
                        RUN_START(CLA1mathTablesRunStart),
                        LOAD_START(CLA1mathTablesLoadStart),
                        LOAD_SIZE(CLA1mathTablesLoadSize),
                      	ALIGN(4)

   	DMA_CPUData_FSIRXFile : > DMA_CPUData_FSIRX
   	DMA_CPUData1File : > DMA_CPUData1
	DMA_CPUData2File : > DMA_CPUData2
	DMA_CPUData3File : > DMA_CPUData3
	DMA_CPUData4File : > DMA_CPUData4

    Cla1ToCpuMsgRAM  : > CLA1_MSGRAMLOW
    CpuToCla1MsgRAM  : > CLA1_MSGRAMHIGH

    Cla1ToDMAMsgRAM  : > CLA2_MSGRAMLOW
//    DmaToCla1MsgRAM  : > CLA2_MSGRAMHIGH
	DMA_Data1File	 : > DMA_Data1
	DMA_Data2File	 : > DMA_Data2
	DMA_Data3File	 : > DMA_Data3
	DMA_Data4File	 : > DMA_Data4

   GROUP
   {
       .TI.ramfunc
//       { -l UserFunc_LLC.obj(.text)}
//       { -l Com_FSI.obj(.text)}
//       { -l Lib_LLC.obj(.text)}
//       { -l Serial_SCI.obj(.text)}
//       { -l DataStorage_Flash_API.obj(.text)}
//       { -l FAPI_F28003x_EABI_v1.58.10.lib}
       { -l UserFunc_PMSM.obj(.text)}
       { -l Lib_3PPWM.obj(.text)}
       { -l Lib_PMSM_FOC.obj(.text)}
   }             	  LOAD = FLASH_BANK1,
                      RUN = RAMGS012
                      LOAD_START(RamfuncsLoadStart),
                      LOAD_SIZE(RamfuncsLoadSize),
                      LOAD_END(RamfuncsLoadEnd),
                      RUN_START(RamfuncsRunStart),
                      RUN_SIZE(RamfuncsRunSize),
                      RUN_END(RamfuncsRunEnd),
                      ALIGN(4)

   .TI.ramconsts	: LOAD = FLASH_BANK1
   					  RUN = RAMLS4567
               		  RUN_START(Ramconsts_runstart),
               		  LOAD_START(Ramconsts_loadstart),
              		  LOAD_SIZE(Ramconsts_loadsize)

   .scratchpad      : > RAMLS4567
   .bss_cla         : > RAMLS4567

   Cla1DataRam      : > RAMLS4567
   cla_shared       : > RAMLS4567
   CLADataLS1       : > RAMLS4567

   .const_cla      : LOAD = FLASH_BANK1,
                      RUN = RAMLS4567,
                      RUN_START(Cla1ConstRunStart),
                      LOAD_START(Cla1ConstLoadStart),
                      LOAD_SIZE(Cla1ConstLoadSize),
                      ALIGN(4)
}

/*
//===========================================================================
// End of file.
//===========================================================================
*/
<Linking>
"../28003x_cla_flash_lnk.cmd", line 147: warning #10423-D: No placement specified for "FPUmathTables"; a default placement will be applied.
Finished building target: "test.out"

你能否澄清机制? 谢谢!  

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

    尊敬的 YuanZe:

    您是否参考了 C2000Ware SDK 的特定示例/从该示例开始? 如果是、请您说明一下路径。

    谢谢、

    IRA

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

    您好、

    我附上了该工程 Test_Fast_Supplement_expf.zip 供您参考。 在这个项目中、CMD 文件没有显式配置 FPUmathTables、我看到的是自动复制到 BOOT_RSVD 以及链接器警告。

    您能看一下、帮助澄清默认行为吗?

    谢谢、
    元泽

    e2e.ti.com/.../Test_5F00_Fast_5F00_Supplement_5F00_expf.zip

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

    尊敬的 YuanZe:

    感谢您的耐心等待。 我完成了您的项目、看到了以下观察结果

    1. flash_lnk cmd 文件不配置任何存储器位置以包含 FPUMathTables

    2.在.map 文件中,我可以看到 FPUMathTables 放置在 0x00000002 并且长度为 0xbe ,因此它位于 BOOT_RSVD 段中

    3.我收到一个警告,说 警告#10247-D:创建输出节“FPUmathTables “没有一个节规范

      当从‑μ s‑库上拉任何 C28 浮点 数学例程时、链接器会自动创建 FPUmathTables 输出段、并且由于您的链接器命令文件不包含该段的放置规则、链接器会返回到 F28003x 器件的默认映射、 它将未指定的段分配给 BOOT_RSVD 区域、因此您可以在 0x00000002 处看到.map 文件中长度为 0xBE 的表、并接收警告 #10247‑D(“创建输出段‘ FPUmathTables '而不使用段规格“)。 要消除警告并控制位置、请添加一个显式 Sections 条目(例如,
    .FPUmathTables : > BOOT_RSVD
    或将其‑到用户定义的存储器块中)、或者、如果您从未使用浮点‑点数学运算、则通过在不支持浮点‑点的情况下进行编译来禁用 FPU 表(例如,使用“不链接浮点‑点支持库“选项或链接到会省略这些表的库集)。