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.
您好!
我们的团队喜欢将 RAM 构建用于我们的开发、因为编程周期时间 比闪存构建快得多。
遗憾的是、我看到 RAM 中的内容与我在反汇编.out 文件时看到的运算代码不匹配的问题。
例如:
在此示例中、我在链接器中将 RAMGS1 (地址0xD000)配置为.text 扇区。
.text : >> RAMGS1_3 | RAMGS4_7 | RAMLS4 | RAMLS5 | RAMD0_1, PAGE = 0, ALIGN(8)
奇怪的是、即使我更改了.text ram 链接器中扇区的顺序并将函数存储在 RAM 中、位于0xd000和0xd001的代码看起来也是一样的。 在程序运行到 main()之前,我已经验证了程序加载时 RAM 内容是否损坏。 即在 _c_int00处
CCS 在将.out 文件加载到 RAM 时是否执行优化? 什么 可能导致 dis2000输出与我在 CCS 中看到的结果不匹配?
-科林
Colin、
与.out 拆分的代码应与通过 JTAG 加载到器件中的代码匹配。
在查看上面的拆分装配体之前、您是否可以确保已运行到主程序?
作为 C Init 的一部分、有一些指令会影响 C28x 内核解释某些运算代码的方式(为了实现向后兼容性)、如果我们在执行此操作之前查看拆分、它可能会解释差异。
最棒的
Matthew
您好、Matthew、
感谢您的快速响应。 我已经尝试过、结果是相同的。 这就是我最初确定问题的方式、因为系统没有执行启用 ISR 的函数。
您对我还可以尝试什么有任何建议吗? 是否有任何方法可以添加额外的日志记录以查看仿真器正在加载到闪存中的内容?
-科林
Colin、
当您通过 CCS 加载代码时、您是使用调试按钮启动/加载/等活动项目、还是手动连接到目标、然后使用 Run->Load->Load Program、然后选择.out 文件?
如果将内存浏览器打开到同一位置(0xD000)、内容是否与拆分窗口中第二列中的内容相匹配?
假设这是"是"、如果刷新存储器窗口、您是否会看到内容发生变化?
最棒的
Matthew
我使用了调试按钮和“Run->Load->Select Program to Load->*.out”过程。 我使用的是 CCS 11.2.0.00007和 CDT 21.6.0.0。
内存浏览器和拆分程序集显示相同的操作代码内容。 下面的屏幕截图显示了刷新后的拆分和存储器内容以及.out 文件的拆分。 (这是通过调试按钮获取的...但加载选项没有变化)
Colin、
感谢您这么做、我不会过多地使用反汇编器、但一旦编译.out、有关器件的代码加载的任何内容都不应更改内容。
您能否附加在构建项目时生成的.map 文件、这将帮助我了解正在播放的存储器区域以及是否有任何相邻的存储器使用情况。 如果存在存储器超运行问题、链接器应该不会继续、如果存在栈超运行或超运行/过写入存储器指针、我们通常会看到什么情况。 因为在代码加载时、在 main 之前、情况不应如此。
您能否打开"Registers"选项卡并找到 SP (内核寄存器下的堆栈指针)、让我知道当您读取存储器时读取的内容?
最棒的
Matthew
您好、Matthew、
我很难在 E2E 论坛中上传地图文件。 我是否可以使用另一个工具来共享它? 在此期间、以下是段输出:
****************************************************************************** TMS320C2000 Linker Unix v21.6.0 ****************************************************************************** >> Linked Wed Jun 8 15:20:56 2022 OUTPUT FILE NAME: <tahoe_500-0120_rev002_RAM.out> ENTRY POINT SYMBOL: "_c_int00" address: 00013c25 MEMORY CONFIGURATION name origin length used unused attr fill ---------------------- -------- --------- -------- -------- ---- -------- PAGE 0: RAMLS3 00009800 00000800 000005ca 00000236 RWIX RAMLS4 0000a000 00000800 000000bc 00000744 RWIX RAMLS5 0000a800 00000800 00000000 00000800 RWIX RAMD0_1 0000b000 00001000 00000e1f 000001e1 RWIX RAMGS1_3 0000d000 00003000 00003000 00000000 RWIX RAMGS4_7 00010000 00003ff8 00003ff8 00000000 RWIX FLASHJ 000b0000 00008000 00001712 000068ee RWIX RESET 003fffc0 00000002 00000000 00000002 RWIX PAGE 1: BOOT_RSVD 00000002 00000121 00000000 00000121 RWIX RAMM0_1 00000124 000006d4 000006d4 00000000 RWIX RAMM1_RSVD 000007f8 00000008 00000000 00000008 RWIX ADCARESULT 00000b00 00000018 00000000 00000018 RWIX ADCBRESULT 00000b20 00000018 00000000 00000018 RWIX ADCDRESULT 00000b60 00000018 00000000 00000018 RWIX CPUTIMER0 00000c00 00000008 00000000 00000008 RWIX CPUTIMER1 00000c08 00000008 00000000 00000008 RWIX CPUTIMER2 00000c10 00000008 00000000 00000008 RWIX PIECTRL 00000ce0 0000001a 0000001a 00000000 RWIX PIEVECTTABLE 00000d00 00000200 00000000 00000200 RWIX DMA 00001000 00000200 00000000 00000200 RWIX CLA1 00001400 00000080 00000000 00000080 RWIX CLA1_MSGRAMLOW 00001480 00000080 00000000 00000080 RWIX CLA1_MSGRAMHIGH 00001500 00000080 00000000 00000080 RWIX CLB1LOGICCFG 00003000 00000052 00000000 00000052 RWIX CLB1LOGICCTRL 00003100 00000040 00000000 00000040 RWIX CLB1DATAEXCH 00003200 00000200 00000000 00000200 RWIX CLB2LOGICCFG 00003400 00000052 00000000 00000052 RWIX CLB2LOGICCTRL 00003500 00000040 00000000 00000040 RWIX CLB2DATAEXCH 00003600 00000200 00000000 00000200 RWIX CLB3LOGICCFG 00003800 00000052 00000000 00000052 RWIX CLB3LOGICCTRL 00003900 00000040 00000000 00000040 RWIX CLB3DATAEXCH 00003a00 00000200 00000000 00000200 RWIX CLB4LOGICCFG 00003c00 00000052 00000000 00000052 RWIX CLB4LOGICCTRL 00003d00 00000040 00000000 00000040 RWIX CLB4DATAEXCH 00003e00 00000200 00000000 00000200 RWIX EPWM1 00004000 00000100 00000000 00000100 RWIX EPWM2 00004100 00000100 00000000 00000100 RWIX EPWM3 00004200 00000100 00000000 00000100 RWIX EPWM4 00004300 00000100 00000000 00000100 RWIX EPWM5 00004400 00000100 00000000 00000100 RWIX EPWM6 00004500 00000100 00000000 00000100 RWIX EPWM7 00004600 00000100 00000000 00000100 RWIX EPWM8 00004700 00000100 00000000 00000100 RWIX EPWM9 00004800 00000100 00000000 00000100 RWIX EPWM10 00004900 00000100 00000000 00000100 RWIX EPWM11 00004a00 00000100 00000000 00000100 RWIX EPWM12 00004b00 00000100 00000000 00000100 RWIX ECAP1 00005000 00000020 00000000 00000020 RWIX ECAP2 00005020 00000020 00000000 00000020 RWIX ECAP3 00005040 00000020 00000000 00000020 RWIX ECAP4 00005060 00000020 00000000 00000020 RWIX ECAP5 00005080 00000020 00000000 00000020 RWIX ECAP6 000050a0 00000020 00000000 00000020 RWIX EQEP1 00005100 00000022 00000000 00000022 RWIX EQEP2 00005140 00000022 00000000 00000022 RWIX EQEP3 00005180 00000022 00000000 00000022 RWIX DACA 00005c00 00000008 00000000 00000008 RWIX DACB 00005c10 00000008 00000000 00000008 RWIX DACC 00005c20 00000008 00000000 00000008 RWIX CMPSS1 00005c80 00000020 00000000 00000020 RWIX CMPSS2 00005ca0 00000020 00000000 00000020 RWIX CMPSS3 00005cc0 00000020 00000000 00000020 RWIX CMPSS4 00005ce0 00000020 00000000 00000020 RWIX CMPSS5 00005d00 00000020 00000000 00000020 RWIX CMPSS6 00005d20 00000020 00000000 00000020 RWIX CMPSS7 00005d40 00000020 00000000 00000020 RWIX CMPSS8 00005d60 00000020 00000000 00000020 RWIX SDFM1 00005e00 00000080 00000000 00000080 RWIX SDFM2 00005e80 00000080 00000000 00000080 RWIX MCBSPA 00006000 00000024 00000000 00000024 RWIX MCBSPB 00006040 00000024 00000000 00000024 RWIX SPIA 00006100 00000010 00000000 00000010 RWIX SPIB 00006110 00000010 00000000 00000010 RWIX *** 00006120 00000010 00000000 00000010 RWIX WD 00007000 0000002b 00000000 0000002b RWIX NMIINTRUPT 00007060 00000007 00000000 00000007 RWIX XINT 00007070 0000000b 00000000 0000000b RWIX SCIA 00007200 00000010 00000000 00000010 RWIX SCIB 00007210 00000010 00000000 00000010 RWIX SCIC 00007220 00000010 00000000 00000010 RWIX SCID 00007230 00000010 00000000 00000010 RWIX I2CA 00007300 00000022 00000000 00000022 RWIX I2CB 00007340 00000022 00000000 00000022 RWIX ADCA 00007400 00000080 00000000 00000080 RWIX ADCB 00007480 00000080 00000000 00000080 RWIX ADCD 00007580 00000080 00000000 00000080 RWIX INPUTXBAR 00007900 00000020 00000000 00000020 RWIX XBAR 00007920 00000020 00000000 00000020 RWIX SYNCSOC 00007940 00000006 00000000 00000006 RWIX DMACLASRCSEL 00007980 0000001a 00000000 0000001a RWIX EPWMXBAR 00007a00 00000040 00000000 00000040 RWIX CLBXBAR 00007a40 00000040 00000000 00000040 RWIX OUTPUTXBAR 00007a80 00000040 00000000 00000040 RWIX GPIOCTRL 00007c00 00000180 00000000 00000180 RWIX GPIODATA 00007f00 00000030 00000030 00000000 RWIX RAMLS0 00008000 00000800 00000800 00000000 RWIX RAMLS1 00008800 00000800 000003e8 00000418 RWIX RAMLS2 00009000 00000800 000000ea 00000716 RWIX RAMGS0 0000c000 00001000 00001000 00000000 RWIX RAMGS7_RSVD 00013ff8 00000008 00000000 00000008 RWIX EMIF1 00047000 00000070 00000000 00000070 RWIX CANA 00048000 00000200 00000000 00000200 RWIX CANB 0004a000 00000200 00000000 00000200 RWIX DEVCFG 0005d000 0000012e 00000000 0000012e RWIX ANALOGSUBSYS 0005d180 00000048 00000000 00000048 RWIX CLKCFG 0005d200 00000032 00000000 00000032 RWIX CPUSYS 0005d300 00000082 00000000 00000082 RWIX ROMPREFETCH 0005e608 00000002 00000000 00000002 RWIX DCSMZ1 0005f000 00000023 00000000 00000023 RWIX DCSMZ2 0005f040 00000023 00000000 00000023 RWIX DCSMCOMMON 0005f070 00000008 00000000 00000008 RWIX MEMCFG 0005f400 00000080 00000000 00000080 RWIX EMIF1CONFIG 0005f480 00000020 00000000 00000020 RWIX ACCESSPROTECTION 0005f4c0 00000040 00000000 00000040 RWIX MEMORYERROR 0005f500 00000040 00000000 00000040 RWIX ROMWAITSTATE 0005f540 00000002 00000000 00000002 RWIX FLASH0CTRL 0005f800 00000182 00000000 00000182 RWIX FLASH0ECC 0005fb00 00000028 00000000 00000028 RWIX BL_JUMP_TABLE 00085df8 00000008 00000006 00000002 RWIX APP_JUMP_TABLE 00086000 00000008 00000000 00000008 RWIX
此外、我将在今天晚些时候接近硬件时获取 SP。
感谢你的帮助。 这个问题让我感到困惑:)
Colin、
我将通过 E2E 向您发送朋友请求、这在附件方面有更多的弹性。 您很快就会收到一条消息。
最棒的
Matthew
您好、Colin、
在链接器命令文件中、如果您将内容映射到闪存和 RAM 存储器、请注意、不保证加载 RAM 内容。
闪存插件专为完全嵌入式闪存应用而开发。 这意味着、链接器命令文件中所有已初始化的段都应映射到闪存。 如果需要从 RAM 执行任何操作、则在运行时应使用 memcpy()将该内容复制到 RAM 中、然后再执行该内容。
请参阅以下常见问题解答、了解有关此问题的更多信息:
[常见问题解答]闪存-如何将应用程序从 RAM 配置修改为闪存配置?: https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/878674
谢谢、此致、
Vamsi
Colin、
我即将回复与 Vamsi 类似的内容、尽管我没有他提供的背景(感谢 Vamsi)。 为了扩展 Vamsi 所说的内容、闪存插件本身使用一些 RAM 来对闪存进行编程、可能会对应在 RAM 中的代码进行重新编号、因为首先加载的代码。
也就是说、如果我将闪存工具设置为仅加载到 RAM (工具->片上闪存)、我就能够使 RAM 映像正确。 因此、在这种情况下、您也许可以正常加载一次(这将对闪存进行编程)、方法是在下图中选择 Erase/Program (擦除/编程)、然后进入闪存工具并仅选择 RAM。 然后再次加载.out、RAM 将被正确加载。 闪存仍将具有其首次加载时的内容。
正如 Vamsi 提到的、闪存工具更适用于最终映像、您可以在闪存中存储所有内容、并在稍后将其复制到 RAM 中、等等。 但我认为以上内容将有助于您的调试阶段。
最棒的
Matthew
感谢 Vamsi Gudivada 和 MatthewRate。
您的解释很有意义、我很感激周围的工作。
为了提供上下文、我们的.text 代码大小已发展到无法将所有内容放入所需 RAM 的程度。 和 RAM 构建可显著缩短开发周期。 因此、我尝试将一些基于库的代码写入闪存扇区(基本上是 ROM 库)、以便我们可以继续使用可用的 RAM 来处理我们正在积极开发的代码。
我对 ROM 库的处理方式将会非常脆弱。 (本质上、调用在链接器文件中未更改的 RTS、nanopb 等的扇区、并将它们放入闪存中)。 但是、由于我有专家在打电话、您能给我一些有关如何创建一个真正的 ROM 库的文档吗?我可以在不同的版本之间可靠地链接该库? 我想我想仿真 F2837xRevB_c1bootROM_CLADataROMSymbols_eabi_fpu32.lib 如何提供闪存中提供的符号的地址。
谢谢、
-科林
忽略 ROM 库问题。 我找到 了 www.ti.com/.../spraan5.pdf