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.

[参考译文] CC2538:检测 CPU 利用率

Guru**** 2549770 points
Other Parts Discussed in Thread: CC2538, Z-STACK

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/675231/cc2538-detecting-cpu-utlization

器件型号:CC2538
Thread 中讨论的其他器件: Z-stack

您好!

我想确保 CC2538在 Z-Stack 之上运行的应用不会使 CPU 饱和。 我可以使用什么方法来确定可用的空闲时间或 CPU 使用的时间?

我考虑了一个间隔较短且测量抖动的振荡器。 是否有更好的方法? TI 在这里做什么?

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

    您好!

    我在返回到 Z-Stack 1.2.2a 时进行了类似这样的分析、我将在下面复制它。 Z-Stack 3.0.1的数字应该非常相似、这两个堆栈之间的主要区别在于 NWK 调试过程、这是一个节点加入新网络的一次性过程。


    以下是我在1.2.2a 堆栈上运行的 CPU 负载测试的结果。 我的设置是2 SmartRF06 + CC2538EM。

    测试1:(测量 ZC SampleLight、ZED SampleSwitch 发送连续100ms 切换)
    OSAL_systemClock:136902
    cpuUsage累 加器:20255
    利用率:14.8%

    测试2:(测量 ZC SampleLight、ZED SampleSwitch 发送连续30ms 切换)
    OSAL_systemClock:94648
    cpuUsage累 加器:41031
    利用率%:43.3%

    测试3:(测量 ZC SampleSwitch、ZC SampleSwitch 发送连续30ms 切换至 ZR SampleLight)
    OSAL_systemClock:72448
    cpuUsage累 加器:2633
    利用率%:3.6%

    从这些结果中、我们可以看到、接收命令的器件比正在发送命令的器件占用的 CPU 多得多。 请记住、对于实际应用、每100ms 或30ms 发送一次切换命令的速度可能不切实际、但此测试的重点是查看 CPU 在重负载下的性能。

    针对测试所做的代码修改:

    我在 osal_run_system()循环(带+的行)中向 OSAL.c 添加了以下代码:

    + timeStamp1 = osal_GetSystemClock ();
    
    如果
    (tasksEvents[idx])//任务是已准备好的最高优先级,则执行{。
    {
    break;
    }
    }while (++idx < tasksCnt);
    
    if (idx < tasksCnt)
    {
    uint16事件;
    halIntState_t intState;
    
    HAL_enter_critical 部分(intState);
    事件= tasksEvents [idx];
    tasksEvents [idx]= 0; //清除此任务的事件。
    HAL_EXIT_CRITICAL_SECTION (intState);
    
    activeTaskID = idx;
    事件=(tasksArr[idx])(idx、事件);
    activeTaskID = task_no_task;
    
    HAL_ENTER_critical _section (intState);
    tasksEvents[idx]|=事件; //将未处理的事件添加回当前任务。
    HAL_EXIT_CRITICAL_SECTION (intState);
    
    +// CPU 负载测试
    + timeStamp2 = osal_GetSystemClock ();
    + cpuUsage累 加器+= timeStamp2 - timeStamp1;
    } 

    在 Z-Stack 中,osal_run_system()是在系统的无限循环中执行的函数,如果有一个挂起任务,则通过此函数的每次迭代都将执行下一个挂起任务。 基本上、如果没有挂起的任务、我们不会在上面输入 if ()语句、并且在该迭代期间堆栈不会使用 CPU。 如果有待处理任务,我们输入 if()语句,下一个待处理任务由(tasksArr[idx])(idx,events)执行。

    为了测量堆栈的 CPU 使用率、我在执行任何挂起任务之前每次输入 osal_run_system()循环时采用一个"时间戳"(osal_GetSystemClock())(以 ms 为单位)返回当前系统时钟)、如果有挂起任务、我在完成后采用另一个时间戳。 这两个时间戳之间的差异是在此迭代期间 CPU 用于执行堆栈任务的系统时间量、我通过将其添加到 cpuageAccumulator 变量来跟踪所有这段时间。

    如果您有任何其他问题、请告诉我。

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

    我运行的是3.0 ZNP、具有大量的来回串行通信(大型网络、大型应用)和安全性。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    JasonB、

    如果我回答正确、这将排除中断所花费的时间。 对吧?

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

    目前、您在轻负载网络上的 Z-Stack 3.0 ZNP 上提供的代码(设备连接、转储并通过 ZCL 读取进行 ping)的利用率达到了1.23%。

    这似乎非常低。 有什么想法?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想、如果 OSAL 时钟没有在 ISR 内部递增、那么是的、它不包括 ISR 中花费的时间。

    2.听起来不错。 除非您使用一组 ZCL 传入命令不断地满贯 ZNP 器件、否则 Z-Stack 不会做太多工作、该命令必须非常快速地解析并向主机应用发送通知、否则该器件将仅位于此处、RX 将等待异步消息。