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.

[参考译文] TMS320F28234:发生进入 ILLEGAL_ISR

Guru**** 2478765 points
Other Parts Discussed in Thread: C2000WARE, TMS320F28234

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1457762/tms320f28234-entering-illegal_isr-occurs

器件型号:TMS320F28234
主题中讨论的其他器件:C2000WARE

工具与软件:

尊敬的所有人:

   我的 MCU 恰好进入 ILLEGAL_ISR。

   数千种使用相同代码的产品已经投入运行多年。 当前有一个产品(MCU)触发 ILLEAGAL ISR。

   我无法在工厂中重现此现象。

  我检查  TI 文档中 ILLEGAL_ISR 的触发条件、

  关于触发条件"32位操作尝试使用[@SP]寄存器寻址模式"。  

  我不知道我是否违反了这个。

  以下是​​ST1的设置值(我在调用 c_int00 ()后在 CCS 中读取该寄存器、所有代码都用 C 语言写入):

    MOM1MAP = 1、OBJMODE = 1、AMODE = 0、PAGE0 = 0

   DSP2833x_CodeStartBranch.asm 中的代码 如下所示(在"LB _c_start"之后、所有代码都用 C 语言编写):

     WD_DISABLE .set 1

     .ref _c_int00
     .global code_start
     .ref _c_start
     _stack:.usect ".stack"、0  

     香港特别行政区政府在香港特别行政区的工作
     *函数: codestart 段
     *
     *说明:分支到代码起点
     香港特别行政区政府在香港特别行政区的工作

    .sect "codestart"

     CODE_START:
     .if WD_DISABLE == 1.
     LB wd_disable;Branch to watchdog disable code
     .else
     LB _c_int00;Branch to start of boot.asm in RTS library (分支到 RTS 库中的 boot.asm 的起始位置)
     .endif

     ;结束 codestart 段


    香港特别行政区政府在香港特别行政区的工作
    *函数: wd_disable
    *
    *说明:禁用看门狗定时器
    香港特别行政区政府在香港特别行政区的工作
    .if WD_DISABLE == 1.

    ;.text  
    .sect "ROM1"  
    WD_DISABLE:
    SETC OBJMODE               ;为28x 目标代码设置 OBJMODE
    EALLOW                      ;Enable EALLOW protected register access (启用 EALLOW 保护寄存器访问)
    MOVZ DP、#7029h>>6.           ;设置 WDCR 寄存器的数据页
    MOV @7029h、#0068h           ;设置 WDCR 中的 WDDIS 位以禁用 WD
    EDIS                         ;禁用 EALLOW 受保护的寄存器访问

     
    MOV SP、##_stack  ;设置为栈空间的开头
    SPM 0            ;将产品移位设置为0
    C28OBJ          ;选择 C28x 对象模式
    C28ADDR         ;清除寻址模式
    C28MAP          ;设置块 M0和 M1模式
    CLRC PAGE0      ;使用堆栈寻址模式
    MOVW DP、#0      ;初始化 DP 以指向低64K
    CLRC OVM       ;关闭溢出模式
    asp             ;确保 SP 已对齐

 
    LB _c_start

   .endif

   ;结束 wd_disable

   .end

谢谢

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

    您好!

    您是否能够单步执行此代码并查看导致非法 ISR (ITRAP)分支的行?

    此外、 更改 C2000ware 提供的 DSP2833x_CodeStartBranch.asm 文件的原因是什么?

    此致、

    Delaney

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

    尊敬的 Delaney:

       我无法重现此行为、因此我不知道线路导致非法 ISR 的位置。

      对不起, 我是这个程序的维护者。 我不知道开发人员(他已经辞职)为何要修改 CodeStartBranch.asm 文件。

       关于非法 ISR 触发条件"一个32位操作尝试使用[@SP]寄存器寻址模式"和"一个无效指令被解码"。  如果我的程序都是用 C 编写的、这是否会被违反?

       关于"Address mode setting"、如果我没有特意使用 asm 代码来设置、在 CodeStartBranch.asm 中设置之后、它是否会再次发生更改?

    谢谢

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

    您好!

    请查看 C28x 指令集指南( 此处链接)以验证正在使用的汇编代码。 让我让编译器专家环聊您的问题。

    此致、

    Delaney

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

    您好!

    您能否介绍中断常见问题解答以及识别 ITRAP 的步骤。

    https://software-dl.ti.com/C2000/docs/c28x_interrupt_faq/html/index.html

    此致、

    Ozino

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

    尊敬的 Ozino Odharo,

      1. 我在 CCS 的存储器分配窗口中确认了.text 段的存储器块和 ramfunc 段的存储器块的使用。 剩余的数量都比8个字大得多。

         a. codestart 段的内存块(0x33FFF6~0x33FFF7)被全部使用。  这种行为合适吗?

      2. 我通过观察 CCS 的"Memory Browser"窗口中的值变化来确认堆栈存储器块的使用。  堆栈使用量约为10%。

      3、 关于"确保 CPU 不会预取代码安全密码位置"。 我不明白这是什么意思。 此错误是由覆盖"安全密码"位置的程序存储块范围引起的吗?

      4. 我不明白"[@SP]寄存器寻址模式"是什么意思。 它是否意味着"PAGE0 = 0"?

      5. 在文档中的什么位置可以判断哪个指令是32位操作?

    谢谢

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

    您好!

    codestart 段被映射到上述地址是有原因的吗? 这是基于 RAM 还是基于闪存的应用? 通常、codestart 被映射到链接器命令文件中与闪存组入口点相关联的开始段。

    #3是的、这些是与代码安全模块相关的 CSM 密码。 应该注意的是、这个位置的修改会导致器件复位并将闪存置于一个未知状态。

    F2823x 闪存 API 参考指南 请参阅本文档中的第15节了解详情。

    此致、

    Ozino

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

    尊敬的 Ozino Odharo,

      我的应用是基于闪存的应用。 对于 TMS320F28234、 引导至闪存入口点位于 0x33 FFF6 - 0x33 FFF7。

      在 C2000Ware 示例代码中、 开始部分也位于 0x33 FFF6 - 0x33 FFF7。  因此、我认为这应该没问题。

      我 已经了解32位运算的含义。

    谢谢