主题中讨论的其他器件:C2000WARE
已删除此原始帖子。 它未立即显示、Firefox 或 E2E 烧坏、因此我在下面重新创建了它...
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.
已删除此原始帖子。 它未立即显示、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 从闪存运行。 这些函数 自然 是隔离的、因为它们使用不同的闪存组。
谢谢、
查尔斯
a)使用2838x_flash_lnk_cpu1.cmd 时出现问题、并且 CM 可能存在类似的问题。 此链接文件将内核置于与我的原始应用程序相同的位置。 我需要将这两个文件同时放在闪存中、以便我的应用程序可以调用内核。 因此、我需要知道如何为特定的闪存代码段指定地址。 由于应用程序将在较低的闪存中被覆盖、因此可通过跳转或分支调用此代码。
b)内核还需要初始化变量等的空间 那么、.text、.cinit 和.switch? 根据我的理解、这可能与应用程序初始化的变量空间相邻。 希望未初始化的变量可以共享空间。
c)查看我的应用程序映射文件时、似乎有足够的空闪存空间。
d)执行固件更新时、我需要找到一种方法来执行更新、以便闪存中的内核不是更新的一部分。 这让我得出结论、最好从闪存复制内核并在 RAM 中执行。
JH
感谢您的提示。
我构建了一个 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