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.

[参考译文] TMS320F280049C:srand ()和 rand ()在软复位时获得中断、停止于__TI_resource_lock (__TI_lock_RAND)

Guru**** 657930 points
Other Parts Discussed in Thread: C2000WARE, TIDM-02011
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1224419/tms320f280049c-srand-and-rand-got-break-when-soft-reset-stop-at-__ti_resource_lock-__ti_lock_rand

器件型号:TMS320F280049C
主题中讨论的其他器件:C2000WARETIDM-02011

大家好!

如标题所述、场景如下所述。

编译器版本:TI v22.6.0.LTS

C2000WARE 4.3.0.00

基于 flashapi_ex2_sciKernel 的引导加载程序代码。

引导加载程序代码 正常工作。

显示如下所示的复位代码:

    ...
    case FWork_goto_user_code:
        Interrupt_disable(INT_TIMER2);
        CPUTimer_disableInterrupt(ROUTINE_CPU_TIMER_INTERRUPT_TRIG_BASE);
        //
        // Reset with WatchDog Timeout
        //
        EALLOW;

        //
        // driverlib, Watchdog reset enable = WDENINT->0 and WDOVERRIDE->0
        //
        SysCtl_setWatchdogMode(SYSCTL_WD_MODE_RESET);

        //
        // enable the Watchdog, driverlib;
        // same as HWREGH(WD_BASE + SYSCTL_O_WDCR) = SYSCTL_WD_CHKBITS;
        //
        SysCtl_enableWatchdog();
        EDIS;
        jump_flag = 1;
        break;
    default:
        break;
}

if (jump_flag) {
    while (1) {}
}

应用程序代码是我们的项目代码,它 在 MCU 设备初始函数后使用了 srand ()和 rand ()。

起初(首次上电)、一切顺利。

跳转到引导加载程序代码、然后再次跳转到应用程序代码后、MCU 停止运行。

或者 一开始(第一次上电)、 我使用 XRSn 引脚进行复位、MCU 也 停止。

或者 一开始(第一次上电)、我在跳转到引导加载程序后执行固件更新、然后 调用上面显示的代码 以让 MCU 软静止。

跳转至应用程序代码后、MCU 也停止。

调试了一段时间后、我发现了问题。

如下所示的暂停消息:

如果我删除了 srand()和 rand(),那么所有操作都 正常。

有什么建议可以解决吗? 如果需要、我可以提供其他信息。

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

    尊敬的 Wu:

    我希望能够将该问题咨询到正确的专家。

    谢谢。

    查理

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

    你好、Wu、

    一些后续问题:

    1. 当您第一次加电时没有改变任何情况、是否一切正常? 只是在跳转到引导加载程序代码、使用 XRSn 复位或执行固件更新后、程序才中止?
    2. 在代码中调用的 srand()/rand()函数在哪里? 除了删除此内容外、您是否进行了任何其他更改? 如果只重新添加这些函数、程序是否像以前那样停止?
    3. 在运行应用程序代码之前、您是否已验证所有存储器均已初始化?

    此致、

    Omer Amir

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

    1.是的,如果第一次上电,一切正常。 senario 列表如下

    • 上电->引导加载程序->应用程序-> booltloder ->软复位-> Halt
    • 上电->引导加载程序->应用程序-> booltloder -> XRSn -> Halt
    • 上电->引导加载程序->应用程序-> booltloder ->固件更新完成->软复位->暂停
    • 上电-> booltloder -> application -> XRSn -> Halt

    2.在 Device_init()、Device_initGPIO()、Interrupt_initModule()、Interrupt_initVectorTable()和外设配置之后调用的函数。 我在删除 srand/rand 函数时未进行任何更改。 如果将函数重新添加到程序中、MCU 仍将停止。 调试之后,我发现:如果把函数放在 main ()后的第一行, MCU 会继续运行。 如果我放置在 PWM 配置之后、MCU 将停止。 我提供以下程序流程:

    • device_init()
    • DEVICE_initGPIO()
    • interrupt_initModule()
    • interrupt_initVectorTable()
    • global_initialize()
    • configureFlashAPI()
    • DisablePWMCLKCounting ()
    • configureCPUTimer()
    • configureGPIO()
    • configureCMPSS (
    • configureCLA()
    • configureADC()
    • configurePWM ()
      PWM 配置代码如下所示:

    /*
         * Output control related PWM configuration
         */
        /* LLC */
        int i;
        for (i = 1; i <= ePWM_groups_size; i++) {
            /* PWM Time base */
            EPWM_setPeriodLoadMode(ePWM_groups[i], EPWM_PERIOD_SHADOW_LOAD);
            EPWM_setTimeBasePeriod(ePWM_groups[i], LLC_INITIAL_PERIOD);
            EPWM_setTimeBaseCounter(ePWM_groups[i], 0);
            EPWM_setTimeBaseCounterMode(ePWM_groups[i], EPWM_COUNTER_MODE_UP_DOWN);
            EPWM_setClockPrescaler(ePWM_groups[i], EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);
            EPWM_setSyncOutPulseMode(ePWM_groups[i], EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO);
    
            if(i < 3) {  // LLC
                /* Counter Compare Submodule Registers */
                EPWM_setCounterCompareValue(ePWM_groups[i], EPWM_COUNTER_COMPARE_A, LLC_INITIAL_PERIOD - 1);
                EPWM_setCounterCompareValue(ePWM_groups[i], EPWM_COUNTER_COMPARE_B, 1);
                EPWM_setCounterCompareShadowLoadMode(ePWM_groups[i], EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);
                EPWM_setCounterCompareShadowLoadMode(ePWM_groups[i], EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO);
    
                /* Action Qualifier
                 * Output A use compare A --> RED
                 * Output B use compare B --> FED
                 */
                EPWM_setActionQualifierAction(ePWM_groups[i], EPWM_AQ_OUTPUT_A,
                                              EPWM_AQ_OUTPUT_LOW,
                                              EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
                EPWM_setActionQualifierAction(ePWM_groups[i], EPWM_AQ_OUTPUT_A,
                                              EPWM_AQ_OUTPUT_HIGH,
                                              EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
                EPWM_setActionQualifierAction(ePWM_groups[i], EPWM_AQ_OUTPUT_A,
                                              EPWM_AQ_OUTPUT_LOW,
                                              EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
    
                EPWM_setActionQualifierAction(ePWM_groups[i], EPWM_AQ_OUTPUT_B,
                                              EPWM_AQ_OUTPUT_HIGH,
                                              EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
                EPWM_setActionQualifierAction(ePWM_groups[i], EPWM_AQ_OUTPUT_B,
                                              EPWM_AQ_OUTPUT_LOW,
                                              EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
                EPWM_setActionQualifierAction(ePWM_groups[i], EPWM_AQ_OUTPUT_B,
                                              EPWM_AQ_OUTPUT_HIGH,
                                              EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
                EPWM_setActionQualifierContSWForceShadowMode(
                        ePWM_groups[i], EPWM_AQ_SW_SH_LOAD_ON_CNTR_ZERO);
    
                /* Dead time */
                EPWM_setRisingEdgeDelayCountShadowLoadMode(ePWM_groups[i],
                                                           EPWM_RED_LOAD_ON_CNTR_ZERO);
                EPWM_setFallingEdgeDelayCountShadowLoadMode(ePWM_groups[i],
                                                            EPWM_FED_LOAD_ON_CNTR_ZERO);
    
                EPWM_setDeadBandCounterClock(ePWM_groups[i],
                                             EPWM_DB_COUNTER_CLOCK_FULL_CYCLE);
                EPWM_setRisingEdgeDelayCount(ePWM_groups[i], LLC_DEFAULT_DEADTIME);
                EPWM_setFallingEdgeDelayCount(ePWM_groups[i], LLC_DEFAULT_DEADTIME);
                EPWM_setDeadBandDelayMode(ePWM_groups[i], EPWM_DB_RED, true);
                EPWM_setDeadBandDelayMode(ePWM_groups[i], EPWM_DB_FED, true);
                EPWM_setRisingEdgeDeadBandDelayInput(ePWM_groups[i], EPWM_DB_INPUT_EPWMA);
                EPWM_setFallingEdgeDeadBandDelayInput(ePWM_groups[i], EPWM_DB_INPUT_EPWMB);
                EPWM_setDeadBandDelayPolarity(ePWM_groups[i], EPWM_DB_RED,
                                              EPWM_DB_POLARITY_ACTIVE_HIGH); //polarity is not inverted.
                EPWM_setDeadBandDelayPolarity(ePWM_groups[i], EPWM_DB_FED,
                                              EPWM_DB_POLARITY_ACTIVE_LOW); //polarity is inverted.
    
            } else {  // SR PWM
                /* Counter Compare Submodule Registers */
                EPWM_setCounterCompareValue(ePWM_groups[i], EPWM_COUNTER_COMPARE_B, SR_DELAY_ON_TIME);
                EPWM_setCounterCompareShadowLoadMode(ePWM_groups[i], EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);
                EPWM_setCounterCompareShadowLoadMode(ePWM_groups[i], EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO);
                EPWM_setCounterCompareValue(ePWM_groups[i], EPWM_COUNTER_COMPARE_A, LLC_INITIAL_PERIOD - SR_DELAY_ON_TIME);
    
                /* Action Qualifier
                 * Output A use compare A --> RED
                 * Output B use compare B --> FED
                 */
                EPWM_setActionQualifierAction(ePWM_groups[i], EPWM_AQ_OUTPUT_A,
                                              EPWM_AQ_OUTPUT_HIGH,
                                              EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
                EPWM_setActionQualifierAction(ePWM_groups[i], EPWM_AQ_OUTPUT_A,
                                              EPWM_AQ_OUTPUT_LOW,
                                              EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
                EPWM_setActionQualifierAction(ePWM_groups[i], EPWM_AQ_OUTPUT_A,
                                              EPWM_AQ_OUTPUT_LOW,
                                              EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
    
                EPWM_setActionQualifierAction(ePWM_groups[i], EPWM_AQ_OUTPUT_B,
                                              EPWM_AQ_OUTPUT_HIGH,
                                              EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
                EPWM_setActionQualifierAction(ePWM_groups[i], EPWM_AQ_OUTPUT_B,
                                              EPWM_AQ_OUTPUT_HIGH,
                                              EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
                EPWM_setActionQualifierAction(ePWM_groups[i], EPWM_AQ_OUTPUT_B,
                                              EPWM_AQ_OUTPUT_LOW,
                                              EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
                EPWM_setActionQualifierContSWForceShadowMode(
                        ePWM_groups[i], EPWM_AQ_SW_SH_LOAD_ON_CNTR_ZERO);
    
                /* Dead time */
                EPWM_setRisingEdgeDelayCountShadowLoadMode(ePWM_groups[i],
                                                           EPWM_RED_LOAD_ON_CNTR_ZERO);
                // srand((unsigned)123456789);  // add here would stop the MCU after reset
                EPWM_setFallingEdgeDelayCountShadowLoadMode(ePWM_groups[i],
                                                            EPWM_FED_LOAD_ON_CNTR_ZERO);
    
                EPWM_setDeadBandCounterClock(ePWM_groups[i],
                                             EPWM_DB_COUNTER_CLOCK_FULL_CYCLE);
                EPWM_setRisingEdgeDelayCount(ePWM_groups[i], LLC_DEFAULT_DEADTIME + SR_DELAY_ON_TIME);
                EPWM_setFallingEdgeDelayCount(ePWM_groups[i], LLC_DEFAULT_DEADTIME + SR_DELAY_ON_TIME);
                EPWM_setDeadBandDelayMode(ePWM_groups[i], EPWM_DB_RED, true);
                EPWM_setDeadBandDelayMode(ePWM_groups[i], EPWM_DB_FED, true);
                EPWM_setRisingEdgeDeadBandDelayInput(ePWM_groups[i], EPWM_DB_INPUT_EPWMA);
                EPWM_setFallingEdgeDeadBandDelayInput(ePWM_groups[i], EPWM_DB_INPUT_EPWMB);
                EPWM_setDeadBandDelayPolarity(ePWM_groups[i], EPWM_DB_RED,
                                              EPWM_DB_POLARITY_ACTIVE_HIGH); //polarity is not inverted.
                EPWM_setDeadBandDelayPolarity(ePWM_groups[i], EPWM_DB_FED,
                                              EPWM_DB_POLARITY_ACTIVE_LOW); //polarity is inverted.
            }

    如果我在第103行添加 srand ()、MCU 将在复位后停止。 如果我在第103行之前添加、则 MCU 在复位后保持运行。

    3.我会不断地检查这个。

    谢谢。

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

    你好、Wu、

    我将与我们的编译器团队核实、看看是否 对应该如何使用/调用该函数存在一些已知要求、因为它是编译器库的一部分、而不是 C2000Ware。

    此致、

    Omer Amir

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

    你好、Wu、

    您是否完全在使用您自己的自定义引导 例程并可能绕过_TI_auto_init_xxx 例程? 如果是、以下线程可能会很有用(如果不是、请告知我、以便我可以尝试找到与此问题相关的其他资源):

    此致、

    Omer Amir

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

    Amir、您好!
    感谢您的建议。

    我们使用了自定义引导例程、该代码最初基于示例:flashapi_ex2_sci_kernel。 我们进行了修改以从 SCI 切换到 I2C、同时保持闪存 API 和流程相似。

    引导加载程序代码和用户代码为旧版 COFF 格式。 我可以使用_TI_auto_init_xxx 例程吗? 我在使用 EABI 格式的 TIDM-02011工程中找到这些函数。  是否有任何函数或方法可以更改 Legacy COFF 格式的__TI_auto_init_xxx 的行为?

    我发现了一个现象。 这是上电时_lock 函数的地址。

    重新启动 MCU 后、地址是否会更改、正确吗?

    此致、
    JiRong, Wu

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

    你好、Wu、

    auto_init 例程同时适用于 COFF 和 EABI 格式。 是否可以验证链接器映射文件中是否包含以下内容?

    .data.1    0    0000012a    00000002     UNINITIALIZED
                    0000012a    00000002     rts2800_ml_eabi.lib : _lock.c.obj (.data:_lock)
    
    .data.2    0    0000022c    0000000a     UNINITIALIZED
                    0000022c    00000006     rts2800_ml_eabi.lib : exit.c.obj (.data)
                    00000232    00000002                         : _lock.c.obj (.data:_unlock)
                    00000234    00000002                         : rand.c.obj (.data)
    
    .text      0    00100000    0000022e     
                    …
                    0010021a    00000009     rts2800_ml_eabi.lib : _lock.c.obj (.text)

    此致、

    Omer Amir

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

    Amir、您好!

    下面显示了我的映射文件部分。

    谢谢。

    JiRong, Wu

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

    你好、Wu、

    我将尝试向其他一些专家介绍、看看他们是否知道正在发生什么。 请等待一段时间。

    此致、

    Omer Amir