STM32产生随机数问题

[复制链接]
22335|21
 楼主| zzifeng 发表于 2011-10-21 14:49 | 显示全部楼层 |阅读模式
STM32产生随机数问题:
在STM32中用C语言产生一个随机数,该怎么写?下面的两种处理有什么问题呢?(注:想产生一个1228~2868之间的随机数)
处理一:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main()
{
    u32 temp;
   
    srand((unsigned int)(time(NULL)));
    temp = rand()%(2868 - 1228 + 1) + 1228;
}
编译的时候,出现Undefined symbol time (referred from main.o)

把上面的NULL替换程&t,也是不行
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main()
{
    u32 temp;
    time_t t;
    srand((unsigned int)(time(&t)));
    temp = rand()%(2868 - 1228 + 1) + 1228;
}
编译的时候,同样出现Undefined symbol time (referred from main.o)
香水城 发表于 2011-10-21 17:05 | 显示全部楼层
time是什么?
 楼主| zzifeng 发表于 2011-10-25 15:02 | 显示全部楼层
2# 香水城
你好~
time应该是系统自带的、类似于时钟的东西吧...?

srand((unsigned int)(time(NULL)))的写法是网上的说法(用于C语言)
就是不清楚STM32中能不能用?

或者有什么别的方法可用来生成随机数?
香水城 发表于 2011-10-25 16:07 | 显示全部楼层
2# 香水城  
你好~
time应该是系统自带的、类似于时钟的东西吧...?

srand((unsigned int)(time(NULL)))的写法是网上的说法(用于C语言)
就是不清楚STM32中能不能用?

或者有什么别的方法可用来生成随机数? ...
zzifeng 发表于 2011-10-25 15:02


STM32的应用环境是裸奔,没有系统,更没有什么系统自带的东西,任何东西都要自己写或显式地调用合适的函数包。
airwill 发表于 2011-10-25 16:41 | 显示全部楼层
有道理, 不知道LZ 哪里搬来的程序.
不过 STM32 倒是很好找这个 time, 可以开启一个定时器, 或者 Systick. 然后读他们的 count 寄存器.
 楼主| zzifeng 发表于 2011-10-26 09:11 | 显示全部楼层
4# 香水城
嗯,这个后来才知道的...
不过,不知道有没合适的函数包可以调用呢?
自己写的话,没什么头绪,麻烦指点下
 楼主| zzifeng 发表于 2011-10-26 09:11 | 显示全部楼层
6# zzifeng
定时器可能用在其他地方,可能在其他使用过程中会被清除或者进行其他操作...
而且,用这样的方法,产生的随机数应该有一定的局限吧?
airwill 发表于 2011-10-27 15:33 | 显示全部楼层
是的, 用定时器还不是真正的随机. 除非你调用的时候是随机的. 如果调用时间是定时器溢出周期的很多很多倍, 那也可以当随机了.
heuyck 发表于 2011-10-27 16:24 | 显示全部楼层
找一个悬空的ADC输入,读ad采样值,取其最低1字节,重复取4次组成一个双字,拿来当rand种子包你够随机。。
husb2000 发表于 2011-10-27 18:38 | 显示全部楼层
9楼的方法还真有点新意!
LDTEST 发表于 2011-10-27 20:07 | 显示全部楼层
……9楼 真有才!
 楼主| zzifeng 发表于 2011-10-27 20:29 | 显示全部楼层
9# heuyck
悬空的ADC输入?
悬空的时候,引脚的状态不能确定
引脚的状态应该会受到外围环境的影响吧?
而且,悬空的引脚状态应该也在一定的范围之内吧?这样产生的随机数也是有一定的限制了...
李富贵 发表于 2011-10-27 22:18 | 显示全部楼层
一般用定时器读数做随机种子。
关键问题还是你什么时候读取种子,比方说操作人员按键时刻读种子,由于人的操作和定时器运行完全不相关,所以此时产生的随机数就是真随机数。
airwill 发表于 2011-10-28 10:19 | 显示全部楼层
9楼 真忽悠人, 人家新人是认真的呢! 楼主别听他瞎摆.
 楼主| zzifeng 发表于 2011-11-1 18:04 | 显示全部楼层
本帖最后由 zzifeng 于 2011-11-1 18:07 编辑

13# 李富贵
 楼主| zzifeng 发表于 2011-11-1 18:25 | 显示全部楼层
问题是操作是根据上层来执行的
有可能出现“同一”时候读取时间种子的情况...

而且,用定时器读取会有前面说的问题
——定时器可能用在其他地方,在使用过程中有可能被清除

看来没有什么好的方法了...?
香水城 发表于 2011-11-1 20:13 | 显示全部楼层
STM32 F2和F4系列中有硬件实现的真随机数发生器,是用模拟的方法实现的,直接读取即可。
 楼主| zzifeng 发表于 2011-11-2 18:55 | 显示全部楼层
17# 香水城

请问:有这方面的资料可以参考下吗?
谢谢了~
香水城 发表于 2011-11-2 21:07 | 显示全部楼层
17# 香水城

请问:有这方面的资料可以参考下吗?
谢谢了~
zzifeng 发表于 2011-11-2 18:55


STM32F2的资料网页:http://www.st.com/internet/mcu/subclass/1520.jsp

STM32F4的资料网页:http://www.st.com/internet/mcu/subclass/1521.jsp

所有STM32的资料网页:http://www.st.com/stm32
 楼主| zzifeng 发表于 2011-11-3 08:39 | 显示全部楼层
20# 香水城
好的,非常感谢~

STM32F103*看来是没带这个功能了...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

22

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部