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, scic92if (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 93if (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 93if (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 100if (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 101if (myHwi == NULL) {System_abort("Hwi create CANA1_TX_ISR failed");}Hwi_enableInterrupt(101);Error_init(&eb);
Ben Qin:
你好,你参考过下面链接中的示例代码吗?
software-dl.ti.com/…/Hwi.html
,
Ava Guo:
是的,SCI相关的中断一直都运行正常的,已经测试一段时间了,现在需要增加can相关的功能和中断,can中断的配置是参照sci做的:
1、如果屏蔽任一个sci的中断,CPU2在线调试都是正常的,而且两个can中断也都能正常执行。
2、如果sci和can都按照上传的程序那样配置,CPU2在线调试就会出现异常。
想咨询一下,这个会是因为增加的中断程序,导致堆栈出问题了吗?
,
Ben Qin:
Ava Guo 说:想咨询一下,这个会是因为增加的中断程序,导致堆栈出问题了吗?
试过增加堆栈大小吗?
,
Ava Guo:
有通过图1界面修改过堆栈大小,将0x200改为0x800,未解决问题。
图2是异常情况下的memory allocation界面显示的内容。
图3是cmd文件配置
,
Ben Qin:
我咨询下相关资深工程师后回复您。
,
Ben Qin:
你好,下面是工程师的回复:
我认为如果是堆栈问题,它可能会崩溃。您是否看到崩溃,或者您只是错过了预期的中断或看到任务卡住了?不过,如果您担心,可以使用连接调试器的 ROV 工具来检查系统堆栈使用情况。
这可能是 CPU 带宽问题,具体取决于中断运行的频率以及每个 Hwi 函数执行所需的时间。在用户Hwis之上,SYS / BIOS可能至少为时钟周期计时器添加了一个。您还需要记住 Hwi 调度程序代码的开销。如果您想尝试计算 Hwis 使用的 CPU 周期,这里有一些基准测试。
,
Ava Guo:
您好,
Ben Qin 说:我认为如果是堆栈问题,它可能会崩溃。您是否看到崩溃,或者您只是错过了预期的中断或看到任务卡住了?
请问我应该如何查看是否崩溃?在线连接CPU2进行仿真,下载程序后,CPU2就立即进入running状态,实际上CPU2的所有程序均未执行。
Ben Qin 说:这可能是 CPU 带宽问题,具体取决于中断运行的频率以及每个 Hwi 函数执行所需的时间。在用户Hwis之上,SYS / BIOS可能至少为时钟周期计时器添加了一个。您还需要记住 Hwi 调度程序代码的开销。如果您想尝试计算 Hwis 使用的 CPU 周期,这里有一些基准测试。
这个是不是要查看新增的中断是否出现超出中断时间的现象?
,
Ben Qin:
Ava Guo 说:请问我应该如何查看是否崩溃?在线连接CPU2进行仿真,下载程序后,CPU2就立即进入running状态,实际上CPU2的所有程序均未执行。
你的意思是你想在main()停住程序但是它却直接跑起来了?如果你暂停了是什么在执行?是卡在了某处吗?能够打开ROV看看吗?如果 main() 的开头放置了一个 ESTOP0,它会在那里停止,还是在到达 main() 之前就被卡住?
Ava Guo 说:这个是不是要查看新增的中断是否出现超出中断时间的现象?
是的,它是为了大致计算在中断上下文中花费的时间百分比。然而,听起来应用程序可能不会进入 main() (更不用说 Hwi_create 调用),所以这可能不是问题.
,
Ava Guo:
1、如下图所示,在线调试,下载程序后“CPU1的状态是正常的,再手动点击运行按键即可执行CPU1程序”,但是CPU2直接就变为running,实际CPU2并没有执行程序
2、此时点击暂停按键,使CPU2暂停,会变为下图所示的状态
3、我使用的xdctools的版本为xdctools_3_32_00_06,在ROV中点击connect,会报错
4、在main中增加ESTOP0,下载程序后,CPU2还是会直接running
,
Ben Qin:
已向工程师跟进
,
Ben Qin:
Ava Guo 说:2、此时点击暂停按键,使CPU2暂停,会变为下图所示的状态
所以CPU2 正在启动并跳转到程序入口点,但卡在了 pre-main() SYS/BIOS 初始化代码中。看起来初始化 Hwi 堆栈时可能遇到问题。CPU2应用程序中堆栈放置在哪里?它有多大?增加系统堆栈大小是否会改变行为?
Ava Guo 说:我使用的xdctools的版本为xdctools_3_32_00_06,在ROV中点击connect,会报错
用ROV Classic试一下。