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/TMDSEVM6678:计时器在创建和 Timer_start()调用之间是否运行?

Guru**** 2981430 points

Other Parts Discussed in Thread: CCSTUDIO, SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/675479/rtos-tmdsevm6678-do-timers-run-between-the-time-they-are-created-and-the-timer_start-call

器件型号:TMDSEVM6678
Thread 中讨论的其他器件:CCStudio、 SYSBIOS

工具/软件:TI-RTOS

您好!

我正在使用 CCStudio 6.2和 BIOS 6.42开发 c6678评估模块。  

我将在所有8个内核上运行单个映像。  但一开始、我检查 DNUM、并使用 StartMode_user 在 core1中创建3个周期为4微秒的计时器。  

我有一个任务、每个内核都运行、大约需要13微秒才能完成。  现在,即使不调用 Timer_start(),我也会看到在 core0中运行的任务中,而不是在其他内核中运行的任务中,只需要创建计时器!!

这是意料之中的、还是我做了一些错误?!

提前感谢您的回复!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    团队将收到通知。 他们将直接在此处发布反馈。

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

    来自 software-dl.ti.com/.../Timer.html

    StartMode_Auto—静态创建/构造的定时器将在 BIOS_start()中启动。 动态创建的计时器将在 CREATE ()时间开始。 这包括 BIOS_start()之前创建的计时器。
    StartMode_user—用户将使用 start()启动计时器。

    我不认为计时器是在创建后启动的。 您还可以查看计时 器 www.ti.com/.../sprugv5a.pdf 第3.5节、了解计时器是否真正在计数。

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

    非常感谢您的回复 Eric。  我没有期望定时器在 start()之前计数,这就是为什么我认为可能缺少一些东西的原因。

    通过更多的测试、我发现当我随机移除其中一个计时器时、开销也会消失。  

    我也检查了 TCR 的 ENAMODE 位。  它们看起来根本没有变化、 这意味着对于我使用这些位的计时器而言、它们是禁用的。  有一个 timer11我不使用、但这些位始终启用!

    下面是我创建计时器的方法:



    Timer_Params_init (&timerParams); timerParams.periodType = Timer_PeriodType_micros; timerParams.arg = 1; timerParams.startMode = ti_SysBIOS_interfaces_ITIMer_StartMode_user; timerParams.intNum = 5; myTimer3 = Timer_create (9、myIsr3、&timerParams、&EB); if (myTimer3 == NULL){ System_abort ("timer3 create failed"); } Timer_Parimer_init (&timerParams); timerParams.startMode = ti_sysbios_interfaces_ITIM_init_rams.startMode = ti_timerParams.start6;timerParams.startMode = ti_timerParams.starttimerperiod = timerParams.intNum;timerParams. myTimer4 = Timer_create (10、myIsr4、&timerParams、&EB); if (myTimer4 == NULL){ System_abort ("timer4 create failed"); } Timer_Parimer_init (&timerParams); timerParams.startMode = ti_sysbios_interfaces_ITimers_init_rams.startMode = timerParams.intNum;timerParams.startMode = ti_timerParams.startr4;timerParams.starttimerParams.starttimer周期= myTimer5 = Timer_create (12、myIsr5、&timerParams、&EB); if (myTimer5 = NULL){ System_abort ("timer5 create failed"); }

    你发现什么问题了吗?

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

    timerParams 还有计时器运行模式:我看不到您进行了设置。

    C 概要目标域
    typedef 枚举 Timer_RunMode{
    Timer_RunMode_Continuous、
    //周期性和连续
    Timer_RunMode_OneShot、
    //一次性
    Timer_RunMode_dynamic
    //动态重新编程(在器件子集上可用)
    } Timer_RunMode;

    如果以某种方式使用计时器11、则 SYSBIOS 使用了一个系统计时器、但我认为它应该是计时器 ID 0。 您可以查看 CCS--->工具--> ROV 视图-->计时器以查看计时器和计时器 ID,中断编号以了解计时器的内容,以及是否与您添加的计时器9、10、12发生冲突。

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

    谢谢 Eric!  我已经检查了 ROV、包括运行模式和中断编号在内的所有内容似乎都是正确的!

    我刚刚更改了我的设计、以便我只静态创建一个计时器、并每次使用新参数重新配置它。  这似乎工作得更好、但我仍有 core0中的开销问题、我希望找到答案。  下面是我在.cfg 文件中写入的内容、以使 core1初始化并设置计时器:



    VAR Timer = xdc.useModule('ti.sysbios.timers.timer64.Timer'); Timer.timerSettings[12].ownerCoreId = 1; var timerParams = new Timer.Params (); timerParams.runMode = Timer.RunMode_OneShot; timerParams.startMode = Timer.StartMode_user; timerParams.period = 10; timerParams.periodType = TimerPeriodType_micros; timerParams.intNum = 10; Program.global.myTimer3 = Timer.create (12、"&myIsr3"、timerParams);

    在 core1的任务内:

    Timer_Params_init (&timerParams);
    timerParams.arg =peakMask;
    timerParams.period = 4;
    timerParams.intNum = 10;
    timerParams.runMode = ti_sysbios_interfaces_itimer_RunMode_OneShot;
    timerParams.startMode = ti_sysBIOS_interfaces_itimer_StartMode_Auto;
    Timer_reconfig (myTimer3、myIsr3、&timerParams、&EB);
    if (myTimer3 =NULL){
    System_abort ("timer3重新配置失败");
    }
    

    void myIsr3 (UARg arg)
    {
    Timer_stop (myTimer3);
    CSL_GPIO_clearOutputData (hGpio、arg);
    }
    

    我知道所有8个内核都将同时中断、但我不明白为什么 core0会有如此多的开销、大约为100微秒!

    谢谢你。

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

    很抱歉、对于后期版本、" core0中仍然存在开销问题"、您是否意味着在内核0上、ISR 的输入时间比其他内核晚100us? 您如何比较? 在 ISR 中有 GPIO 清理、是否有用于监控 GPIO 信号变化的范围?

    如果您将定时器配置为连续模式、并假设您可以对具有每个内核的不同引脚进行 GPIO 切换、您会看到内核0在第一个 ISR 入口始终延迟还是只是延迟?

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

    您好!

    感谢您的回复。

    我计算时间的方法是使用 TSCL 寄存器。  我正在查看我在所有内核中拥有的一项非常优化的任务的处理时间。  如果没有在 core1中添加计时器、core0所需的时间约为13.5毫秒、而添加计时器所需的时间约为13.6ms。

    自从我上一篇文章以来、我已经删除了 core1中计时器的重新配置、并且我只在 core1中启动它并在 ISR 中停止它、此外、配置文件还将计时器的所有权设置为一次性模式中的 core1、并且仍然存在开销。  通过查看 ROV 中的计时器、我可以看到所有内核都获得了中断。  

    将计时器的创建移到 core1中的 main 并不会显示每个内核都获得中断、但我仍然会看到 core0中的开销。  我假设 core0在计时器默认情况下仍在计时器的开始和停止周围执行某项操作!  只有使用本地计时器、我才可以让计时器在 core1中工作、但每个内核只有一个本地计时器、我已经使用过这种计时器!

    此致。