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-K2G:如何获得准确的时钟节拍?

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

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/691685/rtos-processor-sdk-k2g-how-to-get-accurate-clock-ticks

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

工具/软件:TI-RTOS

我尝试设置一个周期为10us 的时钟、但得到的周期为8.2us。

pdk_k2g_1_0_7
BIOS:6.46.5.55
xdctools_3_32_01_22_core


在.cfg 中、我具有以下设置

 VAR 时钟= xdc.useModule('ti.sysbios.knl.Clock');
 Clock.tickPeriod = 10; // 10us

在我的.c 代码中、我将周期设置为1。

   ERROR_INIT (&EB);
   Clock_Params_init (&clockParams);
   clockParams.period = 1;       /* 1个时钟节拍*/
   clockParams.startFlag = true; /*立即开始*/
   hClock = Clock_create (clock_swi、1、clockParams、&EB);

Clock_swi 函数切换 GPIO 引脚、以便我可以观察示波器上的 clock_swi 周期。
我希望每10us 获得一次 clock_swi、但我测量了它的周期为8.2us。

我遵循了中的提示
processors.wiki.ti.com/.../Processor_SDK_RTOS:_TI_RTOS_Tips_And_Tricks
并设置正确的 ARM CPU 值
 bios.cpufreq.lo = 600000000;
但仍然得到8.2us 的周期。

显示了 RTOS 对象视图(ROV)中的时钟模块
tickSource:TI.SYSBIOS.KNL.Clock.TickSource_timer
tickMode:TI.SYSBIOS.KNL.Clock.TickMode_Periodic
timerId:0
联谊会:15.
tickPeriod:10.
n 跳过:1.

问题1:我是否错过了任何设置?
Q2:ROV 中的 timerId 为0。 您能否为 K2G 处理器提供计时器映射表以确定哪个计时器对应于每个计时器 ID?

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

    BR
    Tsvetolin Shulev
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有更新吗?
    针对 K2G DSP 的.cfg 和.c 文件中的相同设置会生成正确的时钟周期、但不会生成 ARM。 DSP 和 ARM 内核都对时钟模块使用 timerId 0。 根据每个内核到计时器 ID 的计时器映射、它们可能不使用同一个计时器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    下面是我们过去用来生成10ms 时钟节拍的代码:

    var bios = xdc.useModule('ti.sysbios.BIOS');
    bios.cpufreq.hi = 0;
    bios.cpufreq.lo = 600000000;// 600 MHz */
    
    *********
    *时钟模块配置*
    ********* /
    var 时钟= xdc.useModule("ti.sysbios.knl.Clock");
    Clock.tickMode = Clock.tickMode_Periodic;
    Clock.tickSource = Clock.tickSource_user;
    
    /*********
    *定时器模块配置*
    ********* //
    //*设置为1ms Tick */
    var Timer = xdc.useModule('ti.sysbios.timers.timer64.Timer');
    var timerParams = new TimerParams ();
    timerParams.Period = 1000 * 10;
    // Timer1且输入时钟以24MHz 运行*/
    Timer.intFreqs[1].hi = 0;
    Timer.intFreqs[1].lo = 24000000;
    Timer.create (1、'&TimerTick'、timerParams); 

    此处提供了定时器映射表:

    BIOS_6_52_00_12/packages/ti/sysbios/timers/timer64/doc-files/TimerTables.html

    希望这对您有所帮助。

    此致、

    Rahul

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

    我将代码复制到了.cfg 中。 仅将 Timer.intFreqs[1].lo = 25000000更改为与输入时钟匹配;

    c 代码中的 mainTimerTick 会切换 GPIO 并在示波器上观察到。 它发生在2.5ms 而不是10ms。 为什么 因子4存在差异?

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

    约书亚、

    我意外地提供了 AM57xx 器件的设置、其中计时器的输入为中的 CLK。 在 Keystone 2器件上、输入为 CHIP_CLK1/6、似乎是100000000、而不是25000000。 我相信这会解决您的问题。

    我还查看了 MCASP 音频环回示例的配置文件 、其中的计时器配置如下:

    //更改计时器频率
    //将 Timer64频率设置为100MHz
    var 计时器= xdc.useModule('ti.sysbios.timers.timer64.Timer');
    for (var idx = 0;idx < 7;idx++){
    Timer.intFreqs[idx].lo = 100000000;
    Timer.intFreqs[idx].hi = 0;
    } 

    此致、

    Rahul

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

    Rahul、

    您建议 计时器设置"Timer.intFreqs[idx].lo = 100000000;"正确。 我得到了所需的10ms 周期。
    从 CCS -> ROV ->计时器、然后
    CCS ->调试视图->寄存器-> Timer_1 -> Timer_TCR
    我可以看到使用了 Timer1 (ti.sysbios.timers.timer64)。

    但我最初的问题是时钟模块而不是计时器模块。
    K2G ARM 的时钟模块基于 CCS -> ROV ->计时器使用"ti.sysbios.family.arm.systimer"。 我想知道如何使用时钟模块设置精确的时钟节拍。

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    似乎我缺少设置。
    我添加了以下设置并获得了精确的时钟节拍。 谢谢。
    在.cfg 中
    timer.timerSettings[1].ownerCoreId = 0;

    代码中
    void mainTimerTick (UARg 参数)

    clock_tick ();
    (笑声)