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/66AK2H12:mailbox_pend () Timeount 值

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

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/629337/rtos-66ak2h12-mailbox_pend-timeount-value

器件型号:66AK2H12
主题中讨论的其他器件:SYSBIOSTCI6636K2H

工具/软件:TI-RTOS

我读取到 Mailbox_pend()中使用的超时值是"系统时钟节拍"。 我在 E2E 论坛上已经阅读过、时钟周期的默认值为1/ms。 我在 XGCONF 下检查了我的 cfg,实际上 SYS/BIOS-调度-时钟:计时器控制节拍周期(us)是1000。 运行时、我检查全局 Clock_tickPeriod、并看到它为1000。 但是,如果我将 Mailbox_pend()超时设置为10000,希望在 10秒内得到超时,我将接近2秒。 我出了什么问题?

Mike

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

    您使用的是哪个 RTOS 版本?

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    XDCtools 3.50.02.20、SYS/BIOS 6.50.01.12
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、我是 Yordan。 您能否与软件团队就此进行核实? 我希望这应该是一个简单的答案。
    此致、Mike
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Mike、

    您在 ARM 或 DSP 中看到了错误的 Mailbox_pend()超时吗? 您是否可以上传一个小型 CCS 项目来证明问题?

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

    Garrett、

    感谢您对此进行深入研究。 我正在 ARM 上运行。 构建信息为:

    XDCtools 3.50.02.20、SYS/BIOS 6.50.01.12、NDK 2.25.1.1、GNU 4.9.3.

    我已经创建了一个小示例、但我不确定如何上传。 我将在我的姓名下方发布代码。

    我首先要问的或许是:

     将毫秒转换为系统时钟节拍的正确/首选方法是什么?

    Mike

    main.c:

    /*
    *==== main.c ======
    *

    #include

    #include
    #include

    #include

    #include
    #include
    #include

    /*
    *==== taskFxn ====
    *
    void taskFxn (UARg a0、UARg A1)

    内部邮件;

    system_printf ("enter taskFxn ()\n");

    mailbox_handle h = Mailbox_create (sizeof (mail)、1、NULL、NULL);

    // 10秒(10000ms)至“系统时钟节拍”
    UINT toSysTicks =(10000 * 1000 / Clock_tickPeriod);
    对于(int i = 0;i < 5;i++){
    Mailbox_pend (h、&mail、toSysTicks);
    System_printf ("转到\n");
    system_flush();/*强制 SysMin 输出到控制台*/

    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);

    app.cfg:

    VAR 默认值= xdc.useModule('xdc.runtime.Defaults');
    VAR 诊断= xdc.useModule('xdc.runtime.Diags');
    VAR 错误= xdc.useModule('xdc.runtime.Error');
    VAR 日志= xdc.useModule('xdc.runtime.Log');
    VAR LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf');
    VAR Main = xdc.useModule('xdc.runtime.Main');
    VAR 内存= xdc.useModule('xdc.runtime.Memory')
    VAR SysMin = xdc.useModule('xdc.runtime.SysMin');
    VAR 系统= xdc.useModule('xdc.runtime.System');
    var text = xdc.useModule('xdc.runtime.Text');

    VAR BIOS = xdc.useModule('ti.sysbios.BIOS');
    VAR 时钟= xdc.useModule('ti.sysbios.knl.Clock');
    VAR 邮箱= xdc.useModule('ti.sysbios.knl.Mailbox');
    VAR Swi = xdc.useModule('ti.sysbios.knl.Swi');
    VAR 任务= xdc.useModule('ti.sysbios.knl.Task');
    VAR 信标= xdc.useModule('ti.sysbios.knl.Semaphore');
    VAR Hwi = xdc.useModule('ti.sysbios.hal.Hwi');

    /*
    *取消注释此行以全局禁用断言。
    *所有模块继承'库'模块的默认值。 您
    *可以使用 Module.common$按模块覆盖这些默认值。
    *禁用断言将节省代码空间并提高运行时性能。
    Defaults.common$.diags_ASSERT = Diags.always_off;
    *

    /*
    *取消注释此行以防止模块名称加载到目标上。
    *模块名称字符串放置在.const 段中。 设置此值
    *将参数设置为 false 将节省.const 段中的空间。 误差和
    *断言消息将包含"未知模块"前缀
    实际模块名称的*。
    Defaults.common$.namedModule = false;
    *

    /*
    *最小化系统中的 EXIT 处理程序数组。 系统模块包括
    *向 System_atexit()注册的函数数数组
    *由 System_exit()调用。
    *
    System.maxAtexitHandlers = 4;

    /*
    *取消注释此行以禁用错误打印功能。
    *禁用此功能时,我们会丢失错误信息,因为错误是这样
    *未打印。 如果禁用 raiseHook、则会节省一些代码空间
    *由于 Error_print()函数,您的应用程序未使用 System_printf()
    *调用 System_printf()。
    error.raiseHook =空;
    *

    /*
    *取消注释此行以防止 Error、Assert 和 Log 字符串成为字符串
    *加载到目标上。 这些字符串放置在.const 段中。
    *将此参数设置为 false 将节省.const 段中的空间。
    *错误、断言和日志消息将打印原始 ID 和 args 而不是
    *格式化的邮件。
    text.isLoaded = false;
    *

    /*
    *取消注释此行以禁用 SysMin 的字符输出
    *程序退出时。 SysMin 向循环缓冲区写入字符。
    *可以使用 ROV 中的 SysMin Output 视图查看该缓冲器。
    SysMin。flushAtExit = false;
    *

    /*
    * BIOS 模块将为系统创建默认堆。
    *指定此默认堆的大小。
    *
    BIOS.heapSize = 0x1000;

    /*
    *从源构建自定义 SYS/BIOS 库。
    *
    BIOS.libType = BIOS.LibType_Custom;

    /*系统堆栈大小(由 ISR 和 Swi 使用)*/
    program.stack = 0x2000;

    System_printf()的/*循环缓冲区大小*/
    SysMin。bufSize = 0x200;

    /*
    *为整个系统创建并安装记录器
    *
    var logerBufParams = new LoggerBuf.Params();
    LoggerBufParams.numEntry = 16;
    var logger0 = LoggerBuf.create (logerBufParams);
    Defaults.common$.logger = logger0;
    Main.common$.diags_INFO = Diags.always_on;

    System.SupportProxy = SysMin;

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

    Mike、

    此问题似乎是由 BIOS 假定时钟节拍的估算器的默认频率引起的。 从 Clock_getTicks()中,Mailbox_pend()或 Task_sleep()会按照预期的节拍进行挂起/睡眠。 您可以尝试在 cfg 文件中添加以下代码片段:

    /*将 CPU 频率设置为1GHz */
    bios.cpufreq.lo = 1000000000;
    bios.cpufreq.hi = 0;

    /*设置 Timer64 freq */
    VAR 计时器= xdc.useModule('ti.sysbios.timers.timer64.Timer');
    对于(var idx = 0;idx < 18;idx++){
    Timer.intFreqs[idx].lo = 163840000;// PLL 频率/ 6.
    Timer.intFreqs[idx].hi = 0;


    /*设置估算器频率*/
    VAR SysTimer = xdc.useModule('ti.sysbios.family.arm.systimer.Timer');
    SysTimer.intFreq.lo = 163840000;// PLL 频率/ 6.
    SysTimer.intFreq.hi = 0;

    此致、
    Garrett

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Garrett、感谢您对此进行深入研究。
    我真的不想更改我的 SBC 的时钟频率或其他配置信息。 项目中的其他人有特定要求、如果我更改这些要求、我很确定会使它们变得混乱。 我宁愿往另一个方向,将我所需的毫秒数转换为我需要传递给这些函数的数,以提供我在 CPU 频率、PLL 等方面给出的值。 您能告诉我如何操作?
    Mike
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Mike、

    如果是、您需要将所需的毫秒数乘以6作为超时值。 默认系统计时器使用1GHz CPU 频率作为计时器频率、而不使用 cfg 中的上述代码片段。

    此致、
    Garrett
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不需要获取任何系统变量、如 Clock_tickPeriod 或读取任何 cfg 数据? 只需6倍?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    mailbox_handle h = Mailbox_create (sizeof (mail)、1、NULL、NULL);

    // 10秒(10000ms)至“系统时钟节拍”
    UINT toSysTicks =(10000 * 1000 / Clock_tickPeriod);
    toSysTicks =(10000 * 6);
    对于(int i = 0;i < 5;i++){
    Mailbox_pend (h、&mail、toSysTicks);


    system_printf ("exit taskFxn ()\n"\});

    上面的内容使我从 for ()到 System_printf ()大约39秒。 应为50秒。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Mike、

    定时器的共享本地时钟分频器为6、请参阅数据表的表11-13 -主 PLL 控制器模块时钟域内部和共享本地时钟分频器。 您的 CPU 频率 SYSCLK1可能不是1GHz、您可以通过找到
    xdc_runtime_Types_FreqHz cpufreq;
    BIOS_getCpuFreq (&cpufreq);
    system_printf ("cpufreq.lo=%d\n"、cpufreq.lo);

    此致、Garrett
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    xdc_runtime_Types_FreqHz cpufreq = 125000000 (hi = 0、lo = 125000000)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Clock_tickPeriod 为我提供了什么? (来自 ti.sysbios.KNL.Clock)它显示"Tick period specified in microseconds (以微秒为单位指定的节拍周期)"。 Mailbox_pend ()超时处于"系统时钟节拍的最长持续时间"。 什么是"系统时钟节拍"?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Mike、

    您可以在 cfg 文件中指定节拍周期:
    /*以微秒为单位的时钟节拍*/
    clock.tickPeriod = 1000;

    此致、
    Garrett
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    从我之前的一篇文章中:“我在 XGCONF 下检查了我的 cfg,实际上 SYS/BIOS 调度时钟:计时器控制节拍周期(us)是1000。 运行时、我检查全局 Clock_tickPeriod、并看到它为1000。"
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Mike、

    xdc_runtime_types_FreqHz cpufreq = 125000000、即125MHz 不是1250000000、1.25GHz?
    39秒(而不是50秒)可能来自50 *(1GHz/1.25GHz)。
    根据您的电路板配置、在 cfg 文件中设置正确的 cpufreq 和计时器/估算器 intFreq.lo 似乎是解决方案。

    此致、
    Garrett
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、125MHz。 如果我知道如何执行 XGCONF 屏幕的屏幕截图、我会这样做的。 在 SYS/BIOS >系统>程序-运行时大小下、该区域中有一个区域调用平台信息*、它具有:
    器件名称 TCI6636K2H 时钟速率(MHz) 125.0
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    125MHz 是 TCI6636K2G 参考时钟。
    如 GEL 脚本函数 set_tetris _pll ()中所示、预计由基准时钟和 PLLM/CLKOD 计算 cpufreq。
    您需要在 cfg 文件中正确指定 cpufreq:bios.cpufreq.lo = 1000000000;// 1GHz *或1.4GHz (根据您的定制板配置),并相应地设置 Timer/SysTimer.intFreq.lo。

    此致、Garrett