重新定义gcc-arm-none-eabi的stdlibc的部分功能
Redefine some functions of gcc-arm-none-eabi's stdlibc
STM32 芯片(以及许多其他芯片)具有硬件随机数生成器 (RNG),它比 libc 提供的软件 RNG 更快、更可靠。编译器对硬件一无所知。
有没有办法重新定义 rand()
的实现?
还有其他硬件模块,即实时时钟(RTC)可以为time()
提供数据。
您只需通过定义具有相同签名的函数来覆盖它们。如果它们在标准库中定义 WEAK
它们将被覆盖,否则它们将在第一个解析基础上被覆盖,只要您的实现在 before libc被搜索,它将覆盖。此外,.o / .obj 文件在 .a / .lib 文件之前专门用于符号解析,因此如果您的实现包含在项目源中,它将始终覆盖。
您应该小心确保实现的语义正确。例如 rand()
returns 有符号整数 0 到 RAND_MAX,这很可能与 RNG 硬件不同。由于 RAND_MAX 是一个宏,更改它需要更改标准 header,因此您的实施需要强制执行现有的 RAND_MAX.
使用STM32标准外设库的示例:
#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
对于 time()
类似的应用并且在 Problem with time() function in embedded application with C
有一个例子
STM32 芯片(以及许多其他芯片)具有硬件随机数生成器 (RNG),它比 libc 提供的软件 RNG 更快、更可靠。编译器对硬件一无所知。
有没有办法重新定义 rand()
的实现?
还有其他硬件模块,即实时时钟(RTC)可以为time()
提供数据。
您只需通过定义具有相同签名的函数来覆盖它们。如果它们在标准库中定义 WEAK
它们将被覆盖,否则它们将在第一个解析基础上被覆盖,只要您的实现在 before libc被搜索,它将覆盖。此外,.o / .obj 文件在 .a / .lib 文件之前专门用于符号解析,因此如果您的实现包含在项目源中,它将始终覆盖。
您应该小心确保实现的语义正确。例如 rand()
returns 有符号整数 0 到 RAND_MAX,这很可能与 RNG 硬件不同。由于 RAND_MAX 是一个宏,更改它需要更改标准 header,因此您的实施需要强制执行现有的 RAND_MAX.
使用STM32标准外设库的示例:
#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
对于 time()
类似的应用并且在 Problem with time() function in embedded application with C