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.

[参考译文] RTOS/PROCESSOR-SDK-AM335X:计时器初始化时崩溃

Guru**** 2611705 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/657370/rtos-processor-sdk-am335x-timers-crash-on-initialization

器件型号:PROCESSOR-SDK-AM335X
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

调试时、我在文件"app_pa8fg.c 崩溃、但"CortxA8:未处理的 ADP_Stopped 异常0x20023"中看到函数"ISTAT = ti_SysBIOS_timers_dmtimer_dmtimer_timer_timer_instance_init_e_E (__obj、id、tickFxn、__PRMS、__EB);"。 在我将 Code Composer Studio 从7.x 安装到7.2之前、一切都正常。 就我所知、我没有更改源。 将计时器源直接添加到项目后、我可以看到它出现在计时器函数"void Timer_checkFreq (Timer_Object * obj)"中。 但调试这一点并不容易、因为暂停操作计时器节拍计算。 有什么想法吗?

此致、

David

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

    您是否正在运行我们的示例之一? 如果是、哪一个? 您的 Processor SDK 的版本是什么?

    此外、这是在定制板上还是在我们的 EVM 上?

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

    您好、Sahin、

    我确实使用了"pdk_am335x_1_0_8"和"processor_sdk_rtos_am335x_4_01_00_06"和 BeagleBone Black。 我尝试在示例项目"MCSPI_SlaveMode_SlaveExample_bbbAM335x_armExampleProject"或新创建的系统 BIOS 项目中使用计时器。 在这两种情况下、软件都在该函数处崩溃。 正如我说过的、在我更新之前、所有工作都可以通过计时器找到。

    源提取:

    uint32_t ulusCounter = 0;
    
    void usTimer()
    {
    /*120:5US*/
    ulusCounter+=5;
    }
    
    void StartMsTimerTask()
    {
    Timer_Params timer_params;
    
    ERROR_Block EB_TIMER;
    
    error_init(&eb_timer );
    
    Timer_Params_init (&timer_params);
    /*120:5US*/
    Timer_params.period = 2000;
    
    Timer_params.periodType = Timer_PeriodType_Counts;
    
    Timer_params.startMode = Timer_StartMode_Auto;
    
    timer_params.runMode = Timer_RunMode_Continuous;
    
    Timer_create (5、(Timer_Functr) usTimer、&timer_params、&EB_timer);
    
    返回0;
    }
    /*
    === taskFxn ====
    */
    void taskFxn (UArg a0、UArg A1)
    {
    system_printf ("enter taskFxn ()\n");
    StartMsTimerTask();
    Task_sleep (10);
    
    system_printf ("exit taskFxn ()\n"\});
    
    system_flush();/*强制 SysMin 输出到控制台*/
    }
    
    /*
    === main ====
    */
    int main()
    {
    Task_Handle 任务;
    ERROR_Block EB;
    
    system_printf ("enter main()\n");
    
    ERROR_INIT (&EB);
    任务= Task_create (taskFxn、NULL、&EB);
    if (task =NULL){
    System_printf ("Task_create() failed!\n");
    BIOS_exit (0);
    }
    
    BIOS_start();/*不返回*/
    返回(0);
    } 

    更新22.01.2018:在 cfg 文件中添加以下行时、系统会在尝试开始调试时立即崩溃。 有什么想法吗?

    添加了行:"ti_sysbios_timers_dmtimer_Timer.intFreq.lo = 12000;"

    我没有更改任何内容以更新到当前系统。 我的设置现在如下所示。

    设置:

    GCC:GCC-ARM-NONE - eabi-6-2017-Q1-update
    BIOS:BIOS_6_52_00_12
    NDK:NDK_2_26_00_08
    PDK:pdk_am335x_1_0_9
    PSDK:PROCESSOR_SDK_RTOS_AM335x_4_02_00_09
    XDC:xdctools_3_50_03_33_core
    Sitara:Sitara_1_02_00_00
    EDMA:EDMA3_LLD_2_12_05_30B

    2018年1月22日更新:在启动时查看 DMTIMERR 寄存器时、我可以看到只有 DMTIMER0和 DMTIMER2是可读的。 我是否需要在启动文件中的某个位置配置它们、然后才能使用它们?

    2018年1月22日更新:问题已解决。 您需要更新 GEL 文件或在 sourcecode 中激活 DMTIMERS。 GEL 文件激活示例(链接: http://e2e.ti.com/support/embedded/bios/f/355/p/270589/946269.aspx#946269:

    #define CM_PER         (0x44e00000)
    #define CM_DPLL         (0x44e00500)

    #define CM_PER_TIMER2_CLKCTRL   (CM_PER + 0x80)
    #define CM_PER_TIMER3_CLKCTRL   (CM_PER+0x84)
    #define CM_PER_TIMER4_CLKCTRL   (CM_PER+0x88)
    #define CM_PER_TIMER5_CLKCTRL   (CM_PER+0xEC)
    #define CM_PER_TIMER6_CLKCTRL   (CM_PER+0xF0)
    #define CM_PER_TIMER7_CLKCTRL   (CM_PER + 0x7C)

    #define CLKSEL_TIMER2_CLK   (CM_DPLL + 0x04)
    #define CLKSEL_TIMER3_CLK   (CM_DPLL + 0x08)
    #define CLKSEL_TIMER4_CLK   (CM_DPLL + 0x0C)
    #define CLKSEL_TIMER5_CLK   (CM_DPLL + 0x14)
    #define CLKSEL_TIMER6_CLK   (CM_DPLL + 0x18)
    #define CLKSEL_TIMER7_CLK   (CM_DPLL + 0x00)

    热菜单 EnableTimer_32KHz ()

       WR_MEM_32 (CM_PER_TIMER2_CLKCTRL、0x2);
       WR_MEM_32 (CLKSEL_TIMER2_CLK、0x2);

       WR_MEM_32 (CM_PER_TIMER3_CLKCTRL、0x2);
       WR_MEM_32 (CLKSEL_TIMER3_CLK、0x2);

       WR_MEM_32 (CM_PER_TIMER4_CLKCTRL、0x2);
       WR_MEM_32 (CLKSEL_TIMER4_CLK、0x2);

       WR_MEM_32 (CM_PER_TIMER5_CLKCTRL、0x2);
       WR_MEM_32 (CLKSEL_TIMER5_CLK、0x2);

       WR_MEM_32 (CM_PER_TIMER6_CLKCTRL、0x2);
       WR_MEM_32 (CLKSEL_TIMER6_CLK、0x2);

       WR_MEM_32 (CM_PER_TIMER7_CLKCTRL、0x2);
       WR_MEM_32 (CLKSEL_TIMER7_CLK、0x2);

           GEL_TextOut ("Timers 2-7 enabled for 32KHz。\n");

    OnTargetConnect()

       GEL_MapOff ();
       GEL_MapReset();
       GEL_MapAddStr (0x00020000、0、0x0000C000、"R"、0);    //引导 ROM
       GEL_MapAddStr (0x08000000、0、0x01000000、"R|W"、0);  // 16MB GPMC 外部/非(在 GP 子卡上)
       GEL_MapAddStr (0x40020000、0、0x0000C000、"R"、0);    //引导 ROM (也在0x20000处)
       GEL_MapAddStr (0x402F0400、0、0x0000FC00、"R|W"、0);  // SRAM 内部
       GEL_MapAddStr (0x40300000、0、0x00010000、"R|W"、0);  // OCMC-RAM
       GEL_MapAddStr (0x44000000、0、0x00400000、"R|W"、0);  // L3F CFG 寄存器
       GEL_MapAddStr (0x44800000、0、0x00400000、"R|W"、0);  // L3S CFG 寄存器
       GEL_MapAddStr (0x44C00000、0、0x00400000、"R|W"、0);  // L4_WKUP
       GEL_MapAddStr (0x46000000、0、0x00400000、"R|W"、0);  // McASP0数据
       GEL_MapAddStr (0x4640000000、0、0x00400000、"R|W"、0);  // McASP1数据
       GEL_MapAddStr (0x47400000、0、0x00005000、"R|W"、0);  // USB0/1
       GEL_MapAddStr (0x47810000、0、0x00010000、"R|W"、0);  // MMCHS2
       GEL_MapAddStr (0x48000000、0、0x01000000、"R|W"、0);  // L4 PER
       GEL_MapAddStr (0x49000000、0、0x00B00000、"R|W"、0);  // EDMA
       GEL_MapAddStr (0x4A000000、0、0x01000000、"R|W"、0);  // L4_FAST
       GEL_MapAddStr (0x4C000000、0、0x01000000、"R|W"、0);  // EMIF
       GEL_MapAddStr (0x50000000、0、0x01000000、"R|W"、0);  // GPMC 寄存器
       GEL_MapAddStr (0x56000000、0、0x01000000、"R|W"、0);  // SGX530
       GEL_MapAddStr (0x8000000000、0、0x20000000、"R|W"、0);  // 512MB DDR3外部内存
       GEL_MapOn();
       GEL_AdvancedReset ("系统重置");//重置电路板以避免与从 NOR/SPI/SD 运行的程序发生冲突
       GEL_Halt();                       //系统重置使内核保持运行。 需要停止它、以便可以访问存储器
       disable_watchdog();
       AM335x_BeagleBlack_Initialization ();
       EnableTimer_32KHz ();


    值可以如下(参考 AM335x_ReferenceManual):

    CLKSEL_TIMERx_CLK:

    为 TIMERx 时钟[热复位不敏感]选择多路复用器选择线路
    0x0 = SEL1:选择 TCLKIN 时钟(外部定时器时钟源)
    0x1 = SEL2:选择 CLK_M_OSC 时钟(系统时钟)
    0x2 = SEL3:选择 CLK_32kHz 时钟(PLL 32.768kHz 时钟)
    0x3 = SEL4:被保留

    CM_PER_TIMERx_CLKCTRL:

    控制强制时钟的管理方式。
    0x0 =禁用:软件禁用模块。 任何 OCP 访问
    模块会导致错误、除非是由模块唤醒引起的
    (异步唤醒)。
    0x1 = RESERVE_1:保留
    0x2 = ENABLE:模块被显式启用。 接口时钟(如果不是
    用于函数)可根据时钟域进行门控
    状态。 功能时钟是保持存在的保证。 最长为英寸
    这种配置、无法进行电源域睡眠转换。
    0x3 =保留:保留

    更新:当不使用 SYS BIOS 时、可按如下方式激活计时器(从 starterware/platform/evmAM335x/dmtimer.c 中提取)

    代码提取:

    空 DMTimer6ModuleClkConfig (空)
    /*清除 CM_DPLL_CLKSEL_TIMER6_CLK 寄存器的 CLKSEL 字段。 *
    HWREG (SOC_CM_DPLL_regs + CM_DPLL_CLKSEL_TIMER6_CLK)&=
    ~(CM_DPLL_CLKSEL_TIMER6_CLK_CLKSEL);
    //写入 CM_DPLL_CLKSEL_TIMER6_CLK 寄存器的 CLKSEL 域。 *
    HWREG (SOC_CM_DPLL_regs + CM_DPLL_CLKSEL_TIMER6_CLK)|=
    CM_DPLL_CLKSEL_TIMER6_CLK_CLKSEL_SEL2;
    /*等待 CLKSEL 域反映写入的值。 *
    while ((HWREG (SOC_CM_DPLL_regs + CM_DPLL_CLKSEL_TIMER6_CLK)和
    CM_DPLL_CLKSEL_TIMER6_CLK_CLKSEL)!=
    CM_DPLL_CLKSEL_TIMER6_CLK_CLKSEL_SEL2);
    //写入 CM_PER_TIMER6_CLKCTRL 寄存器的 MODULEMODE 字段。 *
    HWREG (SOC_CM_PER_REGS + CM_PER_TIMER6_CLKCTRL)|=
    CM_PER_TIMER6_CLKCTRL_MODULEMODE_ENABLE;
    //等待 MODULEMODE 位域反映写入值。 *
    while ((HWREG (SOC_CM_PER_regs + CM_PER_TIMER6_CLKCTRL)&
    CM_PER_TIMER6_CLKCTRL_MODULEMODE)!= CM_PER_TIMER6_CLKCTRL_MODULEMODE_ENABLE);
    /*
    **等待 CM_PER_L4LS_CLKSTCTRL 的 CLKACTIVITY_TIMER6_GCLK 字段
    **要设置的寄存器。
    *
    while (!(HWREG (SOC_CM_PER_regs + CM_PER_L4LS_CLKSTCTRL)&
    (cm_per_L4LS_CLKSTCTRL_CLKACTIVITY_L4LS_GCLK |
    CM_PER_L4LS_CLKSTCTRL_CLKACTIVITY_TIMER6_GCLK)));