Algorithm improvement for timer based random number generator

The timer based pseudo random number generator returns the
number of system clock ticks. If the random number function is
called subsequently in a time less than a system clock tick, it
leads to getting same number.

To prevent this the counter is introduced. Counter gets changed
each call, so it ensures the caller gets different numbers each time
the random number function gets called.

Change-Id: Ibe57e1e7a23909b185623af8dbb7e80647c7ee08
Signed-off-by: Dmitriy Korovkin <dmitriy.korovkin@windriver.com>
This commit is contained in:
Dmitriy Korovkin 2015-05-25 11:07:09 -04:00 committed by Anas Nashif
commit e2fa00be6e

View file

@ -40,9 +40,18 @@ was provided to allow testing of kernel stack canaries on a BSP that does not
#include <drivers/rand32.h>
#include <drivers/system_timer.h>
#include <nanokernel.h>
#if defined(__GNUC__)
/*
* Symbols used to ensure a rapid series of calls to random number generator
* return different values.
*/
static atomic_val_t _rand32_counter = 0;
#define _RAND32_INC 1000000013
/*******************************************************************************
*
* _Rand32Init - initialize the random number generator
@ -62,15 +71,15 @@ void _Rand32Init(void)
* _Rand32Get - get a 32 bit random number
*
* The non-random number generator returns values that are based off the
* target's clock counter, which means that successive calls will normally
* display ever-increasing values.
* target's clock counter, which means that successive calls will return
* different values.
*
* RETURNS: a 32-bit number
*/
uint32_t _Rand32Get(void)
{
return timer_read();
return timer_read() + atomic_add(&_rand32_counter, _RAND32_INC);
}
#endif /* __GNUC__ */