долго плавать преобразование в модуле ядра Linux - PullRequest
4 голосов
/ 16 сентября 2011

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

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 16 сентября 2011

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

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

0 голосов
/ 16 сентября 2011

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

В этом случае не рассматривайте эту проблему как преобразование из длинного целого числа в число с плавающей запятой - вместо этого рассматривайте ее как проблему манипуляции со строками, особенно если ваш ввод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);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...