Skip to content

性能测试 ​

以下所有数据都来自真实硬件,使用项目自带的基准测试套件测量。编译选项为 面向时间的最高优化等级(GCC 使用 -O3,可用时开启 LTO;Keil 与 IAR 使用 各自的最高等级)。

所有时间列均为 CPU 周期数、平均情况。每个原语在每颗芯片上的最坏情况 (WCET)公布在 Include/Test/Chip/ 的测试头文件中——在实时系统里,那才是 真正要关心的数字。

一图速览 ​

线程切换 Yield(周期,越低越好)144Keil164GCC176IAR邮箱通信 Mail(周期,越低越好)288Keil308GCC308IARRMP · STM32H743ZIT6(Cortex-M7)· 最高优化 · 真机实测

实用移植 ​

这些是日常嵌入式工作中使用的移植,从 8 位 AVR 一直到 Cortex-M55 与 RISC-V。... 表示沿用上一行的芯片、平台与编译工具。

芯片平台编译YieldMailSemFIFOMsgqBmqMail/ISem/IMsgq/IBmq/IMemAlrm
ATMEGA328PAVRGCC408719686313106513186246269051073N/ATBD
ATMEGA1284P......4377517173141098135263763992110871680TBD
ATMEGA2560......4497747363261131139665665494211171686TBD
R5F104PJRL78CCRL26156552030892412255395007899641854TBD
PIC24FJ128PIC24FXC16152334271168468654274213352461379TBD
DSPIC33EP512DSPIC33E...214447353219608851368278455602448TBD
MSP430F149MSP430CCS3126415733129851278528487739898N/ATBD
MSP430FR5994MSP430X...468105489149215732072891784117614643291TBD
STM32F030F4Cortex-M0Keil362763666379119616096896169501211N/ATBD
......GCC366802690396124616857056229541200N/ATBD
HC32L136K8Cortex-M0+Keil211422370219646873403350532673542TBD
STM32L071CBCortex-M0+Keil3355815322538921167554524756945N/ATBD
......GCC33765660028494712605786027941003N/ATBD
STM32G071RBCortex-M0+Keil264465407209697948463400577726N/A904
......GCC289536480233694958489462599772N/A892
......IAR2985454802527621012532471643757N/A1062
STM32F103RECortex-M3Keil203438385226684930392354542707518TBD
......GCCTBDTBDTBDTBDTBDTBDTBDTBDTBDTBDTBDTBD
STM32F405RGCortex-M4FKeil180345321180667886309302498626455TBD
......GCC196388345192677953381349566743411TBD
STM32F429ZICortex-M4FKeil168309285176608800349277429586393666
......GCC172352293176478769357313474631384620
......IAR160345292188574776354277502610416775
STM32F767IGCortex-M7FKeil176329277174510694328259413516334TBD
......GCC182335288156473643313264375514332TBD
STM32H743ZICortex-M7FKeil144288220149421626252216327444295549
......GCC164308254152429585300242344456295479
......IAR176308264148524718284274396521297535
M2351KIAAECortex-M23Keil213390349197675957441339535655498777
......GCC2655545382107061008492444565751674763
......IAR228512387211642887444366522663501900
STM32N657X0Cortex-M55GCC163298252135391524289256336427307527
......Keil155281228130421571282246364454309555
......IAR162303262154456607290260375449330631
TMS570LS0432Cortex-R4CCS306493460193686897480464592736533TBD
TMS570LC4357Cortex-R5...275479467216746998440435595763482TBD
TMS320F2812C28xCCS217493407229706954436381583727939TBD
TMS320F28335C28x/FPU32...2465134402357511001440413622770946TBD
CH32V307VCRV32IMACGCC209386336172538698350306436555433TBD
...RV32IMAFC...217398341172557705358307444556433TBD
Xeon 6326X86-LINUXGCC24k24k24k4624k24k31k30k34k53k159TBD

最小的移植

能跑完整个基准测试的最小概念验证平台是 ATmega328P——32 KB Flash、2 KB SRAM。 在 STM32F030F4 上,绝对最小内核为 1.6 KB ROM 与 432 字节 RAM,其中已包含 第一个线程的控制块与栈,以及 64 字节的中断栈;内核与精简 HAL 合计仅 52 字节。

纪念性移植 ​

这些移植面向塑造了计算历史的机器——既是为了挑战,也因为它证明了抽象并不 依附于现代指令集。

芯片平台编译YieldMailSemFIFOMsgqBmqMail/ISem/IMsgq/IBmq/IMemAlrm
RP2A03/FC-84MOS6502CC65407354355435202877261044548315180722083507484TBD
.../MESEN......406054395424204077281044348365185722783557446TBD
SPCE061AunSPGCC694173215489272671370916191475224228893518TBD
PIC32MZ2048MIPSXC32190345305150475620295260370465365TBD
...MIPS-FR64...475630585160775935400360490585371TBD
Z84C0004/TP-801Z80Z88DKTBDTBDTBDTBDTBDTBDTBDTBDTBDTBDTBDTBD

RVM 虚拟化移植 ​

同一个内核作为非特权虚拟机运行在 RVM 之上。V 是普通操作 的虚拟化开销,V/I 是中断操作的虚拟化开销。

芯片平台编译YieldMailSemFIFOMsgqBmqVMail/ISem/IMsgq/IBmq/IV/IMemAlrm
STM32L071CBCortex-M0+Keil3827016093021007134714%1370129215451741147%N/A1216
......GCC4007516493211064142019%1424134116031796210%N/A1291
STM32F405RGCortex-M4FKeil25243637220070892440%1180108812881452281%385798
......GCC312540448204656100859%1336125214041572250%380739
STM32F767IGCortex-M7FKeil1842932751445047056%772742899983135%275578
......GCC1923522921484666506%90385310011119239%270508
CH32V307VCRV32IMACGCC23338433614848962917%1287123913401421267%390605
...RV32IMAFC...32549743616961676750%1789174218571951399%390608

即便取表中最差的一行,虚拟化后的上下文切换仍比同级别 Cortex-M7 上的 RT-Linux 快约 25 倍——而且这个开销是有界的,不只是平均意义上较小。

指标定义 ​

指标含义
Yield从一个线程切换到另一个线程
Mail两个线程之间的邮箱通信
Sem两个线程之间的信号量通信
FIFO单线程内的 FIFO 读写配对
Msgq两个线程之间的消息队列(仅接收方可以阻塞)
Bmq阻塞消息队列(双方都可以阻塞)
Mail/I从中断向邮箱发送
Sem/I从中断投递信号量
Msgq/I从中断向消息队列发送
Bmq/I从中断向阻塞消息队列发送
Mem一次内存池 malloc/free 配对
Alrm五个周期闹钟(1/2/3/5/7 个 tick)的平均处理时间

如何读这些数字 ​

  • 这些是平均情况数值,只是为了便于比较。每颗芯片的 WCET 位于 Include/Test/Chip/,设计时应以它为准。
  • TBD 表示移植已经存在且可以构建,但尚未在硬件上测量;N/A 表示该操作 不适用于这个平台(例如该移植未启用内存池)。
  • 项目不使用任何“偷巧”的优化:没有破坏可移植性的特定工具链指令序列,没有 绕过调度器的协作式切换,也没有最坏情况无界的平均情况快路径。
  • 时间单位是周期而不是微秒,因此与主频无关。乘以核心的周期时间即可换算成 实际时间。

本软件是 EDI 的官方作品,属于公有领域。

GitHub·Discord·QQ 群 1038895132·rtospro.com