ARM裸机系统中的CPU使用率测量

6
我正在处理一个ARM Cortex M4评估板,这是一个裸机应用程序,没有任何操作系统运行。现在我想测量给定进程/算法的CPU使用率,最好的方法是什么?我是否需要实现一个操作系统来测量具有此需求功能的CPU使用率?

你需要实时测量CPU使用率吗? - junix
你为什么想要CPU使用率?在这样的控制器上,通常需要实时行为,即某些任务必须在给定的时间范围内足够快地完成。 - starblue
3个回答

7
这个问题几乎是自问自答的。当你的裸机应用程序不在这个进程/算法中时,它在做什么?测量其中之一或两者兼备。如果你有一个裸机应用程序,在这个算法中没有完全消耗CPU,那么你已经有了操作系统,因为你正在管理这个应用程序/函数的时间。你可以使用许多方法,从一个简单的循环计数器相对于定时器到查看算法在获取时间片和未获取时间片时每个循环的计数。你也可以简单地计算算法本身的时间等。
我假设当你说CPU时,你指整个系统,因为你的性能严重依赖于你的代码以及它正在与何物交互。如果在cortex-m4上从flash运行,根据时钟速率,你可能只是在等待指令或数据时烧掉处理器周期(并且很容易对处理器性能产生错误的概念,认为是算法而不是烧掉处理器周期)。缓存屏蔽/操作该性能,并且如果你不小心并且不知道它们在做什么,很容易极大地影响性能。作为C++问题,编译器在性能方面起着重要作用,当然你的代码也是如此,只需最小更改命令行或代码,就可以使代码运行几倍快或慢。
如果算法是isr的一部分,则处理器会休眠,否则,你可以使用gpio引脚和示波器技术来感受运行比率与睡眠比率。

4
实现一个用于测量 CPU 空闲时间的操作系统对我来说似乎有些过度设计。据我所知,Cortex-M4 包括一个调试单元 (DWT),允许您快照 周期计数器。但最简单的方法是将引脚连接到示波器上,并在算法进入和退出时切换它。

但是,获取寄存器的快照有什么帮助呢?据我所知,我能得到的唯一信息就是自进程开始以来的周期数。 - Fluffy
您可以获取 CPU 自启动以来执行的循环次数。在进入和退出时对其进行快照,使您能够计算出经过的周期差,并获得算法使用的周期数。您是否有类似“空闲”任务的东西? - junix
通过将这些周期乘以我的循环时间(以纳秒为单位),我可以得到运行时间,但不包括 CPU 使用率,我说的对吗? - Fluffy
实际上,在裸机硬件上,运行时间和 CPU 使用率几乎相同。如果你不是理论工程师(我的意思是例如你的程序从内存中读取数据,并且缓存中没有数据,其他指令依赖于这个内存读取,所以 CPU 核心会挂起并等待与内存一起工作的 IP 块来传输数据到缓存中,是的,可以说我们在这里没有使用 CPU 核心,但谁关心这个)。因此,你只需要处理中断,并从全局计数器中减去它们的时间,你的运行时间将几乎与 CPU 花费的时间相同。 - fghj
@user1034749 这实际上取决于你在 CPU 上还做了什么。例如,如果你进入了省电模式,只有循环计数才能给你关于 CPU 使用情况的提示。 - junix
显示剩余3条评论

1
首先,仅为了测量性能而实施操作系统是不切实际甚至不可能的。因此,一种可能的方法是保持计数变量,记录发生的滴答数直到该持续时间。并在定时器中断中增加该变量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接