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/OMAP-L138:CPU 负载返回0

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

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/566405/rtos-omap-l138-cpu-load-returning-0

器件型号:OMAP-L138
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

我无法获取任务负载和 HWI/SWI 负载、即使在 e2e 论坛中解决了大多数尚未解决的问题之后也是如此。

我有内嵌的加载模块。 在我的 ocnifguardion 文件中添加了 UIA。
 但是、我不想通过 JTAG 调试器运行系统分析器、而是在运行时转储控制台上的负载。

这是我的代码片段-

空 DumpCpuLoad()

   Load_Stat stat;
   uint32 tmpLoad;
   Task_handle idtskleHandle =空;
   char tskLoadBuf[64];

   uint32 tskNum = InitTaskList();

   /*转储总 CPU 负载*/
   sprintf (tskLoadBuf、"%-32s-%3D\n"、"Total CPU"、Load_getCPULoad ());
   logs (tskLoadBuf);

   idleTskHandle = Task_getIdleTaskHandle (0);
   if (idleTskle){
      Load_getTaskLoad (idleTskHandle、&stat);
      tmpLoad = Load_calculateLoad (&stat);
      sprintf (tskLoadBuf、"%-32s-%3D\n"、"自由 CPU"、tmpLoad);
      logs (tskLoadBuf);
   }

   while (tskNum >0)
   {

      if (TskLst[tskNum-1]){
         Load_getTaskLoad (LTskst[tskNum-1]、&stat);
         tmpLoad = Load_calculateLoad (&stat);

         sprintf (tskLoadBuf、"%-32s-%3D\n"、Task_handle_name (TskLst[tskNum-1])、tmpLoad);
         logs (tskLoadBuf);
      }

      tskNum --;
   }

   load_getGlobalHwiLoad (&stat);
   tmpLoad = Load_calculateLoad (&stat);
   sprintf (tskLoadBuf、"%-32s-%3D\n"、"总 HWI 负载"、Load_getCPULoad ());
   logs (tskLoadBuf);

   load_getGlobalSwifload (&stat);
   tmpLoad = Load_calculateLoad (&stat);
   sprintf (tskLoadBuf、"%-32s-%3D\n"、"总 SWI 负载"、Load_getCPULoad ());
   logs (tskLoadBuf);

   /*其他未受监视的任务(如 AppLogger)可能会添加几个 CPU 点*/

每个任务的上述输出、SWI 和 HWI 为0。

我的 cfg 文件如下所示。 (仅在此处粘贴相关内容)

VAR BIOS = xdc.useModule('ti.sysbios.BIOS');
VAR EventCombiner = xdc.useModule('ti.sysbios.family.c64p.EventCombiner');
VAR HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
var ti_sysbios_family_c64p_Hwi = xdc.useModule('ti.sysbios.family.c64p.Hwi');
VAR 信标= xdc.useModule('ti.sysbios.knl.Semaphore');
VAR 任务= xdc.useModule('ti.sysbios.knl.Task');
VAR 内存= xdc.useModule('xdc.runtime.Memory');
VAR DRV = xdc.useModule('ti.sdo.edma3.drv.DRV');
VAR 系统= xdc.useModule('xdc.runtime.System');
VAR Cache = xdc.useModule('ti.sysbios.family.c64p.Cache');
var ti_sysbios_hal_Cache = xdc.useModule('ti.sysbios.hal.Cache');
VAR 时钟= xdc.useModule('ti.sysbios.knl.Clock');
VAR HeapMultiBuf = xdc.useModule('ti.sysbios.heaps.HeapMultiBuf');
VAR 事件= xdc.useModule('ti.sysbios.knl.Event');
VAR 队列= xdc.useModule('ti.sysbios.knl.Queue');
VAR 邮箱= xdc.useModule('ti.sysbios.knl.Mailbox');
VAR 诊断= xdc.useModule('xdc.runtime.Diags');
VAR Load = xdc.useModule('ti.sysbios.utils.Load');
VAR LoggingSetup = xdc.useModule('ti.uia.sysbios.LoggingSetup');
VAR LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf');

load.swiEnabled = true;
load.hwiEnabled = true;

var loggerBuf = LoggerBuf.create();
Load.common$.logger = loggerBuf;
Load.common$.diags_USER4 = Diags.always_on;

/*启用 CPU 负载记录*/
LoggingSetup.loadLogging =真;
/*
 * 启用任务、Swi 和 Hwi 加载日志记录。 这将允许空闲任务
 * 使用更有意义。 否则会将 Hwi 和 Swi 负载考虑在内
 * 每个任务的用法。
 *
LoggingSetup.loadTaskLogging =真;
LoggingSetup.loadSwiLogging =真;
LoggingSetup.loadHwiLogging =真;

LoggingSetup.loggerType = LoggingSetup.LoggerType_JTAGRUND;
LoggingSetup.sysbiosTaskLogging = true;
LoggingSetup.sysbiosLogging = true;
LoggingSetup.sysbiosLoggingRuntimeControl = true;
LoggingSetup.sysbiosHwiLogging = true;
LoggingSetup.sysbiosHwiLoggingRuntimeControl = true;
LoggingSetup.sysbiosTaskLoggingRuntimeControl = true;

请告诉我为什么不计算负载。
请注意,该函数会调用 get_taskLoad .. HwiLoad 和 SwiLoad 全部返回 true。

谢谢

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

    Alwyn、

    您是否在应用程序中调用 Load_update()函数?

    您正在使用哪个版本的 SYS/BIOS?

    谢谢、
    Scott

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

    我使用的是最新版本6.45.0.20之一
    加载模块配置为500ms 窗口、我们是否需要显式调用 Load_update?
    Load_module 不会自动调用它?

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

    您好、Alwyn、

    根据负载模块的配置、它可以被自动调用。  如果“Load.updateInIdle = true;”和窗口!= 0,则应在空闲循环中自动调用 Load_update()。  您的配置代码被剪切后,不会显示您看到此配置参数,因此默认情况下它应该为“true”。 但是,查看负载模块源,我看不到空闲循环是如何插入此函数调用的。 我不知怎么会错过它。

    是否可以在 Load_update()上设置断点,以查看您的应用程序中是否确实调用了此函数?

    谢谢、
    Scott

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

    我已检查是否未调用 Load_update。 updateInIdle 也为 true 并且窗口!=0。

    我看到的是、函数 Load_idleFxn 也没有被调用、因此问题出在这里。

    我在配置中包括了空闲任务-在 ROV 对象查看器中也进行了双次检查- ti.sysbios.KNL.Task.IdleTask 优先级0和就绪状态。

    空闲 ROV 我也看到这些空闲实例。

    0、0、&ti_sysbios_hal_hwi_checkStack
    1、0、&ti_sysbios_utils_Load_idleFxn__E
    2、0、&ti_uIA_loggers_LoggerRunMode_idleHook

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想我已经把问题收窄了。 我有最低优先级@1的 shell 任务。 它在控制台上忙等待。
    应该创建一个优先级为2的任务并每500ms 明确调用 Load_idleFxn 吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、谢谢、这是有道理的。

    可以,您可以创建另一个更高优先级的任务并调用 Load_idleFxn()。  

    但我想知道您的 shell 任务是否可以被 I/O、Semaphore_pend()等唤醒、而不是忙等待?  然后空闲循环运行、其他空闲函数也被调用。

    其他选项包括 shell 定期睡眠、或将其功能移至空闲循环并定期生成。  但是、在 shell 中等待的时间将归因于 CPU 负载。  

    我不确定您的应用程序的最佳选择,但我认为有一些。

    此致、
    Scott

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有一个建议的答案、由于此主题在一周内未激活、建议的答案被标记为验证。 请随意选择"拒绝回答"按钮、并回复更多详细信息。