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:初始化阶段 EABI 和 COeff 格式的大型阵列问题

Guru**** 2589265 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1161996/tms320f28379d-problems-with-large-arrays-with-eabi-and-coeff-format-at-initialization-stage

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

你(们)好
我使用的是 LaunchPad f28379D
我遇到了 EABI 输出格式的大数组大小问题(项目>属性>CCS General >输出格式>eabi (elf))、
传统 COFF 输出格式(project >属性>CCS General >输出格式>传统 COFF)不存在此问题、

我成功地将问题隔离在下面、因此简短描述如下
我正在使用库 C:\ti\C2000Ware_2_00_00_02\driverlib\f2837xd\examples\cpu1\led (led_ex1_blinky)中的 blinky 示例(我添加了多个大尺寸数组)。
当我构建项目并通过调试器将其加载到 Launchpad (闪存模式)、然后使用"恢复"按钮启动项目时、所有项目均按预期工作-即 LED 闪烁
当我按下"终止"按钮来停止调试会话、然后插入/插入 USB (断电/打开、不连接到调试器)时、LED 停止闪烁、即程序挂起。
仅在 EABI 编译时观察到此行为、COFF 编译时的相同操作会导致程序正常运行、即在断电/打开周期后 LED 闪烁
此外、如果我将我的所有数组放在类型为 NOINIT 的部分中、即使在 EABI 下、复位后、所有的内容都可以正常工作。
我想变量的初始化有一些问题。

我应该怎么做才能解决这个问题、还可以解释一下这个问题吗? 如何在不进行 NOINIT 声明的情况下使 MCU 正常运行。
我需要 EABI 输出格式、因为我的开发需要*。elf
 
这是我的数组声明(main()的一部分)(带有 pragma,因为我已经阅读了您对简单问题的回答)
和*。cmd 文件(与您的 blinky 文件相同、但具有用户段部分)






主程序
#pragma DATA_SECTION (ap_TST_huge1、"ap_TST_huge1_SECTION ")
uint16_t ap_tst_huge1[1000]={0};
#pragma DATA_SECTION (ap_TST_huge2、"ap_TST_huge2_SECTION ")
uint16_t ap_tst_huge2[1000]={0};
#pragma DATA_SECTION (ap_TST_huge3、"ap_TST_huge3_SECTION ")
uint16_t ap_TST_huge3[4000]={0};
#pragma DATA_SECTION (ap_TST_huge4、"ap_TST_huge4_SECTION ")
uint16_t ap_TST_huge4[4000]={0};
#pragma DATA_SECTION (ap_TST_huge5、"ap_TST_huge5_section")
uint16_t ap_TST_huge5[4000]={0};
#pragma DATA_SECTION (ap_TST_huge6、"ap_TST_huge6_SECTION ")
uint16_t ap_TST_huge6[4000]={0};

void main (void)

  //
  //初始化设备时钟和外设
. 与库项目中的相同
  //
  for (;;)
  {
    AP_TST_huge1[0]++;
    AP_TST_huge2[0]++;
    AP_TST_huge3[0]++;
    AP_TST_huge4[0]++;
    AP_TST_huge5[0]++;
    AP_TST_huge6[0]++;
    //
    //打开 LED
    //
    GPIO_writePin (DEVICE_GPIO_PIN_LED1、0);

    //
    //延迟一位。
    //
    DEVICE_DELAY_US (50000);
等..........................................................................





2837xD_FLASH_lnk_CPU1.cmd CMD 文件
存储器

第0页:/* 程序内存*/
     /*内存(RAM/FLASH)块可移动到 Page1进行数据分配*/
     /* begin 用于"引导至闪存"引导加载程序模式 */

  开始      :origin = 0x080000、length = 0x000002
  RAMM0      :origin = 0x000122、length = 0x0002DE
  RAMD0      :origin = 0x00B000、length = 0x000800
  RAMLS0      :origin = 0x008000、length = 0x000800
  RAMLS1      :origin = 0x008800,length = 0x000800
  RAMLS2   :origin = 0x009000,length = 0x000800
  RAMLS3   :origin = 0x009800,length = 0x000800
  RAMLS4   :origin = 0x00A000,length = 0x000800
  RAMGS14      :origin = 0x01A000、length = 0x001000  //*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 *
  RAMGS15      :origin = 0x01B000、length = 0x001000  //*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 *
  复位      :origin = 0x3FFFC0,length = 0x000002

  /*闪存扇区*/
  FLASHA      :origin = 0x080002、length = 0x001FFE //片上闪存*/
  FLASHB      :origin = 0x082000、length = 0x002000 //片上闪存*/
  FLASHC      :origin = 0x084000、length = 0x002000 //片上闪存*/
  FLASHD      :origin = 0x086000、length = 0x002000 //片上闪存*/
  FLASHE      :origin = 0x088000、length = 0x008000 //片上闪存*/
  FLASHF      :origin = 0x090000、length = 0x008000 //片上闪存*/
  FLASHG      :origin = 0x098000、length = 0x008000 //片上闪存*/
  FLASHH      :origin = 0x0A0000、length = 0x008000 //片上闪存*/
  FLASHI      :origin = 0x0A8000,length = 0x008000 //片上闪存*/
  FLASHJ      :origin = 0x0B0000、length = 0x008000 //片上闪存*/
  FLASHK      :origin = 0x0B8000,length = 0x002000 //片上闪存*/
  FLASHL      :origin = 0x0BA000、length = 0x002000 //片上闪存*/
  FLASHM      :origin = 0x0BC000、length = 0x002000 //片上闪存*/
  FLASHN      :origin = 0x0BE000、length = 0x002000 //片上闪存*/

第1页:/*数据存储器*/
     /*内存(RAM/FLASH)块可移动到 PAGE0进行程序分配*/

  BOOT_RSVD   :origin = 0x000002,length = 0x000120  // M0的一部分,引导 ROM 将此用于栈*/
  RAMM1      :origin = 0x000400、length = 0x000400  //片上 RAM 块 M1 *
  RAMD1      :origin = 0x00B800,length = 0x000800

  RAMLS5   :origin = 0x00A800,length = 0x000800

  RAMGS0   :origin = 0x00C000、length = 0x001000
  RAMGS1   :origin = 0x00D000、length = 0x001000
  RAMGS2   :origin = 0x00E000、length = 0x001000
  RAMGS3   :origin = 0x00F000、length = 0x001000
  RAMGS4   :origin = 0x010000,length = 0x001000
  RAMGS5   :origin = 0x011000,length = 0x001000
  RAMGS6   :origin = 0x012000,length = 0x001000
  RAMGS7   :origin = 0x013000,length = 0x001000
  RAMGS8   :origin = 0x014000,length = 0x001000
  RAMGS9   :origin = 0x015000,length = 0x001000
  RAMGS10  :origin = 0x016000,length = 0x001000
  RAMGS11  :origin = 0x017000,length = 0x001000
  RAMGS12  :origin = 0x018000,length = 0x001000  //*仅在 F28379D、F28377D、F28375D 设备上可用。 移除其他设备上的线路。 *
  RAMGS13  :origin = 0x019000,length = 0x001000  //*仅在 F28379D、F28377D、F28375D 设备上可用。 移除其他设备上的线路。 *

  CPU2TOCPU1RAM :origin = 0x03F800,length = 0x000400
  CPU1TOCPU2RAM :origin = 0x03FC00,length = 0x000400


部分

  /*分配计划领域:*/
  .cinit        :> FLASHB   PAGE = 0,ALIGN (4)
  .text        :>> FLASHB | FLASHC | FLASHD | FLASHE   PAGE = 0,ALIGN (4)
  codestart      :>开始   页= 0、align (4)
  /*分配未初始化的数据段:*/
  堆栈        :> RAMM1   PAGE = 1.
  切换       :> FLASHB   PAGE = 0,ALIGN (4)
  复位        :>重置,   页= 0,类型= DSECT /*未使用,*/

#if defined (_TI_EABI)
  init_array     :> FLASHB、   PAGE = 0、   ALIGN (4)
  .bss         :> RAMLS5,   page = 1.
  .bss:输出     :> RAMLS3,   PAGE = 0
  .bss:CIO       :> RAMLS5,   page = 1.
  .data        :> RAMLS5,   page = 1.
  sysmem       :> RAMLS5,   page = 1.
  /*初始化段进入闪存*/
  .const        :> FLASHF,   PAGE = 0,   ALIGN (4)
其他
  .pinit        :> FLASHB、   PAGE = 0、   ALIGN (4)
  ebss        :>> RAMLS5 | RAMGS0 | RAMGS1,  PAGE = 1
  等斯梅姆       :> RAMLS5,   page = 1.
  .cio         :> RAMLS5,   page = 1.
  /*初始化段进入闪存*/
  .econst       :>> FLASHF | FLASHG | FLASHH   PAGE = 0,ALIGN (4)
#endif

//用户部分--在上电后不工作
  AP_TST_huge1_SECTION >> RAMGS4 | RAMGS5 | RAMGS6 | RAMGS7 | RAMGS8、PAGE = 1
  AP_TST_huge2_section >> RAMGS4 | RAMGS5 | RAMGS6 | RAMGS7 | RAMGS8、PAGE = 1
  AP_TST_huge3_section >> RAMGS4 | RAMGS5 | RAMGS6 | RAMGS7 | RAMGS8、PAGE = 1
  AP_TST_huge4_section >> RAMGS4 | RAMGS5 | RAMGS6 | RAMGS7 | RAMGS8、PAGE = 1
  AP_TST_huge5_section >> RAMGS4 | RAMGS5 | RAMGS6 | RAMGS7 | RAMGS8、PAGE = 1
  AP_TST_huge6_section >> RAMGS4 | RAMGS5 | RAMGS6 | RAMGS7 | RAMGS8、PAGE = 1
//用户段末尾

//用户部分 --     在断电后工作
  //ap_TST_huge1_section >> RAMGS4 | RAMGS5 | RAMGS6 | RAMGS7 | RAMGS8、type=NOINIT、PAGE = 1
  //ap_TST_huge2_section >> RAMGS4 | RAMGS5 | RAMGS6 | RAMGS7 | RAMGS8、type=NOINIT、PAGE = 1
  //ap_TST_huge3_section >> RAMGS4 | RAMGS5 | RAMGS6 | RAMGS7 | RAMGS8、type=NOINIT、PAGE = 1
  //ap_TST_huge4_section >> RAMGS4 | RAMGS5 | RAMGS6 | RAMGS7 | RAMGS8、type=NOINIT、PAGE = 1
  //ap_TST_huge5_section >> RAMGS4 | RAMGS5 | RAMGS6 | RAMGS7 | RAMGS8、type=NOINIT、PAGE = 1
  //ap_TST_huge6_section >> RAMGS4 | RAMGS5 | RAMGS6 | RAMGS7 | RAMGS8、type=NOINIT、PAGE = 1
//用户段末尾

  filter_RegsFile  :> RAMGS0, PAGE = 1

  SHARERAMGS0:> RAMGS0,PAGE = 1
  SHARERAMGS1:>RAMGS1,PAGE = 1.
  ramgs0      :> RAMGS0,  PAGE = 1
  频率1      :> RAMGS1,  PAGE = 1

#ifdef __TI_Compiler_version__
  #if __TI_Compiler_version__>=15009000
    #if defined (_TI_EABI)
      .TI.ramfunc:{}负载= FLASHD,
                 运行= RAMLS0、
                 Load_start (RamfuncsLoadStart)、
                 load_size (RamfuncsLoadSize)、
                 Load_End (RamfuncsLoadEnd)、
                 RUN_START (RamfuncsRunStart)、
                 run_size (RamfuncsRunSize)、
                 RUN_END (RamfuncsRunEnd)、
                 PAGE = 0、ALIGN (4)
    其他
      .TI.ramfunc:{}负载= FLASHD,
               运行= RAMLS0、
               load_start (_RamfuncsLoadStart)、
               load_size (_RamfuncsLoadSize)、
               load_end (_RamfuncsLoadEnd)、
               run_start (_RamfuncsRunStart)、
               run_size (_RamfuncsRunSize)、
               run_end (_RamfuncsRunEnd)、
               PAGE = 0、ALIGN (4)
    #endif
  其他
  ramfuncs       :LOAD = FLASHD,
             运行= RAMLS0、
             load_start (_RamfuncsLoadStart)、
             load_size (_RamfuncsLoadSize)、
             load_end (_RamfuncsLoadEnd)、
             run_start (_RamfuncsRunStart)、
             run_size (_RamfuncsRunSize)、
             run_end (_RamfuncsRunEnd)、
             PAGE = 0、ALIGN (4)   
  #endif

#endif

  /*使用 IPC API 驱动程序时需要以下部分定义*/
  组:> CPU1TOCPU2RAM,PAGE = 1
  {
    PUTBUFFER
    PUTWRITEIDX
    GETREADIDX
  }

  组:> CPU2TOCPU1RAM,PAGE = 1
  {
    GETBUFFER:  TYPE = DSECT
    GETWRITEIDX: TYPE = DSECT
    PUTREADIDX: TYPE = DSECT
  }

  /*以下部分定义适用于 SDFM 示例*/
  filter1_RegsFile:> RAMGS1,PAGE = 1,fill=0x1111
  Filter2_RegsFile:> RAMGS2,PAGE = 1,fill=0x2222
  Filter3_RegsFile:> RAMGS3,PAGE = 1,fill=0x3333
  Filter4_RegsFile:> RAMGS4,PAGE = 1,fill=0x4444
  Differit_RegsFile:>RAMGS5,PAGE = 1,fill=0x3333


/*
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//文件结束。
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
*

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

    您好!  

    是否可以共享 CCS 项目、以便我可以尝试复制行为、  

    对于 COFF、您能否确保代码从闪存运行?

    此致

    Siddharth

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

    您好 Siddharth

    感谢您的响应。 我很确定我使用 COFF 进行闪存构建(也用于 EABI)

    请参阅带有项目的 zip 文件  

    在2837xD_FLASH_lnk_CPU1.cmd 中、您可以对此进行注释

    //这是正确的
    AP_TST_SECTION >> RAMGS4_8、TYPE = NOINIT、PAGE = 1

    并取消注释

    //这不能正常工作
    //ap_TST_SECTION >> RAMGS4_8、PAGE = 1

    获得异常行为(根据我的意见)

    此外、main 中的这些部分还添加到了标准闪烁

    #pragma SET_DATA_SECTION ("ap_TST_SECTION ")
    uint16_t ap_tst_huge1[1000];
    uint16_t ap_tst_huge2[1000];
    uint16_t ap_tst_huge3[4000];
    uint16_t ap_tst_huge4[4000];
    uint16_t ap_tst_huge5[4000];
    uint16_t ap_tst_huge6[4000];
    #pragma SET_DATA_SECTION ()

    这样可以避免 compiller 忽略数组

    AP_TST_huge1[0]++;
    AP_TST_huge2[0]++;
    AP_TST_huge3[0]++;
    AP_TST_huge4[0]++;
    AP_TST_huge5[0]++;
    AP_TST_huge6[0]++;

    e2e.ti.com/.../ynmTest_5F00_led_5F00_ex1_5F00_blinky.zip

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

    一些附加注释只是为了准确  

    Code Composer Studio 版本:12.0.0.00009 -这是我的 CCS 版本

    这是我的库版本 C:\ti\C2000Ware_2_00_00_02\driverlib\f2837xd\examples\cpu1\led

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

    您好,  

    感谢您分享该项目。  

    几天内、我们将向您回顾并返回。

    此致

    Siddharth

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

    您好!

    一种可能是初始化花费的时间太长、以至于看门狗失效。

    您可以在跳转到 cinit00函数之前禁用看门狗

    在 codestartbranch.asm 文件中、将 WD_DISABLE 设置为1

    WD_DISABLE .set 0;设置为1以禁用 WD、否则设置为0

    此致、

    Veena

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

    您好、Veena、感谢您的响应

    默认情况下禁用看门狗

    在部分默认 codestartbranch.asm 文件下(即从头开始"按原样")

    我没有应用任何更改

    (三

    WD_DISABLE .set 1;设置为1可禁用 WD、否则设置为0

    .ref _c_int00
    全局代码_start

    (三

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

    在您共享的 zip 文件中、我看到 WD_DISABLE 设置 为0。

    此外、请按 如下所示添加.retain 关键字

    WD_DISABLE .set 1;设置为1可禁用 WD、否则设置为0

    .ref _c_int00
    全局代码_start

    (三
    *函数:codestart 段
    *
    *说明:分支到代码起始点
    (三

    .sect "codestart"
    保留

    code_start:
    如果 WD_DISABLE = 1
    LB WD_DISABLE;分支到看门狗禁用代码
    其他
    LB _c_int00;分支到 RTS 库中启动。_asm
    .endif

    此致、

    Veena