重新定义 gcc-arm-none-eabi 的 stdlibc 的一些功能



STM32芯片(和许多其他芯片)具有硬件随机数生成器(RNG),它比libc提供的软件RNG更快,更可靠。编译器对硬件一无所知。

有没有办法重新定义rand()的实现?

还有其他硬件模块,即实时时钟(RTC),可以为time()提供数据。

您只需通过定义具有相同签名的函数来覆盖它们。 如果它们是在标准库中WEAK定义的,则它们将被覆盖,否则,只要在搜索 libc之前将实现传递给链接器,它就会被覆盖。 此外,.o/.obj文件专门用于.a/.lib文件之前的符号解析,因此如果您的实现包含在项目源代码中,它将始终覆盖。

您应该小心使实现的语义正确。 例如,rand()返回一个有符号整数 0 到 RAND_MAX,这与 RNG 硬件非常不同。 由于RAND_MAX是一个宏,因此更改它需要更改标准标头,因此您的实现需要强制实施现有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()类似的应用程序,并且在使用 C 的嵌入式应用程序中的 time() 函数问题中有一个示例

相关内容

  • 没有找到相关文章

最新更新