摘要:例如,在自动驾驶系统中,车辆对突发状况的响应时间必须足够短,以确保安全驾驶。一般来说,关键任务的响应时间需要控制在毫秒级甚至微秒级。
大家好,我是杂烩君。
这次给大家分享关于嵌入式中性能指标的一些知识。嵌入式软件性能指标是衡量嵌入式系统性能优劣的重要依据。
各行业,比较通用的嵌入式软件性能指标有哪些?
嵌入式软件的性能指标通常围绕实时性和资源效率展开。以下是最重要的几点指标:
实时性指的不是“快”,而是“准时”——硬实时系统允许速度慢,但必须守时。
这个指标直接影响到系统的交互性,这个指标航空航天、工业自动化等领域至关重要。
例如,在自动驾驶系统中,车辆对突发状况的响应时间必须足够短,以确保安全驾驶。一般来说,关键任务的响应时间需要控制在毫秒级甚至微秒级。
Percepio View 是一款基于 Percepio Tracealyzer 的免费追踪工具,用作 FreeRTOS 应用程序的监控,便于调试和验证。
Percepio View 可以与传统调试器(如ST-Link、J-Link)结合使用,通过任务和 ISR 实时执行情况 可视化的方式对调试器加以补充。
这些任务包括 FreeRTOS API 调用和您自己的“用户事件”。 它不需要任何特殊的追踪硬件。
SEGGER SystemView是一个实时记录和可视化工具,用于分析和描述嵌入式系统的行为。
它提供了对运行时行为的深入了解,超越了传统调试器的功能。
SystemView 可免费用于非商业用途,且功能不受限制。
SystemView非常适合具有多线程和中断的复杂系统,它可以帮助开发人员确保他们的系统按预期执行,识别低效率,并发现意外的交互或资源冲突。
通过调试接口记录来自嵌入式系统的监控数据,SystemView详细地可视化任务、中断和软件定时器的执行情况。
二、资源使用效率这个指标主要衡量系统硬件资源(如 CPU、内存)的使用情况。
通过监测资源利用率,可以了解软件对硬件资源的需求和占用程度,避免资源过度占用或浪费。
例如,如果 CPU 利用率长期过高,可能导致系统响应变慢甚至崩溃;内存利用率过高则可能引发内存泄漏等问题。
CPU使用率定义为CPU在某个时间段内用于执行计算任务的时间占总时间的比例。具体来说,CPU使用率 = 1 - 空闲时间/总CPU时间。
合理的资源利用率可以使系统在有限的硬件资源下稳定运行,并为未来的功能扩展预留一定的资源空间。
SEGGER SystemView配合 J-Link,捕获任务切换和中断事件,分析 CPU 占用热点,支持 FreeRTOS、Zephyr 等 RTOS。
在FreeRTOS中通过 config GENERATE_RUN_TIME_STATS配置启用,统计每个任务的 CPU 占用率及执行时间。
无需额外工具,直接集成在 FreeRTOS 中,适合快速定位高负载任务。
perf是一个基于Linux内核的性能事件子系统,可以收集各种性能数据,如CPU使用率、内存访问、函数调用等。
使用命令:
perf record -e cpu-clock -g ./embedded_app # 记录 CPU 事件perf report # 生成热点函数分析报告2、 内存使用分析工具(1)heap-monitoringheap-monitoring是SEGGER SystemView中的应用程序中的动态存储监控工具。
在应用程序使用C或C++堆、多个自定义堆或RTOS提供的内存池对象,可以使用heap-monitoring跟踪这些对象的使用情况,分析它们的使用模式,评估堆上的负载、识别潜在的内存泄漏、跟踪内存峰值使用情况等的格式显示收集到的信息。
使用方式:使用SEGGER_SYSVIEW_HeapDefine定义一次堆的特征,并使用SEGGER_SYSVIEW_HeapAlloc和SEGGER_SYSVIEW_HeapFree监视它的使用情况。
在FreeRTOS中通过 config CHECK_FOR_STACK_OVERFLOW 配置检测任务堆栈溢出。实时监控任务栈使用,防止内存越界导致的系统崩溃。
Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具。
往期文章:工具 | Valgrind仿真调试工具的使用
Valgrind工具包包含多个工具:
其中Valgrind Massif工具是堆栈分析器。堆栈分析器,它能测量程序在堆栈中使用了多少内存,告诉我们堆块,堆管理块和栈的大小。
Valgrind Massif能帮助我们减少内存的使用,在带有虚拟内存的现代系统中,它还能够加速我们程序的运行,减少程序停留在交换区中的几率。
Valgrind由内核(core)以及基于内核的其他调试工具组成。
其基于仿真方式对程序进行调试,它先于应用程序获取实际处理器的控制权,并在实际处理器的基础上仿真一个虚拟处理器,并使应用程序运行于这个虚拟处理器之上,从而对应用程序的运行进行监视。
应用程序并不知道该处理器是虚拟的还是实际的,已经编译成二进制代码的应用程序并不用重新进行编译,Valgrind 直接解释二进制代码使得应用程序基于它运行,从而能够检查内存操作时可能出现的错误。
所以在Valgrind下运行的程序运行速度要慢得多,而且使用的内存要多得多。因此,最好在性能好的机器上使用Valgrind,并且是在开发调试阶段使用。
三、代码执行效率代码执行效率直接影响系统的 可靠性、实时性、功耗 和 成本。
图像处理算法中,综合考虑资源利用平衡,改用查表法进行效率提升。通信协议解析中,减少冗余字符串操作函数调用次数。GNU gprof,这是一个经典的性能分析工具,集成在GCC中,只需添加编译选项即可使用,适用于Linux/MPU 或交叉编译环境(如 ARM Cortex-A 系列),定位算法或逻辑瓶颈。
它能够显示每个函数的调用次数和执行时间,帮助定位热点代码。对于嵌入式开发,可以在交叉编译环境中使用。
编译代码时启用分析:
gcc -pg -o my_app my_code.c生成分析报告:
gprof my_app gmon.out > report.txt四、其他指标可靠性:嵌入式系统,尤其是应用于关键领域(如医疗设备、交通控制等)的软件,可靠性是至关重要的指标。软件需要具备容错能力、错误恢复能力和稳定性,以应对各种可能出现的异常情况,确保系统持续、稳定地运行。功耗:低功耗设计可以延长设备的使用时间,减少充电频率,提高用户体验。同时,对于大规模部署的物联网设备,降低功耗还可以降低运营成本和对环境的影。可预测性:确保所有任务在任意负载下均满足截止时间(硬实时系统的核心)。通信吞吐量:在涉及网络或总线(如CAN、Ethernet)的系统中,数据吞吐和延迟是关键。工具链影响:编译器优化级别、调试代码(如断言)对性能的影响需在发布版本中评估。要是这篇文章给你带来了新启发,动动手指点个在看/转发呗。
来源:嵌入式大杂烩