【ESP-IDF】ESP32获取真随机数

news2024/9/20 16:48:24

ESP32内置一个真随机数发生器。我翻了好几个型号的ESP32的编程指南,都有相关的函数,应该是大部分型号都有,具体有没有还需要对照一下自己手上的ESP32型号。

我们可以从从随机数发生器的寄存器 RNG_DATA_REG 中读取随机数,每个读到的 32 位随机数都是真随机数。

那么ESP32是怎么做到真随机数的呢?

以系统中的热噪声和异步时钟为噪声源可以为随机数发生器提供随机数种子。

具体来说,这些热噪声可以来自 SAR ADC 或高速 ADC 或两者兼有。当芯片的SAR ADC或高速 ADC 工作时, 就会产生比特流,并通过异或 (XOR) 逻辑运算作为随机数种子进入随机数生成器。

不过上面这些我们都不需要知道,我们只需要知道怎么使用就行了。

首先包含头文件。

#include "esp_random.h"

然后我们直接调用下面这个函数就能直接获取随机数发生器的寄存器的32位bit了。

uint32_t esp_random(void)

除了上面这个函数获取32bit随机数之外,我们还可以使用下面的函数获取自己指定位数的随机数。

void esp_fill_random(void *buf, size_t len)

传入存放随机数的地址以及字节长度。

我们一开始就看了随机数发生器的寄存器,它就是32位,那么我们是怎么获取到除了32位之外位数的随机数呢?

我们打开源码就能看到,esp_fill_random本质上还是调用的esp_random,也就是说二者基本上是一样的。

另外产生真随机数的条件就是有噪声作为随机数发生器的随机数种子,因此我们再调用上面函数获取随机数之前还需要保证有随机数种子。

下面三个条件满足任意一个就行了(因为编程指南里的原页面是英文的,下图翻译过后有些小问题,就是原文里的函数链接变成了小方框,但是不要紧,下面我会一一说明)。

第一个条件就是启动WiFi或者是蓝牙。

第二个条件是我们手动开启一个函数。

需要先包含下头文件。

#include "bootloader_random.h"

然后手动开启随机数发生器的熵源。

void bootloader_random_enable(void)

第三个是ESP-IDF的二级引导程序运行,因为在ESP-IDF的二级引导程序运行时会自动调用第二个条件的函数。

那么我们应该做些什么来保证我们拿到的随机数是真随机数呢?

答案是我们什么都不用做。

因为ESP-IDF会自动执行二级引导程序。

所以我们直接获取随机数即可。

另外还有一个函数可以获取到随机数,同样是在这个bootloader_random.h头文件里,但是不推荐使用,只适合在引导加载程序中调用。

void bootloader_fill_random(void *buffer, size_t length)

下面来个小例子简单获取一下随机数。

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_random.h"
#include "bootloader_random.h"

void app_main(void) {
    uint32_t num;
    bootloader_random_enable();
    while (1) {
        num = esp_random();
        printf("random is %ld\t",num);
        bootloader_fill_random(&num,sizeof(num));
        printf("%ld\r\n",num);
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

可以正常获取到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1984955.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

到底哪款蓝牙耳机才是性价比之王?精选四款平价高品质耳机品牌!

在当前的音频设备市场中&#xff0c;蓝牙耳机已成为众多现代人挑选的热门配件。选蓝牙耳机不同人看重的点不一样&#xff0c;但倘若像我这样喜欢用来听音乐的&#xff0c;就千万别忽视耳机的音质。现在的产品越来越多&#xff0c;到底哪款蓝牙耳机才是性价比之王&#xff1f;一…

html+css 实现hover背景彩色按钮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽效果&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 文…

数据治理数据管理体系:数据标准、数据中台、数据安全、大数据平台与架构

数据驱动&#xff0c;资产为王&#xff0c;企业竞争的核心逐渐从传统的资源争夺转向了数据价值的挖掘与利用。数据&#xff0c;作为企业的新石油&#xff0c;正以前所未有的速度重塑着商业格局。为了在这场数据革命中占据先机&#xff0c;构建一套完善的数据治理体系显得尤为重…

用户上下文打通+本地缓存Guava

文章目录 &#x1f31e; Sun Frame&#xff1a;SpringBoot 的轻量级开发框架&#xff08;个人开源项目推荐&#xff09;&#x1f31f; 亮点功能&#x1f4e6; spring cloud模块概览常用工具 &#x1f517; 更多信息1.设计1.链路流程2.详细设计 2.网关过滤器获取唯一标识放到Hea…

LSTM长短时记忆网络【数学+图解】

文章目录 1、简介2、门控机制3、LSTM3.1、概念3.2、公式⭐3.3、特点 4、图解LSTM⭐4.1、RNN4.2、时间链条4.3、**记忆单元**&#x1f53a;4.4、LSTM 5、LSTM与GRU的对比6、应用7、训练技巧 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专…

欧拉系统网络配置

从母盘克隆出一个虚拟机openEuler-node2 如何设定网卡的名称为ehtx x为数字 在内核中禁止使用net.ifnames模块&#xff0c;这样可以让网卡显示为ethx [rootlocalhost ~]# gruuby --update-kernel ALL --args net.ifnames0修改完这个参数过后需要重启系统reboot&#xff0c;让…

4658. 质因数个数、197. 阶乘分解、模板题【线性筛求积性函数】(数论练习题)

目录 4658. 质因数个数 题目描述 运行代码 代码思路 197. 阶乘分解 题目描述 运行代码 代码思路 其他代码 代码思路 模板题【线性筛求积性函数】 题目描述 ​编辑 运行代码 代码思路 4658. 质因数个数 题目描述 4658. 质因数个数 - AcWing题库 运行代码 #in…

银河麒麟V10 审计工具 auditd 内存泄漏问题

问题描述 银河麒麟V10 SP1 审计工具 auditd 引发的内存占用过高&#xff0c; 内存占用171G&#xff0c; 内存一直不释放 解决方案 重启进程 auditd 是银河麒麟的审计工具&#xff0c; 分析是由于 yum 源的特性&#xff0c; 造成审计工具占用内存不释放&#xff0c; 重启 a…

dsc集群添加磁盘空间

在达梦数据库dsc集群保姆级部署文档_达梦数据库文档-CSDN博客这篇文档的基础上操作添加磁盘&#xff0c;进行一个扩容操作。 在生产环境中&#xff0c;数据存储集群&#xff08;DSC&#xff09;的磁盘空间不足是一个常见问题&#xff0c;这可能会导致服务中断或性能下降。为了…

代码随想录算法训练营day35 | 0-1背包理论基础、416. 分割等和子集

碎碎念&#xff1a;加油&#xff01;&#xff01; 参考&#xff1a;代码随想录 0-1背包理论基础 几类背包的区别&#xff1a; 0-1背包的每种物品只有一个 完全背包的每种物品有无限个 多重背包的每种物品的个数各不相同 01背包&#xff1a; 有n件物品和一个最多能背重量为w …

如何开发属于你的智能人才招聘系统:源码解析

今天&#xff0c;小编将从源码解析的角度&#xff0c;带你深入了解如何开发属于你的智能人才招聘系统。 一、为什么选择开发自己的智能招聘系统&#xff1f; 市面上已有许多现成的招聘系统&#xff0c;但这些系统往往无法完全满足企业个性化的需求。通过开发自有系统&#xf…

中小型水库雨水情及大坝安全监测系统完整方案

一、背景 随着气候变化和极端天气事件的频发&#xff0c;中小型水库的安全运行显得愈发重要。为确保水库大坝的稳定性和防洪功能的发挥&#xff0c;建设一套完善的雨水情及大坝安全监测系统显得尤为重要。本文将从系统背景、系统介绍、应用实例和未来展望等方面&#xff0c;对…

【HTML入门】第二十三课 - 【实战】做一个简单的图书详情页

这一节&#xff0c;我们继续用纯HTML来做一个实战小案例。 我找了一个图书详情的页面&#xff0c;就像这样&#xff1a; 这一小节&#xff0c;我们用纯HTML标签&#xff0c;来实现一下这个图书详情的内容。 目录 1 布局分析 2 用到的标签 3 实战代码 1 布局分析 我们看这张…

SQL各种注入详解加案例--持续更新

sql注入 联合查询注入案例手工注入判断是否有SQL注入漏洞 sqlmap工具注入 报错注入常用的函数updatexml()函数案例 floor()涉及的函数实现手工注入sqlmap工具注入 盲注布尔盲注案例手工注入脚本sqlmap自动化工具 时间盲注 post注入GET传参和POST传参案例手工注入sqlmap工具 二次…

Venv复制可以减少Pip install

接前面的一篇博客《PyCharm找不到Python咋办》中遇到的步骤&#xff1a; 有上图的提示&#xff0c;说明需要将原来的venv进行清空。&#xff08;还可以用重命名的方式&#xff0c;这样venv当中的库可以保留&#xff0c;如果Python的版本和原来一样的话&#xff0c;直接覆盖回来…

10个日常开发必备的 JavaScript 代码片段

在 Web 开发领域&#xff0c;开发效率是关键。为什么每次开始新项目时都要重新发明轮子&#xff1f;今天&#xff0c;本文汇总整理了一些方便日常开发使用的 JavaScript 代码片段&#xff0c;超越了 Lodash 和 day.js 等常见代码片段&#xff0c;提升你的开发效率&#xff0c;减…

x264 中像素扩边算法源码分析

介绍 在视频编码中,特别是在使用x264这样的H.264/MPEG-4 AVC编码器时,像素扩边(或称为边缘扩展)是一项重要的预处理步骤。像素扩边的目的是在帧的边缘添加额外的像素,这样在编码过程中可以应用滤波器,如去块滤波器(deblocking filter)和水平/垂直滤波器,而不会受到帧…

Mysql开启SSL

等二测出未开启SSL,如下 have_openssl、have_ssl都是DISABLED也不知道当时为啥没开&#xff0c;看最近的都是开启的,整改必去得开了&#xff0c;开启步骤 1.生成秘钥 进入mysql的bin目录下&#xff0c;运行 ./mysql_ssl_rsa_setup运行后会生成证书 默认证书会在mysql的data…

PTrade常见问题系列20

量化周末测试不打印日志&#xff0c;需要如何测试&#xff1f; 需要将量化服务器后台时间&#xff0c;和ptrade终端所在的电脑时间改到下周一或周五&#xff0c;具体测试方案如下&#xff1a; 先停止nginx&#xff0c;并且备份nfs以防恢复异常。 1.重置生产账号A的密码(若测试…

sed 简易使用指南

sed 简易使用指南 1 sed 介绍2 查找3 替换4 反向引用5 删除6 cai&#xff08;菜&#xff09; 导言&#xff1a; 笔者之前花了较多时间学习并整理了sed命令相关的内容&#xff0c;以及一些进阶内容。但是&#xff0c;到后来使用也就只记得那么几个简单的选项&#xff0c;再高级的…