Перейти к содержанию
    

Перевод строки в float и обратно в пространстве ядра

Доброго времени суток!

 

Подскажите, пожалуйста, функции перевода. Нашел только для преобразования строка->float, нужна еще и в обратную сторону.

 

Нужно для драйвера, который принимает параметры в текстовом виде(через файлы в /sys), преобразует их в бинарный вид и располагает в определенной области памяти, откуда их забирает DSP. Часть параметров действительные числа, как и результат вычислений.

 

Процессор OMAP-L138(ARM + DSP)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость nill
(смотрите на функции которые имеют в своем названии print и scan)

Если заглянуть в исходники vsscanf, то можно обнаружить, что спецификатор 'f' не обрабатывается. Впрочем, об этом написано в Documentation/printk-formats.txt

For obvious reasons, floating

point formats (%e, %f, %g, %a) are also not recognized. Use of any

unsupported specifier or length qualifier results in a WARN and early

return from vsnprintf.

 

stdlib.h:

strtof, strtod, strtold

Здесь речь о пространстве ядра, в котором нет stdlib.h

 

Viwon, а Вам действительно нужно обрабатывать действительные числа в драйвере? Если их нужно просто передать DSP, то почему бы просто не скопировать весь символьный буфер в его память и разбирать его уже на DSP? Или на нём тоже ядро работает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если заглянуть в исходники vsscanf, то можно обнаружить, что спецификатор 'f' не обрабатывается. Впрочем, об этом написано в Documentation/printk-formats.txt

Да, тоже нашел.

P.S. и вспомнил, что у меня модуль данные предоставлял, из АЦП в пользовательское приложение, в сыром виде. А так можно как nill сказал, модуль ядра ничего не преобразует, а просто выкладывает байты в нужное место. Или можно сделать все преобразования в пользовательском приложении и передавать в модуль набор байт ( типа union {float; char[4];})

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здесь речь о пространстве ядра, в котором нет stdlib.h

А что это за ядро, где нет stdlib? Я так понимаю - ТСу нужна передача данных между ARM и DSP, с обработкой текстовых данных на стороне ARM. А там всё есть.

Viwon или Вы передаёте между DSP и Pruss-ядрами?

Но лучше использовать не семейство printf (для ASCII->BIN), а я например на ARM-ядре L-137 использовал функцию _printfi. Она имеет более удобный интерфейс. Только нужно в своих исходниках явно объявить её прототип (так как его нету в хидерах CCS). Вот так у меня объявлено (CCS_3.3):

#if !defined(NOFLOAT) && !defined(MINIMAL)
extern "C" int _printfi(char **_format, va_list _ap, void *_op,
  int (*_outc)(char, void *), int (*_outs)(char *, void *, int));
#elif defined(NOFLOAT)
extern "C" int _printfi_nofloat(char **_format, va_list _ap, void *_op,
  int (*_outc)(char, void *), int (*_outs)(char *, void *, int));
#elif defined(MINIMAL)
extern "C" int _printfi_minimal(char **_format, va_list _ap, void *_op,
  int (*_outc)(char, void *), int (*_outs)(char *, void *, int));
#endif

Она позволяет передать внутрь указатели на свои функции-кэллбэки-обработчики формируемого потока байт (_outc, _outs) и делать с ним что угодно, например - передавать этот поток байт через какой-то механизм межъядерного обмена к DSP-ядру.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

nill

Да, нужно просто передать, и преобразования можно осуществить на стороне DSP, как вариант так и сделаю. Но мне кажется, что преобразование данных в удобный для человека/железа вид, проверка допустимости входных параметров, и другая мелочь — это работа для драйвера, а DSP пусть занимается основной математикой.

 

Lagman

Что касается передачи набора байт, то хочется придерживаться правила, что все параметры в /sys должны быть в текстовом виде. Это очень удобно, можно управлять устройством стандартными командами типа echo, cat.

 

jcxz

Про PRUSS посмотрю, пока даже не знаю что это. Общение ARM<->DSP у меня происходит через общую память, при обновлении данных вызывается прерывание и адресат их забирает.

С ядром маленькое недоразумение, я имел ввиду ядро ОС Linux, не ARM-ядро. А ядро Linux не использует стандартные библиотеки, а в нем отключена поддержка float.

Изменено пользователем Viwon

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Про PRUSS посмотрю, пока даже не знаю что это. Общение ARM<->DSP

Ну раз не знаете, значит это не про Вас ;)

 

С ядром маленькое недоразумение, я имел ввиду ядро ОС Linux, не ARM-ядро. А ядро Linux не использует стандартные библиотеки, а в нем отключена поддержка float.

А при чём тут использует или не использует ядро линуха какие-то библиотеки? Какое Вам до этого дела? Вы же своё ПО компилите. И какие нужно библиотеки можете в него включить по своему усмотрению.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость nill
А что это за ядро, где нет stdlib?

У нас тут вышло небольшое недопонимание. В ядре, разумеется, есть своя реализация стандартной библиотеки, но в ней нет файла stdlib.h и нет функции strtof, о которых говорилось в пятом сообщении.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

там написано

In other words: it's still very much a special case, and if the question

was "can I just use FP in the kernel" then the answer is still a

resounding NO, since other architectures may not support it AT ALL.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Доброго времени суток!

 

Подскажите, пожалуйста, функции перевода. Нашел только для преобразования строка->float, нужна еще и в обратную сторону.

 

Нужно для драйвера, который принимает параметры в текстовом виде(через файлы в /sys), преобразует их в бинарный вид и располагает в определенной области памяти, откуда их забирает DSP. Часть параметров действительные числа, как и результат вычислений.

 

Процессор OMAP-L138(ARM + DSP)

 

 

Насколько мне известно в ядре float не используется и навряд ли вы что-то найдете. Простейшее решение -- писать в драйвер сразу в нужном формате. Для этого драйвер надо открыть в бинарной моде. В пространстве пользователя преобразовываете во float и пишете в драйвер.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...