реклама на сайте
подробности

 
 
> Перевод строки в float и обратно в пространстве ядра
Viwon
сообщение Dec 1 2016, 13:57
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 18-03-14
Пользователь №: 80 976



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

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

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

Процессор OMAP-L138(ARM + DSP)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 13)
Lagman
сообщение Dec 1 2016, 20:58
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



https://www.kernel.org/doc/htmldocs/kernel-api/

https://www.kernel.org/doc/htmldocs/kernel-...html#idp5420192
Go to the top of the page
 
+Quote Post
Viwon
сообщение Dec 2 2016, 10:59
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 18-03-14
Пользователь №: 80 976



Цитата(Lagman @ Dec 1 2016, 23:58) *

Там функции для работы с целыми числами(ими я и пользуюсь), но нужны функции и для действительных.
Go to the top of the page
 
+Quote Post
Lagman
сообщение Dec 2 2016, 17:12
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



(смотрите на функции которые имеют в своем названии print и scan)
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Dec 2 2016, 23:52
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



stdlib.h:
strtof, strtod, strtold

Go to the top of the page
 
+Quote Post
nill
сообщение Dec 3 2016, 07:20
Сообщение #6


Частый гость
**

Группа: Validating
Сообщений: 124
Регистрация: 10-08-05
Пользователь №: 7 502



Цитата(Lagman @ Dec 3 2016, 00:12) *
(смотрите на функции которые имеют в своем названии 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.


Цитата(Genadi Zawidowski @ Dec 3 2016, 06:52) *
stdlib.h:
strtof, strtod, strtold

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

Viwon, а Вам действительно нужно обрабатывать действительные числа в драйвере? Если их нужно просто передать DSP, то почему бы просто не скопировать весь символьный буфер в его память и разбирать его уже на DSP? Или на нём тоже ядро работает?
Go to the top of the page
 
+Quote Post
Lagman
сообщение Dec 3 2016, 10:46
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



Цитата(nill @ Dec 3 2016, 10:20) *
Если заглянуть в исходники vsscanf, то можно обнаружить, что спецификатор 'f' не обрабатывается. Впрочем, об этом написано в Documentation/printk-formats.txt

Да, тоже нашел.
P.S. и вспомнил, что у меня модуль данные предоставлял, из АЦП в пользовательское приложение, в сыром виде. А так можно как nill сказал, модуль ядра ничего не преобразует, а просто выкладывает байты в нужное место. Или можно сделать все преобразования в пользовательском приложении и передавать в модуль набор байт ( типа union {float; char[4];})
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 3 2016, 11:27
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(nill @ Dec 3 2016, 10:20) *
Здесь речь о пространстве ядра, в котором нет 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-ядру.
Go to the top of the page
 
+Quote Post
Viwon
сообщение Dec 3 2016, 14:49
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 18-03-14
Пользователь №: 80 976



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

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

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

Сообщение отредактировал Viwon - Dec 3 2016, 14:53
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 3 2016, 15:41
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Viwon @ Dec 3 2016, 17:49) *
Про PRUSS посмотрю, пока даже не знаю что это. Общение ARM<->DSP

Ну раз не знаете, значит это не про Вас wink.gif

Цитата(Viwon @ Dec 3 2016, 17:49) *
С ядром маленькое недоразумение, я имел ввиду ядро ОС Linux, не ARM-ядро. А ядро Linux не использует стандартные библиотеки, а в нем отключена поддержка float.

А при чём тут использует или не использует ядро линуха какие-то библиотеки? Какое Вам до этого дела? Вы же своё ПО компилите. И какие нужно библиотеки можете в него включить по своему усмотрению.
Go to the top of the page
 
+Quote Post
nill
сообщение Dec 3 2016, 19:15
Сообщение #11


Частый гость
**

Группа: Validating
Сообщений: 124
Регистрация: 10-08-05
Пользователь №: 7 502



Цитата(jcxz @ Dec 3 2016, 17:27) *
А что это за ядро, где нет stdlib?

У нас тут вышло небольшое недопонимание. В ядре, разумеется, есть своя реализация стандартной библиотеки, но в ней нет файла stdlib.h и нет функции strtof, о которых говорилось в пятом сообщении.
Go to the top of the page
 
+Quote Post
makc
сообщение Dec 4 2016, 05:11
Сообщение #12


Гуру
******

Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904



http://yarchive.net/comp/linux/kernel_fp.html + порт нужных функций из stdlib.


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
Lagman
сообщение Dec 4 2016, 10:08
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



там написано
Цитата
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.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Dec 16 2016, 02:56
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(Viwon @ Dec 1 2016, 17:57) *
Доброго времени суток!

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

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

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



Насколько мне известно в ядре float не используется и навряд ли вы что-то найдете. Простейшее решение -- писать в драйвер сразу в нужном формате. Для этого драйвер надо открыть в бинарной моде. В пространстве пользователя преобразовываете во float и пишете в драйвер.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 17th June 2025 - 07:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01468 секунд с 7
ELECTRONIX ©2004-2016