Переопределить некоторые функции stdlibc gcc-arm-none-eabi - PullRequest
1 голос
/ 06 апреля 2019

Чипы STM32 (и многие другие) имеют аппаратный генератор случайных чисел (RNG), он быстрее и надежнее, чем программный RNG, предоставляемый libc.Компилятор ничего не знает об оборудовании.

Есть ли способ переопределить реализацию rand()?

Существуют другие аппаратные модули, например часы реального времени (RTC), которые могут предоставлять данные для time().

1 Ответ

5 голосов
/ 07 апреля 2019

Вы просто переопределяете их, определяя функции с одинаковой сигнатурой.Если они определены 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() применяется аналогично, и есть пример на Проблема с функцией time () во встроенном приложении с C

...