Board logo

标题: 如何在CW环境下产生随机数 [打印本页]

作者: nishui_2000    时间: 2006-8-28 21:00     标题: 如何在CW环境下产生随机数

请问大侠一个问题,这个问题困扰我一周多了:


我目前用S08单片机,在CW环境下,我想每次单片机一上电都产生不同的随机数,但不知道怎么实现好。


如果采用rand();函数,它产生的随机数实际并不是真正意义随即的,也就是我在单片机上电的时候,调用rand();,我监视这个数据,发现每次单片机一上电,第一个数都是相同的。而我需要的就是第一个数要求随机,所以不能通过简单的调用rand()去实现这个功能。


网上有介绍另一个方法,就是用time()函数获得系统时间,然后把它作为随机数种子,然后调用srand(time());这样就可以使单片机每次上电都产生不同的随机数,但是在CW环境下,我#include <time.h>,然后调用time();函数,发现CW环境不认识这个函数。


请问大侠如何解决这个问题 呢?还一个方法就是读RAM中的数据,一上电的时候RAM数据应该都是随即的,但是CW环境下,每次start08.c里面都在系统上电的时候把RAM中的单元都清零了,还有啥办法解决我的问题呢?多谢!


作者: strongchen    时间: 2006-8-29 09:25

或许可以先读一个随机数,再执行start08.c。
作者: nishui_2000    时间: 2006-8-29 16:06

不行啊,关键看怎么先读这个随机数,如果采用读RAM的办法产生随机数,那在Start08.c里先读RAM中的数据,我试验过了,结果看起来就跟单片机老是不停的复位一样,难道读取地址错误?但是我看了手册应该没错的。我读的是0x125的内容,我看手册里在0x100往后的256个字节都是RAM空间,我尝试了几个地址都是不停的复位(出现的现象感觉就是不停的在复位)。
除此之外还有什么好办法呢?
作者: strongchen    时间: 2006-8-29 16:48

应该不是读RAM的问题。关键是读了RAM之后,如何保存这个数,再怎么去执行Start08.c?
作者: nishui_2000    时间: 2006-8-31 16:32

我就是不知道怎么去解决啊,哪个大侠用过这方面提示提示或者给个例子参考一下啊。感觉Codewarrior的库很不完善,里面的C函数没Keil的丰富。
哪位高手帮个忙啊,谢了!
作者: strongchen    时间: 2006-8-31 16:35

你现在是怎么做的呢?
作者: nishui_2000    时间: 2006-9-1 10:33

我现在有个新的思路,就是在程序里延时一定时间然后读取程序指针(SP),这样应该就是个随机数把(仅取它的低8位字节),但是有个问题,我想读这个指针,怎么读呢?直接读SP行么?
作者: nishui_2000    时间: 2006-9-1 10:42

我想读程序指针(PC)里面的内容,怎么在C语言底下读到这个寄存器内容呢?谢谢
作者: strongchen    时间: 2006-9-1 10:50

程序里延时一定时间再读取程序指针PC?芯片复位后PC就是固定的,再执行固定的延时程序后PC肯定还是一个确定的值,怎么会是随机的呢?
作者: nishui_2000    时间: 2006-9-1 15:46

斑竹,我想试验一下我的想法对不对,我现在就是不知道怎么读取PC的值,好像要嵌入汇编,我知道嵌入汇编用
asm {
}
来实现,但是我在里面加入了汇编好像编译不过去啊,说好像缺少了行号 “:”,另外,我用什么指令可以读取这个PC的值呢?
一共两个问题,能不能帮我解答一下,1)加入汇编为啥编译不过去。2)用什么指令去读取PC的值 。谢谢!(这个方法行不行我都会把试验的结果在反馈上来)
作者: strongchen    时间: 2006-9-1 17:03

可以用以下指令:

asm {
BSR Get_PC_value ;Instruction 1
BRA Done ;Instruction 2
Get_PC_value:
LDHX 1,SP
RTS
Done: ;此时HX中的值即上面“Instruction 2”的PC值,也就是“Instruction 1”的PC值+2
}


作者: nishui_2000    时间: 2006-9-1 20:36

谢谢版主,但是还有一个问题,我在C语言里怎么引用HX寄存器中的值呢?
我现在用的是9S08单片机。在汇编中定义一个变量 XDEF ASMData
8位的CW环境不认它,而且应该怎么在C语言中去引用HX中的值呢
作者: nishui_2000    时间: 2006-9-4 08:10

麻烦版主给解答一下,谢谢
作者: seuafu2005    时间: 2006-9-4 10:19

可以把HX寄存器的值倒到变量中,在汇编里面定义变量,在C语言中可以用extern的方式应用。关于C和汇编变量相互引用可以看版头中的常见问题列表
作者: strongchen    时间: 2006-9-4 10:25

可以定义两个字节的变量:

char Value_word_1,Value_word_2;

然后程序可以改为:

asm {
BSR Get_PC_value
BRA Done
Get_PC_value:
LDA 1,SP
STA Value_word_1
LDA 2,SP
STA Value_word_2
RTS
Done:
}

作者: nishui_2000    时间: 2006-9-4 22:04

版主,很遗憾啊,这个方法不行,我调用上面的汇编程序,一执行程序好象就跑飞了,好像哪里有问题的。我试验了,把上面的汇编放在Main里面或者单独放在一个函数里面都不行的。程序都跑飞了,把汇编屏蔽掉,则没事,不知哪里有问题那?
作者: strongchen    时间: 2006-9-5 14:01

这个程序本身是不会跑飞的。是不是watchdog的问题,或堆栈溢出?最好将Value_word_1和Value_word_2定义为全局变量试试。
作者: strongchen    时间: 2006-9-5 14:03

另外要注意,这段程序不是子程序或函数,不要去调用它,而是直接插入需要执行的地方即可。
作者: Carter    时间: 2007-1-26 15:09

Hi nishui_2000,

请问您最后有试出来吗?
有什么方法能快速的产生随机数?
谢谢!





欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0