kyb
kyb

Reputation: 8141

Redefine some functions of gcc-arm-none-eabi's stdlibc

STM32 chips (and many others) have hardware random number generator (RNG), it is faster and more reliable than software RNG provided by libc. Compiler knows nothing about hardware.

Is there a way to redefine implementation of rand()?

There are other hardware modules, i.e real time clock (RTC) which can provide data for time().

Upvotes: 1

Views: 912

Answers (1)

Clifford
Clifford

Reputation: 93476

You simply override them by defining functions with identical signature. If they are defined WEAK in the standard library they will be overridden, otherwise they are overridden on a first resolution basis so so long as your implementation is passed to the linker before libc is searched, it will override. Moreover .o / .obj files specifically are used in symbol resolution before .a / .lib files, so if your implementation is included in your project source, it will always override.

You should be careful to get the semantics of your implementation correct. For example rand() returns a signed integer 0 to RAND_MAX, which is likley not teh same as the RNG hardware. Since RAND_MAX is a macro, changing it would require changing the standard header, so your implementation needs to enforce the existing RAND_MAX.

Example using STM32 Standard Peripheral Library:

#include <stdlib.h>
#include <stm32xxx.h> // Your processor header here

#if defined __cplusplus
extern "C"
{
#endif

static int rng_running = 0 ;

int rand( void )
{
    if( rng_running == 0 )
    {
        RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG, ENABLE);
        RNG_Cmd(ENABLE);
        rng_running = 1 ;
    }
    while(RNG_GetFlagStatus(RNG_FLAG_DRDY)== RESET) { }

    // Assumes RAND_MAX is an "all ones" integer value (check)
    return (int)(RNG_GetRandomNumber() & (unsigned)RAND_MAX) ;
}

void srand( unsigned ) { }

#if defined __cplusplus
}
#endif

For time() similar applies and there is an example at Problem with time() function in embedded application with C

Upvotes: 6

Related Questions