Добавить в корзинуПозвонить
Найти в Дзене
Idiom Insanity!

Сравнение быстродействия ESP32 и STM32 на одинаковой нагрузке

Микроконтроллеры стали неотъемлемой частью современных электронных устройств. Сегодня я хочу поделиться результатами сравнительного тестирования двух популярных микроконтроллеров: ESP32-WROOM-32 и STM32H503CB. Мы проведем нагрузочное тестирование с использованием одинаковой вычислительно сложной функции и проанализируем результаты. ESP32-WROOM-32 и STM32H503CB Для честного сравнения производительности
микроконтроллеров я использовал одинаковую тестовую функцию на обоих устройствах. Эта функция выполняет: Функция выполняет 10 миллионов итераций, что позволяет достоверно оценить производительность МК в задачах, требующих интенсивных вычислений. Каждую тысячную итерацию функция делает короткую паузу, чтобы RTOS мог обслужить другие задачи и сторожевой таймер. Вот код тестовой функции: #define MODULO 1000000007
#define NUM_ITERATIONS 10000000
uint32_t mod_pow(uint32_t base, uint32_t exp, uint32_t mod) {
uint32_t result = 1;
base = base % mod;
while (exp > 0) {
Оглавление

Микроконтроллеры стали неотъемлемой частью современных электронных устройств. Сегодня я хочу поделиться результатами сравнительного тестирования двух популярных микроконтроллеров: ESP32-WROOM-32 и STM32H503CB. Мы проведем нагрузочное тестирование с использованием одинаковой вычислительно сложной функции и проанализируем результаты.

Участники тестирования

ESP32-WROOM-32 и STM32H503CB

Методология тестирования

Для честного сравнения производительности
микроконтроллеров я использовал одинаковую тестовую функцию на обоих устройствах. Эта функция выполняет:

  1. Вычисление модулярного возведения в степень
  2. Расчет факториала по модулю
  3. Комбинирование результатов в аккумулятор

Функция выполняет 10 миллионов итераций, что позволяет достоверно оценить производительность МК в задачах, требующих интенсивных вычислений. Каждую тысячную итерацию функция делает короткую паузу, чтобы RTOS мог обслужить другие задачи и сторожевой таймер.

Вот код тестовой функции:

#define MODULO 1000000007
#define NUM_ITERATIONS 10000000

uint32_t mod_pow(uint32_t base, uint32_t exp, uint32_t mod) {
uint32_t result = 1;
base = base % mod;
while (exp > 0) {
if (exp & 1)
result = (uint64_t)result * base % mod;
exp = exp >> 1;
base = (uint64_t)base * base % mod;
}
return result;
}

uint32_t heavy_benchmark_function(void) {
uint32_t acc = 0;
for (uint32_t i = 1; i < NUM_ITERATIONS; i++) {
uint32_t pow_res = mod_pow(i, i % 17 + 7, MODULO);
uint32_t fact = 1;
for (uint32_t j = 1; j <= (i % 13) + 7; j++) {
fact = ((uint64_t)fact * j) % MODULO;
}
acc = (acc + pow_res * fact) % MODULO;


if (i % 1000 == 0) vTaskDelay(1);
}
return acc;
}
esp32
esp32
stm32
stm32

Результаты тестирования

Оба микроконтроллера успешно выполнили тестовую задачу и
пришли к одинаковому результату (90586604), что подтверждает
корректность вычислений. Однако время выполнения существенно отличалось:

ESP32-WROOM-32:

Начало выполнения: 08:44:53.828 - Окончание выполнения: 08:46:33.823 .Время выполнения: около 1 минуты 40 секунд

-3

STM32H503CB:

Начало выполнения: 08:45:02.793- Окончание выполнения: 08:48:32.502 .Время выполнения: около 3 минут 30 секунд

-4

Анализ результатов:

Неожиданным открытием стало то, что ESP32 оказался более чем в два раза быстрее STM32H503CB. В данном конкретном тесте преимущество двух ядер ESP32 не использовалось, и ускорение связано с архитектурными особенностями и эффективностью работы одного ядра, а не с многопоточностью .

Краткие выводы:

Если вы хотите максимальный результат, всегда тестируйте конкретно свой код под "боевыми" условиями на подходящих МК — и не забывайте, что прошивка, настройка компилятора и питание могут решать исход битвы не хуже, чем частота ядра!