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.
我需要仿真 SCI_Boot、因为我们的硬件配置不正确、电路板不会重新制造。
我让我的伪 SCI_BOOT 运行、它接受了串行闪存编程器的23300+个字节。 初始目标为0、并从该位置正确构建。 但是、我不确定写入此起始位置是否安全、但我无法从链接器 cmd 文件中确定。 此外、如果我正确解释、堆栈位于 RAMM0_1、因此将被覆盖。
因此、我看到了3种备选方案:
1) 1)调整链接器命令文件、以便跳过24K 的空间、这似乎会将存储器占用到 GS1中。 这可能不足以支持应用程序。 下面是我们常规应用的内存分配映射。
2) 2)修改我的伪 SCI 引导程序以使用偏移量加载到我们的外部 RAM、地址为0x8000000、16Mx16、IS45S16160J-7TLA2。 我不确定前2个块、因为第一个块发往地址0、下一个发往地址0x1B4、它位于从0x1B1Hey 开始的 RAMM0中
3) 3)关闭并确定如何将闪存内核永久放入闪存中。 如果我这么做、要 从我们的主应用程序运行它、我会加载一个具有该闪存地址的函数指针吗? 是否需要更改堆栈和任何其他地址?
我的选择是第三、因为似乎有足够的闪存可用。 但是、repo flash_kernel_C28x_dual_ex1_c28x1本质上是基于 RAM 的、将其转换为基于闪存时遇到问题。 感谢您的观察和建议。
这是我们当前的链接器文件:
#if 1 MEMORY { BOOT_RSVD : origin = 0x000002, length = 0x0001AE /* Part of M0, BOOT rom will use this for stack */ RAMM0_1 : origin = 0x0001B0, length = 0x000648 // RAMM1_RSVD : origin = 0x0007F8, length = 0x000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ CLA_MSGRAMLOW : origin = 0x001480, length = 0x000080 CLA_MSGRAMHIGH : origin = 0x001500, length = 0x000080 RAMD0_1 : origin = 0x00C000, length = 0x001000 RAMLS0 : origin = 0x008000, length = 0x000800 RAMLS1_5 : origin = 0x008800, length = 0x002800 RAMLS6 : origin = 0x00B000, length = 0x000800 RAMLS7 : origin = 0x00B800, length = 0x000800 RAMGS0_1 : origin = 0x00D000, length = 0x002000 RAMGS2_4 : origin = 0x00F000, length = 0x003000 RAMGS5_6 : origin = 0x012000, length = 0x002000 RAMGS7 : origin = 0x014000, length = 0x001000 RAMGS8_9 : origin = 0x015000, length = 0x002000 RAMGS10_15 : origin = 0x017000, length = 0x005FF8 // RAMGS15_RSVD : origin = 0x01CFF8, length = 0x000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ #ifdef __TI_COMPILER_VERSION__ #if __TI_COMPILER_VERSION__ >= 20012000 GROUP { /* GROUP memory ranges for crc/checksum of entire flash */ #endif #endif /* 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_4 : origin = 0x084000, length = 0x00C000 /* 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_11 : origin = 0x0B8000, length = 0x004000 /* on-chip Flash */ FLASH12_13 : origin = 0x0BC000, length = 0x003FF0 /* on-chip Flash */ // FLASH13_RSVD : origin = 0x0BFFF0, length = 0x000010 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ #ifdef __TI_COMPILER_VERSION__ #if __TI_COMPILER_VERSION__ >= 20012000 } crc(_table_name, algorithm=C28_CHECKSUM_16) #endif #endif CPUTOCMRAM : origin = 0x039000, length = 0x000800 CMTOCPURAM : origin = 0x038000, length = 0x000800 CPU1TOCPU2RAM : origin = 0x03A000, length = 0x000800 CPU2TOCPU1RAM : origin = 0x03B000, length = 0x000800 RESET : origin = 0x3FFFC0, length = 0x000002 EMIF1_CS0n : origin = 0x80000000, length = 0x01000000 } SECTIONS { codestart : > BEGIN, ALIGN(4) .text : > FLASH2_4, ALIGN(4) .cinit : > FLASH1, ALIGN(4) .switch : > FLASH1, ALIGN(4) .reset : > RESET, TYPE = DSECT /* not used, */ .stack : > RAMM0_1 #if defined(__TI_EABI__) .init_array : > FLASH1, ALIGN(4) .bss : > RAMGS2_4 .bss:output : > RAMGS2_4 .bss:cio : > RAMGS2_4 .data : > RAMGS5_6 .sysmem : > RAMGS2_4 /* Initalized sections go in Flash */ .const : > FLASH12_13, ALIGN(4) #else .pinit : > FLASH1, ALIGN(4) .ebss : > RAMGS2_4 .esysmem : > RAMGS2_4 .cio : > RAMGS2_4 /* Initalized sections go in Flash */ .econst : >> FLASH12_13, ALIGN(4) #endif .farbss : > EMIF1_CS0n .farconst : > EMIF1_CS0n .em1_cs0 : > EMIF1_CS0n /*** CLA Compiler Required Sections ***/ .scratchpad : > RAMLS7 /* Scratchpad memory for the CLA C Compiler */ .const_cla : > RAMLS7 ramgs0 : > RAMGS0_1, type=NOINIT MSGRAM_CPU1_TO_CPU2 : > CPU1TOCPU2RAM, type=NOINIT MSGRAM_CPU2_TO_CPU1 : > CPU2TOCPU1RAM, type=NOINIT MSGRAM_CPU_TO_CM : > CPUTOCMRAM, type=NOINIT MSGRAM_CM_TO_CPU : > CMTOCPURAM, type=NOINIT #if defined(__TI_EABI__) .TI.ramfunc : {} LOAD = FLASH0, RUN = RAMLS0, LOAD_START(RamfuncsLoadStart), LOAD_SIZE(RamfuncsLoadSize), LOAD_END(RamfuncsLoadEnd), RUN_START(RamfuncsRunStart), RUN_SIZE(RamfuncsRunSize), RUN_END(RamfuncsRunEnd), ALIGN(4) #else .TI.ramfunc : {} LOAD = FLASH0, RUN = RAMLS0, LOAD_START(_RamfuncsLoadStart), LOAD_SIZE(_RamfuncsLoadSize), LOAD_END(_RamfuncsLoadEnd), RUN_START(_RamfuncsRunStart), RUN_SIZE(_RamfuncsRunSize), RUN_END(_RamfuncsRunEnd), ALIGN(4) #endif DataBufferSection : > RAMGS7, ALIGN(4) LogSection : > RAMD0_1, ALIGN(4) ParamSection : > RAMGS8_9, ALIGN(4) ClaToCpuMsgRAM : > CLA_MSGRAMLOW /* Link to CLA Message RAM */ CpuToClaMsgRAM : > CLA_MSGRAMHIGH /* Link to CLA Message RAM */ ClaData : > RAMLS6 /* Link to CLA Data RAM */ .bss_cla : > RAMLS6 /* Link to CLA Data RAM */ /* Link to CLA Program RAM */ Cla1Prog : LOAD = FLASH10_11, RUN = RAMLS1_5, LOAD_START(ClaProgLoadStart), RUN_START(ClaProgRunStart), LOAD_SIZE(ClaProgLoadSize) , ALIGN(4) /* crc/checksum section configured as COPY section to avoid including in executable */ .TI.memcrc : type = COPY }
这是当前的内存分配。
尊敬的 John:
列出的起始位置0是否与存储器0的起始位置相同? 以下是有关替代选项的一些注意事项:
1) 1)如果 您要将其余 RAM 存储器的段移动到24k 以上、则可以将链接器 cmd 文件调整24k。 我会检查器件上可用的 RAM 量。 当您的应用程序运行时、它将来自 RAM 是正确的?
2) 2)如果偏移量用于加载到外部 RAM、那么前两个块是否意味着尽管存在分支、它将始终在地址0和0x1B1处进行编程?
3) 3)闪存内核可作为 EEPROM 放置在闪存中。 HALCoGen 工具(http://www.ti.com/tool/HALCOGEN)中包含了器件“TMS570LS31x_21x”(\ti\Hercules \HALCoGen\v04.07.07.01\examples\TMS570LS31x_21x\example_TI_fee_Write_Read)的示例。 注意:您必须使用 F2838闪存 API (https://www.ti.com/lit/ug/spnu632/spnu632.pdf)、而不是使用 F021闪存 API 2.0 (Hercules API)–但其概念与之相似。 Hercules 器件内核为 ARM (字节可寻址)、C28x 存储器为16位可寻址。 我已将下面的用户指南作为 pdf 提供。
e2e.ti.com/.../2541.TI_5F00_FEE_5F00_User_5F00_Guide.pdf
谢谢、
查尔斯
感谢您发布 Charles。
1) 1)看起来它具有44KB 的 RAM。
2) 2)我的问题是前两个块是否需要转到其原始地址? 第一个块大小为2、其目的为0。 内容:
0x0041 0x0044
我不知道它是什么、但它可能很重要、因为下一个块直到地址0x1B4才写入、我认为地址0x1B4可能是堆栈区域。 我知道地址0002是保留的、但没有找到任何确定的0000。
那么、这两个块是否需要保持放置、或者它们是否也可以移动?
3) 3)这种选择看起来很理想、但我应该明天做一些工作、这看起来像一座需要攀登的高山。 因此、我可能需要一个冰雹 Mary、而不是一个理想的解决方案。
我一直在用石头打我的头,而不是想。 有一种更简单的方法来实现这一点。
我修改了 FLASH_kernel_C28x_dual_ex1_c28x1以使用我的 SCIA 引脚、并将其构建为独立的 RAM 应用程序。
然后、我修改了串行闪存编程器以跳过内核下载、该内核下载应加载 FLASH_kernel_C28x_DUAL_ex1_c28x1。
到目前为止、我已加载 CPU1应用程序。 我重置电路板、新代码开始将其指示灯消息打印到 SCIB。