Долго плавать преобразование в модуле ядра Linux
Это мой первый вопрос здесь, и я надеюсь, что я получу полезные ответы или подсказки здесь.
Как указано в заголовке: мне нужно преобразовать из long в float в модуле ядра, например: с 78123456 до 78.123456, и детали следующие:
- У меня есть две длинные переменные (выход функции simple_strtol), и мне нужно преобразовать их в float (это обязательная задача в проекте).
- Показатель степени зафиксирован как 6 (6 чисел после плавающей запятой).
- (atof) не работает в пространстве ядра.
- Я пытался сделать кастинг... это не работает.
- Я попытался увеличить его до 0,000001, но операции с плавающей запятой недоступны в работе ядра.
- Конечно, я работаю на языке программирования Си.
Пожалуйста, если есть какой-нибудь способ сделать это, дайте мне знать как можно скорее:
- если есть функция, которую я не знаю (не знаю, есть ли она), что это?
- если есть функция одна библиотека, пожалуйста, скажите мне, как я могу загрузить эту библиотеку и как ее включить.
- Если есть какой-либо другой метод, также скажите мне.
Любая подсказка действительно ценится.
Большое спасибо.
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);
будет делать правильные вещи.