如何对 Cortex-M 架构的一些算法进行基准测试

问题描述

对于我当前的项目,我必须调查 Cortex-M4 上不同算法的运行时行为(使用周期)。这些算法是纯 C 语言计算,没有 IO 和中断。任何提示和想法如何做到这一点?

我目前的想法是创建一个最小的应用程序并使用 renode (https://renode.io/) 进行周期计数:

  • 使用一个具有固定签名的函数创建一个文件 test.c,该函数运行我的算法
  • 编译并链接它以执行最小的应用程序
  • 将应用程序和所需的输入数据加载到 renode
  • 运行应用程序
  • 从renode中提取输出数据
  • 使用来自 renode 的分析数据对算法进行评分

现在是问题:

  • 是否有人将 renode 或 QEMU 用于类似目的?
  • 如何创建真正的最小应用程序? (crt0,ld 标志)
  • 对我的问题还有其他想法吗?
  • 如何在 renode 中配置最小系统?哪些组件是成功运行 C 程序的最小子集?

问候 扬

解决方法

仅供参考:我在 Antmicro 工作,是 Renode 的作者之一

确实有很多方法可以执行此类分析。请注意,Renode 不是周期精确的,但您可以跟踪虚拟时间进程。

一种可能的方法是使用 Renode 的指标分析器。您可以在此处阅读文档:https://renode.readthedocs.io/en/latest/basic/metrics.html

它允许您捕获数据并在 Python 中对其进行分析或立即生成一些图表:

# in Renode
(monitor) machine EnableProfiler "path_to_dump_file"

# in Bash
python3 tools/metrics_analyzer/metrics_visualizer/metrics-visualizer.py path_to_dump_file

您还可以分析在 UART 上出现特定字符串之前经过的虚拟时间。这可以通过机器人测试来完成。可以在此处找到时间戳提取的示例:https://github.com/renode/renode/blob/master/tests/platforms/QuarkC1000/QuarkC1000.robot#L44

${r}        Wait For Line On Uart     My String
            Do Something With Time    ${r.timestamp}

如果需要,另一种选择是检测您的代码并从内存中转储二进制数据。

您还可以添加要在特定程序计数器值上调用的挂钩 - 然后您可以将这样的时间戳转储到日志中。

可能还有许多其他选择可以推进,但这取决于您的具体用例。

Renode 中的最小系统:取决于您的软件,它需要

  • 一个核心
  • nvic 控制器,如果是 Cortex-M
  • 记忆
  • uart 如果你想要输出。