Thread 中讨论的其他器件: Z-stack
您好!
我想确保 CC2538在 Z-Stack 之上运行的应用不会使 CPU 饱和。 我可以使用什么方法来确定可用的空闲时间或 CPU 使用的时间?
我考虑了一个间隔较短且测量抖动的振荡器。 是否有更好的方法? TI 在这里做什么?
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.
您好!
我在返回到 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 变量来跟踪所有这段时间。
如果您有任何其他问题、请告诉我。