TMS320F28P650SK: 程序运行多次后进入ILLEGAL_ISR

Part Number: TMS320F28P650SK


我的是关于电机控制的程序,在程序进行多次电机启停测试后进入了ILLEGAL_ISR,在进入ILLEGAL_ISR前,发现一些变量会变成不确定的值,这是我配置的。cmd文件

{
   BEGIN            : origin = 0x0A0000, length = 0x000002  // Update the codestart location as needed

   BOOT_RSVD        : origin = 0x000002, length = 0x0001AF     /* Part of M0, BOOT rom will use this for stack */
   RAMM0            : origin = 0x0001B1, length = 0x00024F
   RAMM1            : origin = 0x000400, length = 0x000400

   RAMD0            : origin = 0x00C000, length = 0x002000
   RAMD1            : origin = 0x00E000, length = 0x002000
   RAMD2            : origin = 0x01A000, length = 0x002000  // Can be mapped to either CPU1 or CPU2. When configured to CPU2, use the address 0x8000. User should comment/uncomment based on core selection
   RAMD3            : origin = 0x01C000, length = 0x002000  // Can be mapped to either CPU1 or CPU2. When configured to CPU2, use the address 0xA000. User should comment/uncomment based on core selection
   RAMD4            : origin = 0x01E000, length = 0x002000  // Can be mapped to either CPU1 or CPU2. When configured to CPU2, use the address 0xC000. User should comment/uncomment based on core selection
   RAMD5            : origin = 0x020000, length = 0x002000  // Can be mapped to either CPU1 or CPU2. When configured to CPU2, use the address 0xE000. User should comment/uncomment based on core selection

。。。。

   codestart        : > BEGIN
   .text            : > FLASH_APPA, ALIGN(8)
   .cinit           : > FLASH_APPA, ALIGN(8)
   .switch          : > FLASH_APPA, ALIGN(8)
   .reset           : > RESET, TYPE = DSECT /* not used, */
   .blt_mb          : > RAMM0, type = NOINIT, ALIGN(4)

   .stack           : > RAMM1

停止时候的寄存器值:

image.png

  • 您好,收到了您的案例,调查需要些时间,感您的耐心等待。

  • 您使用哪个示例工程? 对示例代码进行了任何更改?

  • 这不是一个示例工程,我们尝试增加栈空间,问题依旧存在

    目前项目在进行电机启停测试发现问题

    1.  测试到240多次,2个小时,程序进入ILLEGAL_ISR

    2.  测试过程中,程序中的某些全局变量变成未知的值

    3.  尝试增大栈大小,问题依旧

  • 您好,

    我已经帮您询问了此产品的产线专家。 由于下周有欧美假期、请预计回复会延迟。

  • 您好、

    问:什么原因导致了非法 (ITRAP) 中断?

    • 会对无效指令进行解码(这包括无效寻址模式)。
    • 已解码操作码值 0x0000。 此操作码对应于 ITRAP0 指令。
    • 对操作码值 0xFFFF 进行解码。 此操作码对应于 ITRAP1 指令。
    • 32 位操作尝试使用@SP 寄存器寻址模式。
    • 地址模式设置 AMODE=1 和 PAGE0=1、这是一个非法的组合。

    问:如何调试 ITRAP?

    • ITRAP 通常是栈溢出或缓冲区溢出的迹象。 若要快速查看它是否是栈、您可以使用已知值填充区域、然后运行应用程序。 通过写入到您的地址、您将能够看到堆栈的增长幅度。
    • 本应用手册提供了一种使用片上资源来检测栈溢出何时发生的方法:在 TMS320C28x DSP (spra820) 上进行在线栈溢出检测 。
    • 确保代码不会太接近有效存储器块的末尾(后面是无效的存储器)。 器件勘误表中对此进行了说明。
    • 确保在调用函数之前、如果有任何代码正在加载到闪存并从 RAM 运行、则应将其正确复制到 RAM。
    • 确保 CPU 没有预取到代码安全密码位置。
    • 在 ISR 中插入一条返回指令。 在该指令上设置一个断点、然后逐步查看代码的来源。
    • 另一种选择是查看堆栈。 当您采用非法指令陷阱时、寄存器会自动压入堆栈中、包括返回地址。 通过查看堆栈上的返回地址值、您可以找出 ITRAP 发生的位置。