Долго плавать преобразование в модуле ядра Linux

Это мой первый вопрос здесь, и я надеюсь, что я получу полезные ответы или подсказки здесь.

Как указано в заголовке: мне нужно преобразовать из long в float в модуле ядра, например: с 78123456 до 78.123456, и детали следующие:

  1. У меня есть две длинные переменные (выход функции simple_strtol), и мне нужно преобразовать их в float (это обязательная задача в проекте).
  2. Показатель степени зафиксирован как 6 (6 чисел после плавающей запятой).
  3. (atof) не работает в пространстве ядра.
  4. Я пытался сделать кастинг... это не работает.
  5. Я попытался увеличить его до 0,000001, но операции с плавающей запятой недоступны в работе ядра.
  6. Конечно, я работаю на языке программирования Си.

Пожалуйста, если есть какой-нибудь способ сделать это, дайте мне знать как можно скорее:

  • если есть функция, которую я не знаю (не знаю, есть ли она), что это?
  • если есть функция одна библиотека, пожалуйста, скажите мне, как я могу загрузить эту библиотеку и как ее включить.
  • Если есть какой-либо другой метод, также скажите мне.

Любая подсказка действительно ценится.

Большое спасибо.

2 ответа

Это не похоже, что это должен быть модуль ядра вообще. Описанные лакомые кусочки выглядят так, будто они являются частью хорошей прикладной программы, которая форматирует и отправляет UDP-пакеты.

Если это невозможно, возможно, вместо этого можно использовать подход, подобный FUSE?

Я предполагаю, что вы просто хотите отобразить эту переменную с десятичной точкой (возможно, переменная измеряет микросекунды, и вы хотите отобразить в секундах), а не манипулировать переменной с плавающей запятой (поскольку вы уже указали, что операции с плавающей запятой не ' т доступно в пространстве ядра).

В этом случае не рассматривайте эту проблему как преобразование из длинного целого числа в число с плавающей запятой - вместо этого рассматривайте ее как проблему манипулирования строками, особенно если ваш ввод strtol это строка

В псевдокоде, если ваш ввод и вывод являются отдельными строками:

void insertDecimalPoint(char const * strSrc, char * strDest, int maxlength)
{
    1. find the length of strSrc
    2. if length <= 6, then write a prefix of zeros like '0.000' to strDest
       and then copy the source string to the destination
    3. else, copy the first (length - 6) digits, then add a decimal point '.',
       then copy the rest of the source to the destination.
}

В качестве альтернативы, если у вас есть входные данные в виде длинного целого valлиния как

whole = val / 1e6;
fraction = val - whole * 1e6;
printf("%d.%06d", whole, fraction);

будет делать правильные вещи.

Другие вопросы по тегам