Skip to main content
A.M.
Associate III
April 13, 2023
Solved

How to check, and eventually enforce Performance governor on STM32MP15 openst-linux?

  • April 13, 2023
  • 3 replies
  • 2925 views

I am trying to achieve hard real-time under 100us on the STM32MP157f-eval, specifically, on the Cortex A7 dual core.

Note: I specifically target the Cortex A7 cores because the M4 is already taken for other tasks which requires much smaller latency.

What I did so far is:

  • Build the Yocto openst-linux
  • Add Preempt-RT patch
  • Added several software: irqbalance, tuna, hiccups... to monitor and tune the system.
  • Isolate one core
  • Tested high-priority process, also IRQ. Tested with internal clock and external oscilloscope.
  • Tried to disable most drivers

After all those efforts, the jitter did not improved, and I still get >1ms jitter when applying load for enough time.

------------------------------

My next step is to ensure that the cpu frequency is not throttled.

I read https://wiki.st.com/stm32mpu/wiki/How_to_change_the_CPU_frequency but it's not yet clear to me how to check and set this.

Also, most general questions found on internet don't seem to apply to this architecture.

How to check that cpu frequency is at maximum performance and not throttled?

----------------------------

When using the following command:

$ perf stat -a -A --timeout 10000
 
CPU0 10003.99 msec cpu-clock # 1.000 CPUs utilized
CPU1 10003.97 msec cpu-clock # 1.000 CPUs utilized
CPU0 184937 context-switches # 18.486 K/sec
CPU1 8410 context-switches # 840.666 /sec
CPU0 1 cpu-migrations # 0.100 /sec
CPU1 1 cpu-migrations # 0.100 /sec
CPU0 0 page-faults # 0.000 /sec
CPU1 0 page-faults # 0.000 /sec
CPU0 6498043474 cycles # 0.650 GHz
CPU1 176739089 cycles # 0.018 GHz
CPU0 2838852339 instructions # 0.44 insn per cycle
CPU1 52273406 instructions # 0.30 insn per cycle
CPU0 471022215 branches # 47.083 M/sec
CPU1 5995202 branches # 599.282 K/sec
CPU0 108715456 branch-misses # 23.08% of all branches
CPU1 1995755 branch-misses # 33.29% of all branches

The cycles don't match the maximum, I deduce that the frequency is throttled down.

This topic has been closed for replies.
Best answer by Erwan SZYMANSKI

@A.M.​ ,

Do you have a netdata service that is running on your target ? It can be easily used to check the CPU frequency over the time. (link here: https://wiki.st.com/stm32mpu/wiki/Netdata)

Rgs,

Erwan.

3 replies

Erwan SZYMANSKI
Technical Moderator
April 14, 2023

Hi @A.M.​ ,

I see that you tried to apply PREEMP-RT patches on our Linux Kernel. Did you take the patches directly from the community or did you use our X-LINUX-RT expansion package ?

If not, please look at this article that can provide you some hints: https://wiki.st.com/stm32mpu/wiki/X-LINUX-RT_OpenSTLinux_Expansion_Package

Kind regards,

Erwan.

In order to give better visibility on the answered topics, please click on 'Accept as Solution' on the reply which solved your issue or answered your question.
PatrickF
Technical Moderator
April 14, 2023

Hi @A.M.​ 

To check and affect governor, you either keep only fastest OPP in the device tree or you could try to change it at run time:

cat /sys/devices/system/cpu/cpufreq/policy0/scaling_governor
cat /sys/devices/system/cpu/cpufreq/policy0/scaling_cur_freq
cat /sys/kernel/debug/regulator/regulator_summary | sed -n -e "1p;2p;/vddcore/p"
 
cat /sys/devices/system/cpu/cpufreq/policy0/scaling_available_frequencies
cat /sys/devices/system/cpu/cpufreq/policy0/scaling_available_governors
 
echo performance > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor
 
cat /sys/devices/system/cpu/cpufreq/policy0/scaling_governor
cat /sys/devices/system/cpu/cpufreq/policy0/scaling_cur_freq
cat /sys/kernel/debug/regulator/regulator_summary | sed -n -e "1p;2p;/vddcore/p"

Regards.

In order to give better visibility on the answered topics, please click on 'Accept as Solution' on the reply which solved your issue or answered your question.NEW ! Sidekick STM32 AI agent, see here
A.M.
A.M.Author
Associate III
April 17, 2023

Thank you for your replies.

1) Which PREEMPT-RT patch did I use?: I took the yocto layer from https://github.com/PRG-MPU-ALPHA/meta-st-x-linux-rt. (Witch is the same repo than https://github.com/STMicroelectronics/meta-st-x-linux-rt, before it was made public).

2) @PatrickF​ cat /sys/devices/system/cpu/cpufreq does not exists. I think this is one of the changes made by the PREEMPT_RT layer, according to the answer from Ewan SZYMANSKI.

From those two points, I deduce that the frequency scaling is disabled and always at maximum frequency. Is there a way to check this?

Because from the `perf` results, it look like the CPU frequency is adjusted, which could be a reason for my jitter. It might also be that `perf` tool is not counting `nop` when the core is idle.

Erwan SZYMANSKI
Erwan SZYMANSKIBest answer
Technical Moderator
April 17, 2023

@A.M.​ ,

Do you have a netdata service that is running on your target ? It can be easily used to check the CPU frequency over the time. (link here: https://wiki.st.com/stm32mpu/wiki/Netdata)

Rgs,

Erwan.

In order to give better visibility on the answered topics, please click on 'Accept as Solution' on the reply which solved your issue or answered your question.
A.M.
A.M.Author
Associate III
April 18, 2023

Hi @Erwan SZYMANSKI​ 

Netdata is running, and it was a great discovery to troubleshoot performance.

I could not find any "CPU frequency" there, the cpu usage (<10%) suggest it is at maximum performance, not sure if I missed something.

Regards,

A. Maire