Сегодня поговорим про random в esp32. Это ничто иное как генерация случайных чисел (ГСЧ). Random в ESP32 использует внутренний источник энтропии (внешний источник случайности) или RF систему как источник случайности (WI-FI, Bluetooth).
Случайные и псевдослуайные числа
Во время запуска загрузчик ESP-IDF временно включает источник энтропии, не являющийся радиочастотным (внутренний шум опорного напряжения), который обеспечивает энтропию для любого первого генерации ключа загрузки. Однако после того, как приложение начинает выполняться, обычно доступны только псевдослучайные числа, пока не будет инициализирован Wi-Fi или Bluetooth.
Чтобы временно включить источник энтропии во время запуска приложения или для приложения, которое не использует Wi-Fi или Bluetooth, вызовите функцию bootloader_random_enable()
, чтобы повторно включить внутренний источник энтропии. Эту функцию bootloader_random_disable()
необходимо вызвать, чтобы снова отключить источник энтропии, прежде чем использовать ADC, I2S, Wi-Fi или Bluetooth.
Библиотеки генерации случайных чисел
esp_random.h
Что бы мы могли использовать функцию генерации случайных чисел в ESP32, необходимо подключить библиотеку esp_random.h
. В библиотеке описаны функции для работы с встроенным ГСЧ (генератором случайных чисел).
#include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_system.h" #include "esp_random.h"
Что бы сгенерировать случайное число, используйте функцию esp_random()
. Она возвращает случайное число от 0 до UINT32_MAX.
Так же в ESP32 предусмотрена функция для генерации последовательности случайных чисел:
void esp_fill_random(void * buf, size_t len)
где buf — буфер для сгенерированных чисел, len - размерность буфера (количество значений).
bootloader_random.h
Этот файл заголовка является частью API, предоставляемого компонентом bootloader_support
. Чтобы объявить, что ваш компонент зависит от bootloader_support
, добавьте в CMakeLists.txt следующее:
REQUIRES bootloader_support или PRIV_REQUIRES bootloader_support
Библиотека содержит следующие функции:
bootloader_random_enable
void bootloader_random_enable(void)
Включает внутренний источник энтропии для ГСЧ, если подсистема RF отключена.
Точный механизм источника внутренней энтропии зависит от используемого чипа, но все SoC используют АЦП для непрерывного смешивания случайных битов (считывание внутреннего шума). Функцию можно вызвать из кода приложения, если требуются истинные случайные числа без инициализированной RF-подсистемы. Это может иметь место в коде раннего запуска приложения, когда радиочастотная подсистема еще не запущена или если её не следует включать для энергосбережения.
Внимание
Данную функцию не следует использовать, если другие блоки программы используют RF или АЦП.
bootloader_random_disable
void bootloader_random_disable(void)
Как следует из названия, данная функция отключает внутренний источник энтропии. Функция должна быть вызвана после bootloader_random_enable()
и до инициализации функций RF-подсистемы, ADC или I2S.
bootloader_fill_random
void bootloader_fill_random(void * buff, size_t len)
Генерирует последовательность случайных чисел в буфер buff
в количестве len
.