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.

[参考译文] TMS320F28P659DK-Q1:在编译的项目 CCStudio 中进行分段时出现问题

Guru**** 2759145 points

Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1342618/tms320f28p659dk-q1-issue-with-segmentation-in-compiled-project-ccstudio

器件型号:TMS320F28P659DK-Q1
主题中讨论的其他器件:SysConfig

您好!

我目前正面临一个问题、那就是以十六进制格式对我编译的项目进行分段。 我编写了此项目、旨在将所有组件都包含在单个部分中。 但是、在检查后、我注意到有一个分段以不连续的起始地址分隔。

经过进一步调查、我发现映射文件中提及的地址对应于"cinit"字段。 但是、我已经确保为"cinit"链接的地址在同一地址字段中。

以下是我的链接器脚本的摘录:

"

部分
{
代码开始:>开始
.文本:> RAMLS0
cinit:> RAMLS0
.switch:> RAMLS0
.reset:> reset,type = DSECT /*未使用,*/

.stack:> RAMM0
#if defined (__TI_EABI __)
bss :> RAMLS0
.bss:输出:> RAMLS0
init_array :> RAMLS0
.const :> RAMLS0
.data:> RAMLS0
.sysmem :> RAMLS0
#else
更多信息:> RAMLS0
.ebss :> RAMLS0
econst :> RAMLS0
.esysmem :> RAMLS0
#endif

ramgs0:> RAMGS0、type=NOINIT
ramgs1:> RAMGS1、type=NOINIT
ramgs2:> RAMGS2、type=NOINIT

MSGRAM_CPU1_TO_CPU2 > CPU1TOCPU2RAM、类型= NOINIT
MSGRAM_CPU2_TO_CPU1 > CPU2TOCPU1RAM、类型= NOINIT

//这些定义特定于 SDFM
Filter_Regs:52 > RAMGS0
filter1_RegsFile:> RAMGS1、fill=0x1111
Filter2_RegsFile:> RAMGS2、fill=0x2222
Filter3_RegsFile:> RAMGS3、fill=0x3333
Filter4_RegsFile:> RAMGS4,fill=0x4444

.TI.ramfunc:{}> RAMLS0
DataBufferSection :{}> RAMD0

"}"

对于如何解决此问题、如果有任何见解或指导、我将不胜感激。 我的目标是将所有组件都放在一个句段内、而不会出现任何意外的分离。

提前感谢您的帮助。

此致、
马里奥

 

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

    我相信在创建 hex 文件时使用映像模式可以解决这个问题。  请在 C28x 汇编工具手册 中搜索标题为" 映像模式"和--fill 选项的子章节。  如果这样无法解决问题、请 在下一篇文章中附加链接器映射文件。  因此该论坛将接受它、将文件扩展名添加到 .txt  反馈回路。

    谢谢。此致、

    -乔治

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

    你好

    如何    正确设置映像模式选项

    这是我的 链接器映射文件: e2e.ti.com/.../empty_5F00_c28x_5F00_dual_5F00_sysconfig_5F00_cpu1.txte2e.ti.com/.../28p65x_5F00_generic_5F00_ram_5F00_lnk_5F00_cpu1.txt

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

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

    我认为链接器映射文件和最后一个十六进制文件屏幕截图是针对相同构建的。  它在映射文件中显示...

    .data      0    0000a4b4    00000010     UNINITIALIZED
    

    这说明了 .数据 段从地址0xa4b4开始、其长度为0x10字、且未初始化。  十六进制实用程序会跳过任何未初始化的段、因此地址0xa4b4应该没有输出。  但在十六进制文件的屏幕截图中、在您以红色下划线的第一行中、它在地址0xa4b4处显示4个16位字。  我无法解释这一点。

    请准确显示如何调用十六进制实用程序。  请复制并粘贴命令的文本、不要使用屏幕截图。  请压缩可执行文件  empty_C28x_dual_sysconfig _cpu1.out 并将其附加到您的下一篇文章。  下一步是复制该十六进制文件输出。

    谢谢。此致、

    -乔治

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

    你好

    很抱歉、发送的 hex 文件屏幕截图已过期。 我现已在附件"寓言"中提供了您可能需要的所有必要文件:

    e2e.ti.com/.../empty_5F00_c28x_5F00_dual_5F00_sysconfig_5F00_cpu1_5F00_hex.txte2e.ti.com/.../empty_5F00_c28x_5F00_dual_5F00_sysconfig_5F00_cpu1_5F00_map.txte2e.ti.com/.../6303.empty_5F00_c28x_5F00_dual_5F00_sysconfig_5F00_cpu1.zip

    对于  如何调用十六进制实用程序的命令,可能是 "--memwidth=16 --order=MS --romwidth=16 --intel"。

    谢谢
    马里奥

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

    尊敬的 Mario:

    谢谢!  我会为 George 看几天的。 我将提出一些问题以便赶上来。  在您提供的新的十六进制输出中、我可以重现、我不确定我看到的.data 段存在与 George 之前观察到的相同的问题。  另外、.cinit 似乎是连续布局的。  您能否澄清一下您仍然看到某个特定问题?  旧屏幕截图和新屏幕截图之间发生了什么变化?

    您是否能够尝试使用映像模式来确定效果是什么?  正如 George 在上文关于如何操作时所说的那样、

    请在 C28x 汇编工具手册 中搜索标题为" 图像模式"和--fill 选项的子章节

    谢谢。

    阿兰

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

    您好

    在我的新十六进制输出文件中、.cinit 段在末尾保持非连续。 旧文件和新文件之间的唯一更改是添加一些代码、这应该不会影响这个问题。

    关于映像模式、'C28x 汇编工具手册'描述了如何使用它、但没有指定如何对其进行设置。 在线教程建议在工程文件夹中创建一个像'hex.cmd'这样的文件、并在特定字段中设置此文件的路径。

    在 hex.cmd 文件中、我已经将函数

    empty_c28x_dual_sysconfig_cpu1.out
    --image
    --memwidth 16
    
    ROMS
    {
     codestart: org = 0x00000000, len = 0x2, romwidth = 16
     RAM1: org = 0x00008000, len = 0x4000, romwidth = 16
    }
    

    但它会给我一些错误:

    HEX 文件变为空

    您对此有什么具体的理由吗?

    谢谢
    马里奥

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

    我明白了--是的,你是正确的,这些段不是连续的,因为.const 段和.cinit 段之间有间隙。  图像模式旨在填充这些空穴。

    至于映像模式--是的,您需要一个带有 ROMS 指令的 CMD。  这里进行的操作是将十六进制输出拆分成两个文件、每个文件对应 ROM 中的每个区域。   第一个(EMPTY_C28x_dual_sysconfig _cpu1.I00)具有4个字节(2个字)、从0x0开始表示"codestart"、第二个(EMPTY_C28x_dual_sysconfig _cpu1.I01)具有 RAM1、其余字节从0x8000开始。 空洞会填充到每个区域的每个文件中、因此内容是连续的。

    您可以选择在 ROMS 指令中为整个范围包含一个区域、但映像模式将填充 codestart 和 RAM1之间的大缺口。

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

    你好

    但是、当将此 CMD 文件与 ROMS 指令一同使用时、会出现一些错误、生成的十六进制文件最终为空。 可能是我错过了一些设置吗?

    您对此有什么具体的理由吗?

    谢谢
    马里奥

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

    当我运行你的 CMD 文件,我看到一些警告,我怀疑是良性的--你在上面张贴的片段没有显示任何错误,你能显示你看到的错误吗(不仅仅是警告)?  我还看到生成了两个十六进制文件、每个文件对应 ROM 中指定的存储器范围:

    ls -al empty_c28x_dual_sysconfig_cpu1.i*
    -rw-r--r-- 1 a0216276 lang    32 Apr  8 10:38 empty_c28x_dual_sysconfig_cpu1.i00
    -rw-r--r-- 1 a0216276 lang 77836 Apr  8 10:38 empty_c28x_dual_sysconfig_cpu1.i10
    

    您在上面嵌入的第一个 存储器不是空的、但显示第一个存储器范围的内容、该范围只有4个字节(2个字)、从地址0x0开始。 这也是我在使用过程中看到的:

    cat empty_c28x_dual_sysconfig_cpu1.i00
    :040000000040A37C9D
    :00000001FF
    

    但是、第二个文件会显示第二个范围的内容(这是顶部的一个片段):

    cat empty_c28x_dual_sysconfig_cpu1.i10
    :20800000FE049641901FFF809642CC411F00FFC7964376228F05D310A8A90D428AA92D4364
    :208010000201563B98C499CC761AFE840006FF2000008F05D22E40C46C029B01530061026C
    :208020009A01000676228F05D22E1AC40002761A0006FE0296417622520160058F05D2224E
    :208030002BC46F09934190018F05D222FFD0FF87CAA896C4761AFE820006FE021E427622AD
    :208040008A42CCC4FFF0500A96C4761AFE820006FE021E4276228A42CCC4FFF0500596C419
    :20805000761AFE820006FE021E4276228A42CCC4FF0F505096C4761AFE820006FE021E4228
    :2080600076228A42CCC40FFF1AA9500096C4761AFE820006FE047C431E4228A90A005443E8
    ...

    您能否验证在运行该工具时实际生成了哪些文件?  我正在运行您正在运行的 hex2000工具的同一版本。

    谢谢。

    阿兰

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

    您好!

    是的、回答正确。 现在、我可以创建两个连续且正确的十六进制文件。 但是、当我尝试创建二进制文件时、它不会生成正确的值。 您是否也遇到过此问题?

    谢谢。
    马里奥

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

    感谢您的验证!

    如果 ROM 配置相同、二进制输出类似地存储在两个文件中。  您能否详细说明观察到的不正确的值。

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

    您好

    在第一个文件中、它应为"0040 A38A"、但仅为"0040"。 第二个文件中应存在所有数据、但全部为"FFFFFFF"。

    e2e.ti.com/.../empty_5F00_c28x_5F00_dual_5F00_sysconfig_5F00_cpu1_5F00_bin.txte2e.ti.com/.../empty_5F00_c28x_5F00_dual_5F00_sysconfig_5F00_cpu1_5F00_b10.txte2e.ti.com/.../empty_5F00_c28x_5F00_dual_5F00_sysconfig_5F00_cpu1_5F00_d.txt

    谢谢

    马里奥

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

    谢谢。  您能否确认用于构建二进制格式的十六进制工具命令行选项以及从生成 Intel 十六进制文件开始可能发生变化的任何其他选项? 或者输入是否与您之前针对 Intel hex 仅针对二进制格式所做的输入相同?  我在您发布的日志中没有看到它。

    阿兰

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

    您好

    我所做的唯一更改是从 Intel Hex 转换为二进制。  

    这些信息是否有帮助?

    谢谢  
    马里奥

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

    谢谢。 在这里创建一个二进制文件有点棘手。 为使其正常工作、需要以某种方式调整 ROMS 指令。  

    该链接线程中有一个点描述了您可以尝试使用十六进制实用程序

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1113498/tms320f280025c-post-build-to-generate-bin-file-the-size-is-too-big/4138341#4138341

    忽略有关 tiobj2bin 的器件以及它之前的所有内容;由于该工具中的错误、该器件无法用于 ELF 文件。

    还有一种替代方法涉及使用十六进制实用程序生成 Motorola 格式的十六进制文件、然后使用称为 srec_cat 的第三方(非 TI)工具将该 Motorola 十六进制文件转换为二进制文件、如下所示:

    hex2000 --motorola=3 --byte --romwidth=16 eabi_executable_file.out -o motorola_file.hex

    srec_cat motorola_file.hex -byte-swap -offset - -minimum-address motorola_file.hex -o binary_file.bin -binary

    这可能有用。