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.

[参考译文] 重复执行程序

Guru**** 2535750 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1193039/program-repeats

器件型号:TMS320F28386S

在下面的程序中、我在第一个可执行行上设置一个断点。 如果我点击"Continue"、它将完成程序并返回到断点。 这种情况反复发生。 调试器应该会停止、但不会停止。

//main.c

#include "driverlib.h"
#include "device.h"

//
// Main
//
uint32_t main(void)
{
    Device_init();
    Device_initGPIO();

    Interrupt_initModule();
    Interrupt_initVectorTable();

    //
    // Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
    //
    EINT;
    ERTM;

    return(0);
}

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

    尊敬的 John:

    如果您能够单步执行该程序、它是否曾到达 f2838x_codestartbranch_CPU1.asm 文件?从该循环返回后、应开始清理过程。

    谢谢、

    查尔斯

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

    是的、它就在那里。 当它从我的程序返回时、它会执行

       bf _ExitBoot、UNC
        
       MOV SP、#__STACK

    ;------------------------------------------------
    ;清除堆栈的底部。  这将会结束
    ;在我们完成时在 RPC 中
    ;------------------------------------------------

       MOV * SP++、#0
       MOV * SP++、#0

    ;------------------------------------------------
    ;使用确定的入口点加载 RPC
    ;通过引导模式。  将返回此地址
    ;在 ACC 寄存器中。
    ;------------------------------------------------

       按 ACC
       弹出 RPC

    ;------------------------------------------------
    ;将寄存器恢复到复位状态。

    ;清除所有 XARn、ACC、XT、P 和 DP
    ;寄存器

    ;注:将器件保持在 C28x 操作模式
    ;      (OBJMODE = 1、AMODE = 0)
    ;------------------------------------------------
       ZAPA
       MOVL XT、ACC
       MOVZ AR0、AL
       MOVZ AR1、AL
       MOVZ AR2、AL
       MOVZ AR3、AL
       MOVZ AR4、AL
       MOVZ AR5、AL
       MOVZ AR6、AL
       MOVZ AR7、AL
       MOVW DP、#0


    ;----------------------------------------------------
    ;  恢复 st0和 st1。  请注意 OBJMODE 是
    ;  唯一的位未恢复到其复位状态。
    ;  OBJMODE 保留为 C28x 对象操作设置
    ;  模式。

    ; ST0 = 0x0000    ST1 = 0x0A0B
    ; 15:10 OVC = 0   15:13     ARP = 0
    ;  9: 7 PM = 0      12      XF = 0
    ;     6V  = 0      11 M0M1MAP = 1
    ;     5  N = 0      10 保留
    ;     4  Z = 0       9 OBJMODE = 1
    ;     3  C = 0       8   AMODE = 0
    ;     2 TC = 0       7 IDLESTAT = 0
    ;     1 OVM = 0       6  EALLOW = 0
    ;     0 SXM = 0       5    LOOP = 0
    ;                      4     SPA = 0
    ;                      3    VMAP = 1
    ;                      2   PAGE0 = 0
    ;                      1    DBGM = 1
    ;                      0    INTM = 1
    ;------------------------------------------------

       MOV * SP++、#0
       MOV * SP++、#0x0A0B
       弹出 ST1
       弹出 ST0

    ;----------------------------------------------------
    ;  跳转到由定义的 EntryAddr
    ;  选择引导模式并继续执行
    ;------------------------------------------------

       LRETR <=以上全部到这里========================================= 五

    ;eof --------

    code_start:
       如果 WD_DISABLE = 1
           LB WD_DISABLE      ;分支到看门狗禁用代码   <=此行,然后==v
       其他
           LB _c_int00        ;分支到 RTS 库中启动。_asm
       .endif

       如果 WD_DISABLE = 1

       .text

    WD_DISABLE:
       SETC OBJMODE       ;为28x 目标代码设置 OBJMODE <=此处的所有行
       EALLOW             ;启用 EALLOW 受保护寄存器访问
       MOVZ DP,#7029h>>>6 ;设置 WDCR 寄存器的数据页
       MOV @7029h、#0068h ;将 WDCR 中的 WDDIS 位置位以禁用 WD
       EDIS               ;禁用 EALLOW 受保护寄存器访问
       ;LB _c_int00        ;分支到 RTS 库中启动。_asm
       LCR main                                                                                        <=然后我们回到这里。

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

    我发现一些导入的项目使用起来很有趣

     f2838x_codestartbranch_cpu1.asm

    而其他人使用

     device\f2838x_codestartbranch.asm

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

    与另一个项目相比、LCR 使用的值或偏移似乎不同。 我搜索组件参考手册半个小时、但从未找到、因此很难推测这是否是某个条件指令、但似乎控制了新的目标。

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

    在 main 的末尾、是否可以放置一个 example_done 例程?  

    void example_done (void)(空)

    _asm (" ESTOP0");

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

    这里是我现在拥有的、我在第19行上有一个断点。

    虽然没有断点、但它会在这里和第11行上停止。 继续按钮仍然呈绿色,因此按下它会使程序再次在第19行停止。 我们不停地不停地转动。

    //main.c
    
    #include "driverlib.h"
    #include "device.h"
    
    //
    // Main
    //
    void Example_Done(void)
    {
    __asm(" ESTOP0");
    }
    
    uint32_t main(void)
    {
        Device_init();
        Device_initGPIO();
    
        Interrupt_initModule();
        Interrupt_initVectorTable();
    
        //
        // Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
        //
        EINT;
        ERTM;
        Example_Done();
        return(0);
    }

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

    John、

    当您运行程序时、您的器件看起来会被复位。 您是否禁用了看门狗? 我想知道看门狗复位是否会将器件复位、从而使其变为 f2838x_codestartbranch_CPU1.asm 等

    此致、

    曼诺伊

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

    您好、Manoj、

    是的,它被禁用了 int Device_init(),但我没有修改它。

    我创建了一个新项目、并将源代码复制到其中、现在它可以正常工作。 这并不是很糟糕、只是需要一段时间才能复制工程属性中的 include 和链接资源。

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

    很高兴知道您能够解决这个问题。 我现在将关闭此机票。

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

    是的、但我希望我知道导致它的原因。 我花了很多时间来调试在创建新项目时发生了一些神奇的事情。