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.

[参考译文] CCS/TMS320F28379D:调试器卡在.cinit Boot 28.asm 中

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/808380/ccs-tms320f28379d-debuger-got-stuck-in-cinit-boot-28-asm

器件型号:TMS320F28379D

工具/软件:Code Composer Studio

我正在编写一个包含 I2C 的器件编程、 而另一个包含 ECAP、SCI 等模块的器件编程。

首先、我将他们分开、因为我是新学员。  

两个都是独立的、工作正常。

但是、当我尝试组合这两个程序时、现在它被捕获在  进程 CINIT 初始化表中。

为什么会这样呢? 以及如何从这种情况中获得帮助?

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

    cinit 段保存在运行时复制到 RAM 中的初始化程序变量。  如果您有大量的初始化数据、则该过程可能需要很长时间-看门狗计时器跳闸并重置器件所需的时间足够长-因此看起来您总是卡在该例程中。 尝试注释掉任何大型已初始化数组。

    您还可以通过将文件"F2837xD_CodeStartBranch.asm"的此行中的 WD_DISABLE 设置为1来禁用看门狗。

    WD_DISABLE .set 0  ;设置为1以禁用 WD、否则设置为0

    如果两者都不起作用、请随意压缩并将代码附加到文章中、我将尝试找到它。

    此致、

    Richard

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

    尊敬的 Richard:

    感谢您的即时回复。

    cinit 段保存在运行时复制到 RAM 中的初始化程序变量。  如果您有大量的初始化数据、则该过程可能需要很长时间-看门狗计时器跳闸并重置器件所需的时间足够长-因此看起来您总是卡在该例程中。 尝试注释掉任何大型已初始化数组。

    您还可以通过将文件"F2837xD_CodeStartBranch.asm"的此行中的 WD_DISABLE 设置为1来禁用看门狗。

    我尝试删除了不必要的初始化数据  ,并且还禁用了看门狗。

    现在还有其他问题。

    它会卡在下面的环路中:

    #if (((defined (_inline)|| defined (_MEMHET)))&&\
    !(defined (_TMS320C6x)&&!defined (__C6x_migration__)))&&\
    !defined (__ARM_ARCH)&&!defined (__ARP32__)&&!defined (__Frozen __)

    为什么会发生这种情况?

     

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

    如果不查看更多代码、就无法说。 请压缩并发布您的项目、我将进行介绍。  谢谢。

    此致、

    Richard

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

    尊敬的 Richard

    感谢您的支持。

    真的很抱歉。 实际上、我处于这样的状态、我无法向您公开发送代码。

    string.h 卡死问题现在消失了。

    我将继续 添加更多代码。

    我必须添加更多浮点数据类型数组。 每个数组包含11个元素。

    我必须使用这些数组进行内插。

    但问题是,一旦我在工作代码“正在调用中断非法操作处理程序()”中添加了一个数组。 我不知道为什么。

    这是内存问题吗?

    正在添加程序的屏幕截图: 我要在程序中添加注释的数组,并且在解压缩这些数组后,我共享了 CCS 运行模式的屏幕截图。

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

    这可能是内存问题。  非法操作通常是由于无效的操作码获取或非法的存储器访问而产生的。  检查阵列索引以确保您的读数不在范围之外。  您有多少个这样的数组?

    此致、

    Richard

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

    我有11个数组(每个数组包含11个元素)。

    数组的数据类型为浮点。

    如果我保留5个数组代码正常工作。

    当我保留所有11个数组后,它将进入  “中断非法操作处理程序()”

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

    242个字不多。 我对它的存储器位置有疑问、但请查看链接器文件、并查看映射文件、以确保知道数组在存储器中的位置。  

    我很确定问题在您的代码中的某个位置。  请按照我的建议检查阵列索引。  这可能很简单、但我认为如果不查看项目或至少部分代码、我无法提供更多指导。

    此致、

    Richard

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

    很抱歉打扰你。

    如何检查 存储器中哪些阵列的映射文件?

    如何检查阵列索引?

    我真的很抱歉这个愚蠢的问题、但我的脑海中有很多疑问、

    我已附加 RAM 链接器(在 pdf 中转换)文件、我的项目中的主 C 代码源文件以及代码的内存分配。

    看起来.stack 和.text 段已满。

    e2e.ti.com/.../Closed_5F00_Loop_5F00_All_5F00_Altitude.c

     e2e.ti.com/.../ram.pdf

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

    感谢您发送信息、没有任何问题。

    您的链接器命令文件看起来正常。 如果成功完成、您可以选择性地告诉链接器生成".map"文件。 您可以将文件命名为'Project->Properties->CCS Build->C2000 Linker->Basic Options'。 这是一个文本文件、您可以在编辑器中打开、以查看符号链接在何处以及每个存储器块的使用量。 您的数组应最终位于.ebss 段中、我认为这是从内存分配中进行的。

    顺便说一下、如果要将特定变量映射到特定的存储器块、可以使用 DATA_SECTION pragma 来执行此操作。 有关这方面的更多信息、请参阅 C 编译器指南(spru514)的第6.10节。

    我无法从代码中看到如何使用数组、但我的意思是检查数组索引、确保您不会意外地尝试访问超出有效范围的元素。 例如,一个11元素数组可以是:
    浮点 A[11];

    如果使用...访问元素
    x = A[i];
    ...那么我必须在0到10的范围内。 它必须不能高于11或更高、否则您可能会在无效的存储器中导致您看到的 Estop。 我建议您单步执行您的代码、以满足您从未发生过的情况。

    我在代码中看不到任何可能导致这种情况的明显结果。 您是否也能发布映射文件?

    此致、

    Richard

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

    Richard。  我没有尝试访问超出程序中数组有效范围的元素。

    我发现堆栈内存有一个问题。

    在我的代码中,我使用的是 sprintf(),它需要更多的堆栈内存。 我认为这是导致错误的原因之一。

    当我注释 sprint()函数代码工作正常时。

    现在的问题是如何为.stack 段添加更多内存。 我已经为    堆栈分配了 RAMGS13:origin = 0x019000,length = 0x001000内存,在  'Project->Properties->CCS Build->C2000 Linker->Basic Options -> Set C system stack sizes'中将 C 系统堆栈大小增加到0x1000。

    在 RAM_lnk_CPU1.cmd 文件中有 RAMGS14   :origin = 0x01A000,length = 0x001000存在,但未使用。

    我需要组合这两个存储器。 以便我将更多内存分配给.stack 段。   

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

    堆栈溢出是有道理的、但您无法在那里分配堆栈。  在 C28x 上、栈指针的宽度仅为16位、因此.stack 段必须位于0x10000以下的存储器中。  为了找到大于0x400的连续块、需要对其他段进行杂耍。

    此致、

    Richard

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

    我已附加代码的存储器.map 文件。 在该模块摘要中,总计为10270。

    您说过"在 C28x 上、栈指针的宽度仅为16位、因此.stack 段必须位于0x10000以下的存储器中"我没有收到这条语句。
    我必须使用 sprintf()函数,我将其用于 SCI。 我正在使用 SCI 向计算机发送10个参数、以便我可以存储它们。

    是否有办法克服这个问题?

    e2e.ti.com/.../MemoryMap.pdf

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

    在您之前发送的链接器命令文件中、您有以下行:

    RAMGS13:origin = 0x019000,length = 0x001000

    (笑声)

    .stack:>RAMGS13,page = 1.

    我说您不能将.stack 段放置在高于0xFFFF 的存储器范围内。  堆栈使用长度仅为16位的指针、因此无法访问。  这就是您的问题。

    解决此问题的一种方法是将 SDFM 滤波器段移至更高的存储器地址、并将.stack 放入 RAMGS2中、例如:

    .stack:>RAMGS2,page = 1.

    filter1_RegsFile:> RAMGS5,PAGE = 1,fill=0x1111

    Filter2_RegsFile:> RAMGS6,PAGE = 1,fill=0x2222  

    Filter3_RegsFile:> RAMGS7,PAGE = 1,fill=0x3333

    Filter4_RegsFile:> RAMGS8,PAGE = 1,fill=0x4444

    Differit_RegsFile:>RAMGS9,page = 1,fill=0x3333

    此致、

    Richard

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

    尊敬的 Richard

    1000谢谢。

    将 SDFM 滤波器移至更高的存储器地址并将.stack 放入 RAMGS2、适用于我的程序。

    再次感谢您耐心地回答问题。