【问题标题】:Redefine some functions of gcc-arm-none-eabi's stdlibc重新定义gcc-arm-none-eabi的stdlibc的一些功能
【发布时间】:2019-04-06 13:08:26
【问题描述】:

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

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

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

【问题讨论】:

  • 只要实现您自己的rand() 版本,如果您从.o 链接它,它应该覆盖stdlib 中的内容。如果您从 .a 链接它,如果 stdlib 版本的作者将其标记为 WEAK(他们应该有),它仍然应该采用该版本。
  • 您不妨阅读链接器的 --wrap 选项,当您需要两种变体都可用时(用于比较等),该选项会派上用场

标签: gcc arm embedded stm32 libc


【解决方案1】:

您只需通过定义具有相同签名的函数来覆盖它们。如果它们在标准库中被定义为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() 类似,Problem with time() function in embedded application with C 有一个例子

【讨论】:

  • 完美答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
  • 2021-12-03
  • 2016-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多