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.

TMS320F28377D: 增加中断后在线调试程序会跑飞

Part Number: TMS320F28377D

CPU2中的中断采用Hwi_create创建,原来程序中已有三个SCI收发中断,创建两个can中断后,CPU2程序在线调试,下载程序后会立即running。屏蔽其中任一个中断,则异常消失,请问这种现象会是因为什么引起的?

    Hwi_Handle myHwi;
    Error_init(&eb);

    myHwi = Hwi_create(92, SCIC_RX_ISR_, NULL, &eb);   //scia 96, scib 98, scic92
    if (myHwi == NULL) {
    System_abort("Hwi create SCIC_RX_ISR failed");
    }
    Hwi_enableInterrupt(92);
    Error_init(&eb);

    myHwi = Hwi_create(93, SCIC_TX_ISR_, NULL, &eb);   //scia 97, scib 99, scic 93
    if (myHwi == NULL) {
    System_abort("Hwi create SCIC_TX_ISR failed");
    }
    Hwi_enableInterrupt(93);
    Error_init(&eb);

    myHwi = Hwi_create(99, SCIB_TX_ISR_, NULL, &eb);   //scia 97, scib 99, scic 93
    if (myHwi == NULL) {
    System_abort("Hwi create SCIB_TX_ISR failed");
    }
    Hwi_enableInterrupt(99);
    Error_init(&eb);

    myHwi = Hwi_create(100, CANA0_RX_ISR_, NULL, &eb);   //cana 100
    if (myHwi == NULL) {
        System_abort("Hwi create CANA0_RX_ISR failed");
    }
    Hwi_enableInterrupt(100);
    Error_init(&eb);

    myHwi = Hwi_create(101, CANA1_TX_ISR_, NULL, &eb);   //cana 101
    if (myHwi == NULL) {
        System_abort("Hwi create CANA1_TX_ISR failed");
    }
    Hwi_enableInterrupt(101);
    Error_init(&eb);

  • 你好,你参考过下面链接中的示例代码吗?

    software-dl.ti.com/.../Hwi.html

  • 是的,SCI相关的中断一直都运行正常的,已经测试一段时间了,现在需要增加can相关的功能和中断,can中断的配置是参照sci做的:

    1、如果屏蔽任一个sci的中断,CPU2在线调试都是正常的,而且两个can中断也都能正常执行。

    2、如果sci和can都按照上传的程序那样配置,CPU2在线调试就会出现异常。

    想咨询一下,这个会是因为增加的中断程序,导致堆栈出问题了吗?

  • 想咨询一下,这个会是因为增加的中断程序,导致堆栈出问题了吗?

    试过增加堆栈大小吗?

  • 有通过图1界面修改过堆栈大小,将0x200改为0x800,未解决问题。

    图2是异常情况下的memory allocation界面显示的内容。

    图3是cmd文件配置

  • 我咨询下相关资深工程师后回复您。

  • 你好,下面是工程师的回复:

    我认为如果是堆栈问题,它可能会崩溃。您是否看到崩溃,或者您只是错过了预期的中断或看到任务卡住了?不过,如果您担心,可以使用连接调试器的 ROV 工具来检查系统堆栈使用情况。

    这可能是 CPU 带宽问题,具体取决于中断运行的频率以及每个 Hwi 函数执行所需的时间。在用户Hwis之上,SYS / BIOS可能至少为时钟周期计时器添加了一个。您还需要记住 Hwi 调度程序代码的开销。如果您想尝试计算 Hwis 使用的 CPU 周期,这里有一些基准测试。

  • 您好,

    我认为如果是堆栈问题,它可能会崩溃。您是否看到崩溃,或者您只是错过了预期的中断或看到任务卡住了?

    请问我应该如何查看是否崩溃?在线连接CPU2进行仿真,下载程序后,CPU2就立即进入running状态,实际上CPU2的所有程序均未执行。

    这可能是 CPU 带宽问题,具体取决于中断运行的频率以及每个 Hwi 函数执行所需的时间。在用户Hwis之上,SYS / BIOS可能至少为时钟周期计时器添加了一个。您还需要记住 Hwi 调度程序代码的开销。如果您想尝试计算 Hwis 使用的 CPU 周期,这里有一些基准测试。

    这个是不是要查看新增的中断是否出现超出中断时间的现象?

  • 请问我应该如何查看是否崩溃?在线连接CPU2进行仿真,下载程序后,CPU2就立即进入running状态,实际上CPU2的所有程序均未执行。

    你的意思是你想在main()停住程序但是它却直接跑起来了?如果你暂停了是什么在执行?是卡在了某处吗?能够打开ROV看看吗?如果 main() 的开头放置了一个 ESTOP0,它会在那里停止,还是在到达 main() 之前就被卡住?

    这个是不是要查看新增的中断是否出现超出中断时间的现象?

    是的,它是为了大致计算在中断上下文中花费的时间百分比。然而,听起来应用程序可能不会进入 main() (更不用说 Hwi_create 调用),所以这可能不是问题.

  • 1、如下图所示,在线调试,下载程序后“CPU1的状态是正常的,再手动点击运行按键即可执行CPU1程序”,但是CPU2直接就变为running,实际CPU2并没有执行程序

    2、此时点击暂停按键,使CPU2暂停,会变为下图所示的状态

    3、我使用的xdctools的版本为xdctools_3_32_00_06,在ROV中点击connect,会报错

    4、在main中增加ESTOP0,下载程序后,CPU2还是会直接running

  • 已向工程师跟进

  • 2、此时点击暂停按键,使CPU2暂停,会变为下图所示的状态

    所以CPU2 正在启动并跳转到程序入口点,但卡在了 pre-main() SYS/BIOS 初始化代码中。看起来初始化 Hwi 堆栈时可能遇到问题。CPU2应用程序中堆栈放置在哪里?它有多大?增加系统堆栈大小是否会改变行为?

    我使用的xdctools的版本为xdctools_3_32_00_06,在ROV中点击connect,会报错

    用ROV Classic试一下。

  • 您好,我这边修改了cfg文件中的BIOS.heapsize,将这个值改小之后,问题解决了。请问,这个空间改小就解决的原理是什么?是否会引起新的问题?

  • 下面是工程师的回复:

    That doesn't really make sense to me. It makes me wonder if making the heap smaller just shifted the stack or some other section into a different memory block and avoided whatever scenario was causing the original issue. You might want to try taking a look at the .map file and see if there were any significant changes to section allocation before and after the heap size change that might explain a difference in behavior.

    Given that this is code running on CPU2, I'd double check which GSxRAM sections are being used an whether or not CPU2 has access to them by the time SYS/BIOS is running its initialization.