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/TMS320F28379D:SYS/BIOS 获取时间(以毫秒为单位)的最佳方法

Guru**** 2555630 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/755768/rtos-tms320f28379d-sys-bios-best-way-to-get-time-in-milliseconds

器件型号:TMS320F28379D
主题中讨论的其他器件:C2000WARE

工具/软件:TI-RTOS

您好!

我尝试以毫秒为单位获取系统时间(应用程序执行开始后的时间)。 我有下一个 cfg 设置:

- CPU 时钟频率(Hz)= 2500000。

-时钟管理器已启用

-时钟模块:

-在内部配置一个定时器来定期调用 Clock_tick ()

-节拍周期(us)= 1000

-计时器 ID =任何

但当我调用 Clock_getTicks()时,它会返回不一致的值。 我知道每个节拍都是1毫秒、因此、如果该函数返回示例12345、则意味着自执行开始后、已经过了12345毫秒。 我是否正确地解释了 Clock_getTicsk()函数? 有什么想法吗?

我还尝试通过调用函数 TimestampProvider_get64()来使用时间戳模块完成它,但结果没有意义。

有人能解释一下如何将这些函数输出转换为毫秒吗?

此致、

Adria

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

    是的,这听起来像是对 Clock_getTick()的适当解释。 您是否确认 SYSCLK 以预期的速度运行? 在.cfg 文件中是否将 BIOS.cpufreq.lo 设置为该速度? 如果 SYS/BIOS 不知道器件实际运行的频率、那么从实际硬件定时器节拍到 SYS/BIOS 节拍的转换将关闭、这可能会解释奇怪的结果。

    惠特尼

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

    尊敬的惠特尼:

    如何检查 SYSCLK 的运行速度?

    在我尝试获取系统时间的任务中、我从 C2000Ware 调用下一个代码:

    DEVICE_INIT ();
    Device_initGPIO ();
    GPIO_setMasterCore (70、GPIO_CORE_CPU1);
    GPIO_setPinConfig (GPIO_70_SCITXDB);
    GPIO_setDirectionMode (70、GPIO_DIR_MODE_IN);
    GPIO_setPadConfig (70、GPIO_PIN_TYPE_STD);
    GPIO_setQualificationMode (70、 GPIO_Qual_异 步);
    SCI_performSoftwareReset (SCI_base);
    SCI_setConfig (SCI_base、DEVICE_LSPCLK_FREQ、9600、 (SCI_CONFIG_WLEN_8 |
    SCI_CONFIG_STOP_ONE |
    SCI_CONFIG_PAR_NONE);
    SCI_resetChannels (SCI_base);
    SCI_resetRxFIFO (SCI_base);
    SCI_resetTxFIFO (SCI_base);
    SCI_clearInterruptStatus (SCI_base、 SCI_INT_TXFF | SCI_INT_RXFF);
    SCI_enableFIFO (SCI_base);
    SCI_enableModule (SCI_base);
    SCI_performSoftwareReset (SCI_base); 

    此代码已从 sci_echoback 示例复制粘贴。 您认为这可能会导致我面临的这种奇怪结果吗? 在这种情况下,将 SYS/BIOS 与 C2000Ware 中的 sci 驱动程序结合使用并能够正确使用任务中的 Task_sleep()函数的最佳解决方案是什么?

    此致、

    Adria

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

    有一个 XCLKOUT 引脚复用选项、您可以使用它在引脚上输出分频的 SYSCLK、以便您可以在示波器上检查其速度。 有关详细信息、请参阅您的技术参考手册。

    默认情况下、F28379D 的 Device_init()将 SYSCLK 设置为200MHz。 我相信 BIOS.cpufreq.lo 的默认值是2.5MHz。 是否已更新 cfg 以将 BIOS.cpufreq.lo 设置为实际速度? 您可能还需要进入引导模块、并确保"Configure PLL and CPU clock dividers"选项也已关闭。

    惠特尼

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

    我已经用示波器检查了这个选项并且 SYSCLK 为25MHz、这是 Device_init()的缺省值(在我的例子中)。 它也是 C2000Ware 示例的默认值(25MHz)。
    好的,那么问题是我配置 SYS/BIOS 使它相信 SYSCLK 是2.5MHz,但从代码我将它设置为25MHz,这解释了为什么 Clock_getTicks()返回这些不相干的值。
    当我尝试将 BIOS.cpufreq.lo 设置为25MHz 时、我收到一个错误、提示"BIOS.cpufreq (25000000 Hz)与实际 CPU 频率(2500000 Hz)不匹配。 请对引导模块的 PLL 设置进行编程、以确保实际的 CPU 频率与 BIOS.cpufreq." 而且、当我在 Ubuntu 18.04上工作时、我在通过 XGCONF 编辑 cfg 文件时遇到问题。 我无法编辑与引导模块相关的任何内容。 但是、由于我可以编辑 cfg 文本文件、您能否告诉我如何通过编辑文本来配置 cfg 引导模块、以指示如何编写行? 而且、它的确切位置(文档和章节或页面)是记录在哪里的?

    此致、

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

    尊敬的惠特尼:

    在回答您上一个帖子后、我可以在 cfg 文件中编辑引导模块。

    然后、让我们恢复我的 cfg 设置:

    VAR Defaults = xdc.useModule('xdc.runtime.Defaults');
    var Diags = xdc.useModule('xdc.runtime.Diags');
    var Error = xdc.useModule('xdc.runtime.Error');
    var Log = xdc.useModule('xdc.runtime.Log');
    var LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf');
    var Main = xdc.useModule('xdc.runtime.Main');
    var Memory = xdc.useModule('xdc.runtime.Memory'
    ) var SysMin = xdc.useModule('xdc.runtime.SysMin');
    var System = xdc.useModule('xdc.runtime.System');
    var Text = xdc.useModule('xdc.runtime.Text');
    var BIOS = xdc.useModule('ti.sysbios.BIOS');
    var Clock = xdc.useModule('ti.sysbios.knl.Clock');
    VAR Swi = xdc.useModule('ti.sysbios.knl.Swi');
    var Task = xdc.useModule('ti.sysbios.knl.Task');
    var semaphore = xdc.useModule('ti.sysbios.knl.Semaphore');
    var Hwi = xdc.useModule('ti.sysbios.family.c28.Hwi');
    var Boot = xdc.useModule('ti.catalog.c2800.initF2837x.Boot');
    System.maxAtexitHandlers = 4;
    BIOS.heapSize = 0x800;
    BIOS.libType = BIOS.LibType_Custom;
    Program.stack = 0x200;
    sysmin.bufSize = 0x100;
    var loggerBufParams = new LoggerBuf.Params ();
    syserBufParams.numEntry = 32;
    var logger0 = LoggerBuf.create (loggerBufParams);
    Defaults.common$.logger = logger0;
    Main.common$.diags_INFO = Diags.always_on;
    System.SupportProxy = LoggerBufParams.create;loggerFlushN
    = true;LoggerLoggerLog AtushN;LoggerLog AtflushN = true;Logger
    clock.timerId =-1;
    Clock.tickSource = Clock.TickSource_timer;
    Clock.tickPeriod = 1000;
    BIOS.cpufreq.lo = 25000000;
    Boot.configureClock = false;
    boot.configureFlashController = false; 

    我验证我是否一直具有25MHz SYSCLK。

    现在 Clock_getTicks()返回的值不太奇怪,但还不正确。 看到我的配置后,难道我不应该从 Clock_getTicks()中得到花费毫秒的时间? 我得到的结果类似于毫秒乘以10、并不是很准确、因为如果我比较时间是如何增加的与时钟表进行比较、那么时钟表的速度会更快(当然、如果我忽略了看起来会增加的10因子)。

    此致、

    Adria

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

    您在引脚上实际测量的是25MHz 吗? XCLKOUT 路径中有一个分频器、在将其放置在引脚上之前对其进行分频。 默认情况下、这是8分频。 您是否重新配置了分频器? 如果没有、听起来您可能以200 MHz (25 * 8)运行。 这不是10分之一、但它可以解释它。 如果将 BIOS.cpufreq.lo 设置为200000000、是否会变得更好?

    惠特尼

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

    尊敬的惠特尼:

    很抱歉我的回复延迟了、但我是在圣诞节假期。

    XCLKOUT 分频器是个问题、我无法通过编程方式更改其值、并且仍然不知道原因。 由于这个问题、我只能通过 CCS 中的"Registers"视图进行更改:

    e2e.ti.com/.../2811172

    在进一步了解 SYS/BIOS CPU 频率和时钟及其与 C2000Ware 的兼容性之后、我终于让 Clock_getTicks()例程正常运行。 如前所述、问题是 C2000Ware 配置的 CPU 频率与 SYS/BIOS cfg 指定的 CPU 频率不兼容。

    此致、

    Adria