|
很高兴收到了 NUCLEO-H5E5ZJ 开发板,参与评测。$ R: Q+ l4 V: g% N- G* o/ M8 q7 b 这个新的开发板我遇到过两个问题: 1. STlink无法识别连接0 R6 m' h" K9 N stlink
刚开始遇到这个问题我还以为是板子坏了,后来一想新板子怎么会坏呢,会不会是芯片太新了导致没识别到,后来升级了CubeProgrammer版本之后可以成功连接了- U, j2 k6 a7 @ ^9 j 2. 代码无法编译- D5 K; q6 x# ~' k
编译报了一个故障,这里同样也是升级了CubeIDE版本之后解决的。4 k f) Z$ J8 m3 d( P* s( P 3 X9 p6 W5 `3 V( ?" w0 _ 用ThreadX作为RTOS测试) x/ z1 B+ J% x* e) P# ?% w
打开CubeMX工具,选择Board,这里选择H5E5ZJ板子,然后Without TrustZone,默认外设都选上。
因为要用的RTOS,所以这里我选择了ThreadX作为测试用的RTOS。
配置的话修改了两个地方,一个是RTOS内存大小为10240,另外就是打开了初始化APP任务9 v, ~* k$ B9 S# ~# L3 l
RTOS会用到systick中断,所以HAL原有的时基需要修改,这里改成TIM6为HAL使用
最后就是需要修改时钟为250Mhz,这里填写250之后会自动解决时钟问题
我是生成的CubeIDE代码,生成完之后打开工程进行了一下编译,通过之后就可以写代码了。. t! g; i1 J: r0 Q! ?2 N, Q- \
核心思路: 用两个任务 + 两个信号量,构造一个"乒乓"结构,精确测量从一个任务放弃CPU到另一个任务真正开始运行之间的时间,使用DWT计时。# X& g9 V% P- F( T' L, v0 d" Q DWT 计时是 Cortex-M 内核自带的 Data Watchpoint and Trace (DWT) 模块中的 CYCCNT 周期计数器来实现的高精度计时方法。 CPU 主频 = 250MHz 1 个周期 = 4ns4 |# ]7 N& R3 ^5 U5 N
7 x8 e" T! K* l
主要测试的是从触发中断的那条指令执行完到ISR 第一条指令开始执行之间的时间,同样使用DWT计时。3 b0 H. {7 l4 j G R+ E/ j 这里直接使用NVIC_SetPendingIRQ,写 NVIC 的 pending 寄存器,绕过外设,测出来的是纯粹的 CPU 中断响应时间,更干净。
然后编译运行结果如下:1 @% Y8 ?. T, ~9 J# b: ~6 M ======================================== STM32H5E5 CPU Performance Test' U4 k0 C/ w8 U Core: Cortex-M33 @ 250 MHz RTOS: Azure RTOS ThreadX ========================================! G/ e# v1 X; y9 j" }$ f3 U# d 9 i! t% N& B9 o& c/ l [1] Task Context Switch Test (1000 iterations)... j/ b# k! d4 `3 A; Z# E [1] Task Switch (n=1000): P50 = 656 cycles = 2624 ns P95 = 656 cycles = 2624 ns& e2 A; a2 N6 i- U8 \! a3 K P99 = 656 cycles = 2624 ns MAX = 6586 cycles = 26344 ns3 R$ ^' R& {! ]2 l6 T8 L- A [2] IRQ Response Latency Test (1000 iterations)...1 V' N# K. z' u l( i7 l8 s [2] IRQ Latency (n=1000):! V* l" j5 v8 j) m2 p N P50 = 47 cycles = 188 ns) {4 ]4 N1 E9 v P95 = 47 cycles = 188 ns& ~5 A% O4 P1 q8 s P99 = 47 cycles = 188 ns MAX = 90 cycles = 360 ns- B- `) o2 \0 Z2 \: K( F% [* K 这里P50/P95/P99表示在这1000个点中有百分之多少的值小于等于后面的值,比如P50 = 656cycle,也就是有50%的值小于等于656cycle。 所以数据看着还是很稳定的,99%的值都是稳定的,MAX这个值就是异常值,我猜测可能是systick中断插入其中导致的,这个可以忽略。' j. B# L/ M: Z, {" w' q5 v 但是这个测量值会不会有点长,任务切换需要2.6us,以前也没测过这个,看看能不能优化一下,比如改改编译配置什么的。& p8 E4 @% P( L % l# s8 ]9 [4 ?" m9 @ 于是我尝试修改编译优化,关闭FPU,因为FPU上下文保存会占用cycle,修改如下:
然后重新编译烧录运行结果如下:% g( H' |: M% K: q9 { ========================================, ~5 L2 K! o' k2 E0 T2 g STM32H5E5 CPU Performance Test Core: Cortex-M33 @ 250 MHz RTOS: Azure RTOS ThreadX4 \5 h: v& h5 P; B ========================================& E2 d! z I- B5 a/ L% \' h, B7 ~ [1] Task Context Switch Test (1000 iterations)...0 a& F" b7 n( b/ Y2 n [1] Task Switch (n=1000): P50 = 380 cycles = 1520 ns1 l- h5 X+ |9 {( T9 h% X P95 = 380 cycles = 1520 ns. D1 B. D/ r: \+ h/ _9 Y2 u$ S P99 = 380 cycles = 1520 ns5 E5 U- U8 \6 v+ N2 T, M" F# B% k6 Z MAX = 5833 cycles = 23332 ns [2] IRQ Response Latency Test (1000 iterations)... [2] IRQ Latency (n=1000): P50 = 22 cycles = 88 ns/ A/ \2 [! R7 p P95 = 22 cycles = 88 ns/ N2 ]: w# k5 Y/ Z* Z' f P99 = 22 cycles = 88 ns MAX = 41 cycles = 164 ns 修改之后确实快了很多啊,P99就能看出性能还是非常稳定的。 整个测试还是比较简单,当然应该还有不同的测试方法,可能还可以继续优化提升性能。( g- A C; m% _+ l$ \ . O, ^4 \' |& C1 a 7 T1 s: r$ X4 }4 q1 B+ h |
【STM32H5 评测】Part4 STM32H5E5 存储测试
【NUCLEO-H5E5ZJ评测】M.2存储扩展实测
【STM32H5 评测】+ 多外设同时开启稳定性简要评测
【NUCLEO-H5E5ZJ评测】CoreMark 移植实录:从 CubeMX 到 700.89 分
【STM32H5 评测】+ 增加ETH外设和NetX协议栈实验
从 CubeMX 到 MX2:这些关键变化必须知道
【STM32H5 评测】+ H5E5专用OLED点亮实验
【STM32H5 评测】ADC 电压表
【STM32H5 评测】Part3 STM32H5E5 密码学加速性能测试
【STM32H5 评测】 Part1 Cortex-M33@250MHz内核性能测试
微信公众号
手机版