本帖最后由 zhanzr21 于 2017-1-14 21:50 编辑
STM32F769上面有个随机数生成器, 主要是用于加解密的应用. 刚刚对其性能测试了一下,以下是实验结果.
这是数据手册中的基本参数:
- The RNG processor is a random number generator, based on a continuous analog noise,
- that provides a random 32-bit value to the host when read.
- The RNG passed the FIPS PUB 140-2 (2001 October 10) tests with a success ratio of 99%.
- 40 periods of the RNG_CLK clock signal between two consecutive random numbers
可以看出这个随机数生成器使用模拟噪音做种子, 符合的规格很高, 基本能过FIPS PUB 140-2的规范. 可以说用在安全方面是很可靠的, 但是速度性能稍差一点, 要40个RNG时钟周期, RNG时钟最高是48MHz. 所以如果只是需要一般噪音性质的随机数,应该选择使用C Lib的软件实现.
CPU时钟216M, RNG使用48M. 生成1000000个随机数:
主要测试代码:
- srand(0);
- printf("CLib Rand Function Start\n");
- tmpTick = HAL_GetTick();
- for(i=0; i<RANDOM_TEST_NUM; ++i)
- {
- ResRand = rand();
- // printf("%u\t", ResRand);
- }
- deltalTick = HAL_GetTick()-tmpTick;
- printf("\nCLib Rand Function generated %u with %u ms\n", RANDOM_TEST_NUM, deltalTick);
-
- printf("Hardware Rand Function Start\n");
- tmpTick = HAL_GetTick();
- for(i=0; i<RANDOM_TEST_NUM; ++i)
- {
- ResRand = HAL_RNG_GetRandomNumber(&RngHandle);
- // printf("%u\t", ResRand);
- }
- deltalTick = HAL_GetTick()-tmpTick;
- printf("\nHardware Rand Function generated %u with %u ms\n", RANDOM_TEST_NUM, deltalTick);
需要指出C Lib的rand实现有两个版本, 通过宏来控制使用哪个
这是默认的32bit版本rand()结果:
- Start @216 MHz
- CLib Rand Function Start
- CLib Rand Function generated 1000000 with 83 ms
- Hardware Rand Function Start
- Hardware Rand Function generated 1000000 with 875 ms
这是16bit的rand()的结果:
- CLib Rand Function Start
- CLib Rand Function generated 1000000 with 84 ms
- Hardware Rand Function Start
- Hardware Rand Function generated 1000000 with 875 ms
可能是优化的原因, 这个CPU上16bit与32bit的实现性能类似, 实际使用中当然应该倾向于32bit版本.
可以看出来,硬件生成器需要的时间是软件rand函数实现的10倍以上, 这应该是软件实现使用了很多优化, 而且CPU的时钟比RNG模块快的缘故.
随机数的标准符合测试需要很大量的数据来测试, 这个我暂时无能为力, 但是相信ST官方的描述是可信的. 关于随机数生成器的性能分析至此为止, 下次准备研究一下硬件加密(CRYPT与HASH模块)的性能, 届时再来发贴.
|