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.

[参考译文] TMS320F28386S:在闪存中放置闪存内核

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1190462/tms320f28386s-placing-flash-kernels-in-flash

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

已删除此原始帖子。 它未立即显示、Firefox 或 E2E 烧坏、因此我在下面重新创建了它...

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

    器件型号:TMS320F28386S

    由于我们的硬件设计没有使用正确的引脚对来使用串行闪存编程器更新 SCIA 引导固件、因此我们必须进行修改设计。

    我尝试将 CPU1内核构建为 RAM 项目并运行它、这似乎可以正常工作。 但是,我没有足够的展望。 使用串行闪存编程器更新 CM 要复杂得多。 第二个内核必须加载到 CPU1中、另一个内核必须加载到 CM 中。 CPU1内核加载 CM 内核后、必须重新加载原始 CPU 内核以更新 CM 应用程序。 在与 TI E2E 工程师的主题帖和对话中、如果我将内核放置在闪存中不受更新影响的位置、似乎会有所帮助。 该位置将由链接器 cmd 文件控制。 因此、有3个问题。

    1)这些内核(CPU1为2、CM 中为1)是否应从闪存运行、或者它们是否应基于 RAM、因为它们最初运行并复制到 RAM 中以运行? 如果链接器 cmd 文件指定的内核区域未被擦除或覆盖、我认为从闪存运行是正常的。

    2)这个论坛可能不是这个问题的正确场所、但如果我想去其他地方看看、我会希望有一些改变。 这些内核是从我的常规主应用程序调用函数、还是使用分支?

    3) 3)再次说明可能是错误的论坛。 如何在链接器 cmd 文件中隔离这些函数或映像?

    谢谢、

    John

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

    尊敬的 John:

    1) 1)内核的一部分可以从闪存运行、但堆栈等其他进程需要从 RAM 运行。  

    2) 2)为了您的使用、内核应由分支调用。 您是否期望应用程序运行、然后将内核称为函数?

    3) 3) CPU1 和 CM 内核均可使用  C2000Ware_4_02_00_00\device_support\f2838x_flash_lnk_shared_cm.cmd 从闪存运行。  这些函数 自然 是隔离的、因为它们使用不同的闪存组。  

    谢谢、

    查尔斯

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

    您好、Charles、感谢您的快速回答。

    1) 1)是的、当然可以。 我应该已经指定了堆栈和变量。

    2) 2)我假设我需要将它们称为函数。 我不知道另一种方法、因为目标是在不使用 JTAG 的情况下升级应用。但欢迎提出任何想法。

    3) 3)感谢您的介绍。 我稍后会研究这个问题、这意味着会有更多问题、但我想尽快回答1和2。

    John

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

    尊敬的 John:

    2) 2)您可以将它们作为函数调用、这样做会将您发送到 SCI 引导加载程序、以便通过 SCI 下载内核。  只要它未连接到您的 JTAG 默认引脚(针对您的情况)。

    谢谢、

    查尔斯

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

    2) 2)这一点完全不好。 我们的 SCIA 引脚配置是所有此问题的根源。如果 SCI 引导加载程序启动、我会锁定、因为它使用我们没有的引脚对。

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

    我看、对。 您可以修改 sciGetFunction、以便 不必 依赖该引脚28/29引脚对组合。  

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

    a)使用2838x_flash_lnk_cpu1.cmd 时出现问题、并且 CM 可能存在类似的问题。 此链接文件将内核置于与我的原始应用程序相同的位置。 我需要将这两个文件同时放在闪存中、以便我的应用程序可以调用内核。 因此、我需要知道如何为特定的闪存代码段指定地址。 由于应用程序将在较低的闪存中被覆盖、因此可通过跳转或分支调用此代码。

    b)内核还需要初始化变量等的空间 那么、.text、.cinit 和.switch? 根据我的理解、这可能与应用程序初始化的变量空间相邻。 希望未初始化的变量可以共享空间。

    c)查看我的应用程序映射文件时、似乎有足够的空闪存空间。

    d)执行固件更新时、我需要找到一种方法来执行更新、以便闪存中的内核不是更新的一部分。 这让我得出结论、最好从闪存复制内核并在 RAM 中执行。

    JH

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

    尊敬的 John:

    感谢您提出问题。  

    a)已理解、因此内核和您的应用都将驻留在闪存中。 为了指定内核的地址、它不需要与应用程序文件的地址重叠。

    B/C)如果 需要、可将.text、.cinit 和.switch 的初始化变量存储在闪存中。  

    对于 D、我认为最好从闪存复制内核并在 RAM 中执行。

    查尔斯

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

    d)好。 我基本上不了解这一进程。 是否有一些 TI 材料可供使用。

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

    John、我将参考 链接器命令文件的 flashapi_ex1_programming 工程和汇编语言工具指南(www.ti.com/.../sprui03e.pdf)。  

    今天稍后我将继续对此进行研究。

    谢谢、

    查尔斯

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

    感谢您的提示。

    我构建了一个 cmd 文件、但我不知道要使用什么 RAM 段、LS 或 GS。 是否有通用首选项。

    cmd 文件:

    MEMORY
    {
    
       /* BEGIN is used for the "boot to SARAM" bootloader mode   */
       //BEGIN            : origin = 0x000000, length = 0x000002
       BOOT_RSVD        : origin = 0x000002, length = 0x0001AF     /* Part of M0, BOOT rom will use this for stack */
       RAMM0            : origin = 0x0001B1, length = 0x00024F
       RAMM1            : origin = 0x000400, length = 0x0003F8     /* on-chip RAM block M1 */
    //   RAMM1_RSVD       : origin = 0x0007F8, length = 0x000008     /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
       RAMD0            : origin = 0x00C000, length = 0x000800
       RAMD1            : origin = 0x00C800, 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
       RAMLS5           : origin = 0x00A800, length = 0x000800
       RAMLS6           : origin = 0x00B000, length = 0x000800
       RAMLS7           : origin = 0x00B800, length = 0x000800
       RAMGS0           : origin = 0x00D000, length = 0x001000
       RAMGS1           : origin = 0x00E000, length = 0x001000
       RAMGS2           : origin = 0x00F000, length = 0x001000
       RAMGS3           : origin = 0x010000, length = 0x001000
       RAMGS4           : origin = 0x011000, length = 0x001000
       RAMGS5           : origin = 0x012000, length = 0x001000
       RAMGS6           : origin = 0x013000, length = 0x001000
       RAMGS7           : origin = 0x014000, length = 0x001000
       RAMGS8           : origin = 0x015000, length = 0x001000
       RAMGS9           : origin = 0x016000, length = 0x001000
       RAMGS10          : origin = 0x017000, length = 0x001000
       RAMGS11          : origin = 0x018000, length = 0x001000
       RAMGS12          : origin = 0x019000, length = 0x001000
       RAMGS13          : origin = 0x01A000, length = 0x001000
       RAMGS14          : origin = 0x01B000, length = 0x001000
       RAMGS15          : origin = 0x01C000, length = 0x000FF8
    //   RAMGS15_RSVD     : origin = 0x01CFF8, length = 0x000008     /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
    
       /* BEGIN is used for the "boot to Flash" bootloader mode   */
       BEGIN            : origin = 0x080000, length = 0x000002
       /* Flash sectors */
       FLASH0           : origin = 0x080002, length = 0x001FFE  /* on-chip Flash */
       FLASH1           : origin = 0x082000, length = 0x002000  /* on-chip Flash */
       FLASH2           : origin = 0x084000, length = 0x002000  /* on-chip Flash */
       FLASH3           : origin = 0x086000, length = 0x002000  /* on-chip Flash */
       FLASH4           : origin = 0x088000, length = 0x008000  /* on-chip Flash */
       FLASH5           : origin = 0x090000, length = 0x008000  /* on-chip Flash */
       FLASH6           : origin = 0x098000, length = 0x008000  /* on-chip Flash */
       FLASH7           : origin = 0x0A0000, length = 0x008000  /* on-chip Flash */
       FLASH8           : origin = 0x0A8000, length = 0x008000  /* on-chip Flash */
       FLASH9           : origin = 0x0B0000, length = 0x008000  /* on-chip Flash */
       FLASH10          : origin = 0x0B8000, length = 0x002000  /* on-chip Flash */
       FLASH11          : origin = 0x0BA000, length = 0x002000  /* on-chip Flash */
       FLASH12          : origin = 0x0BC000, length = 0x002000  /* on-chip Flash */
       FLASH13          : origin = 0x0BE000, length = 0x001FF0  /* on-chip Flash */
    /*
    #ifdef __TI_COMPILER_VERSION__
      #if __TI_COMPILER_VERSION__ >= 20012000
    }  crc(_table_name, algorithm=C28_CHECKSUM_16)
      #endif
    #endif
    */
       CPU1TOCPU2RAM_0  : origin = 0x03A000, length = 0x000400
       CPU1TOCPU2RAM_1  : origin = 0x03A400, length = 0x000400
       CPU2TOCPU1RAM    : origin = 0x03B000, length = 0x000800
    
       CPUTOCMRAM       : origin = 0x039000, length = 0x000800
       CMTOCPURAM       : origin = 0x038000, length = 0x000800
    
       CANA_MSG_RAM     : origin = 0x049000, length = 0x000800
       CANB_MSG_RAM     : origin = 0x04B000, length = 0x000800
    
       RESET            : origin = 0x3FFFC0, length = 0x000002
    }
    
    
    SECTIONS
    {
       codestart        : > BEGIN
    
       kernel_section : 
       {
    		flash_kernel_c28x_dual_ex1_boot_cpu1.obj(.text)
    		flash_kernel_c28x_dual_ex1_erase_cpu1.obj(.text)
    		flash_kernel_c28x_dual_ex1_sci_boot_cpu1.obj(.text)
    		flash_kernel_c28x_dual_ex1_sci_flash_kernel_cpu1.obj(.text)
    		flash_kernel_c28x_dual_ex1_sci_get_function_cpu1.obj(.text)
    		flash_kernel_c28x_dual_ex1_verify_cpu1.obj(.text)
    
       }    LOAD >> FLASH5, // | FLASH6 | FLASH7 | FLASH8 | FLASH9 | FLASH11 | FLASH12,
            RUN >> RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3,
            LOAD_START(RamfuncsLoadStart),
            LOAD_SIZE(RamfuncsLoadSize),
            LOAD_END(RamfuncsLoadEnd),
            RUN_START(RamfuncsRunStart),
            RUN_SIZE(RamfuncsRunSize),
            RUN_END(RamfuncsRunEnd),
            ALIGN(4)
    
       .text            : >>RAMGS1 | RAMGS2 | RAMGS3 | RAMGS4
       .cinit           : > RAMM0
       .switch          : > RAMM0
       .reset           : > RESET,    TYPE = DSECT /* not used, */
    
       .stack           : > RAMM1
    #if defined(__TI_EABI__)
       .bss            : > RAMGS5
       .data           : > RAMGS5
       .const          : > RAMGS5
       .init_arry      : > RAMM0
       .sysmem         : > RAMGS5
    #else
       .pinit           : > RAMM0
       .ebss            : > RAMGS5
       .econst          : > RAMGS5
       .esysmem         : > RAMGS5
    #endif
    
       Filter_RegsFile  : > RAMGS5
    
    #ifdef __TI_COMPILER_VERSION__
        #if __TI_COMPILER_VERSION__ >= 15009000
           .TI.ramfunc      : > RAMGS5
        #else
           ramfuncs         : > RAMGS5
        #endif
    #endif
    
       MSGRAM_CPU1_TO_CPU2 > CPU1TOCPU2RAM_0, type=NOINIT
       MSGRAM_CPU1_TO_CPU2_COPY_TO_M1_RAM > CPU1TOCPU2RAM_1, type=NOINIT
       MSGRAM_CPU2_TO_CPU1 > CPU2TOCPU1RAM, type=NOINIT
       MSGRAM_CPU_TO_CM   > CPUTOCMRAM, type=NOINIT
       MSGRAM_CM_TO_CPU   > CMTOCPURAM, type=NOINIT
    
    
    
        /* The following section definition are for SDFM examples */
       Filter1_RegsFile : > RAMGS10,	 fill=0x1111
       Filter2_RegsFile : > RAMGS11,	 fill=0x2222
       Filter3_RegsFile : > RAMGS12,	 fill=0x3333
       Filter4_RegsFile : > RAMGS13,     fill=0x4444
       Difference_RegsFile : >RAMGS14, 	 fill=0x3333
    
    }
    
    /*
    //===========================================================================
    // End of file.
    //===========================================================================
    */
    

     

    谢谢、

    John

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

    尊敬的 John:

    LS 或 GS 都可以使用、但我倾向于 GS、因为您可以使用更多的扇区。  LS RAM 在 C28x CPU 和 CLA 之间共享、GS RAM 在 CPU、CPU2、DMA 访问之间共享。  

    谢谢、

    查尔斯

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

    今天确定我无法在闪存中运行内核、因为内核正在更新闪存。

    关闭此主题。