Viwon 0 1 декабря, 2016 Опубликовано 1 декабря, 2016 · Жалоба Доброго времени суток! Подскажите, пожалуйста, функции перевода. Нашел только для преобразования строка->float, нужна еще и в обратную сторону. Нужно для драйвера, который принимает параметры в текстовом виде(через файлы в /sys), преобразует их в бинарный вид и располагает в определенной области памяти, откуда их забирает DSP. Часть параметров действительные числа, как и результат вычислений. Процессор OMAP-L138(ARM + DSP) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lagman 1 1 декабря, 2016 Опубликовано 1 декабря, 2016 · Жалоба https://www.kernel.org/doc/htmldocs/kernel-api/ https://www.kernel.org/doc/htmldocs/kernel-...html#idp5420192 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Viwon 0 2 декабря, 2016 Опубликовано 2 декабря, 2016 · Жалоба https://www.kernel.org/doc/htmldocs/kernel-api/ https://www.kernel.org/doc/htmldocs/kernel-...html#idp5420192 Там функции для работы с целыми числами(ими я и пользуюсь), но нужны функции и для действительных. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lagman 1 2 декабря, 2016 Опубликовано 2 декабря, 2016 · Жалоба (смотрите на функции которые имеют в своем названии print и scan) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 2 декабря, 2016 Опубликовано 2 декабря, 2016 · Жалоба stdlib.h: strtof, strtod, strtold Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость nill 3 декабря, 2016 Опубликовано 3 декабря, 2016 · Жалоба (смотрите на функции которые имеют в своем названии 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? Или на нём тоже ядро работает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lagman 1 3 декабря, 2016 Опубликовано 3 декабря, 2016 · Жалоба Если заглянуть в исходники vsscanf, то можно обнаружить, что спецификатор 'f' не обрабатывается. Впрочем, об этом написано в Documentation/printk-formats.txt Да, тоже нашел. P.S. и вспомнил, что у меня модуль данные предоставлял, из АЦП в пользовательское приложение, в сыром виде. А так можно как nill сказал, модуль ядра ничего не преобразует, а просто выкладывает байты в нужное место. Или можно сделать все преобразования в пользовательском приложении и передавать в модуль набор байт ( типа union {float; char[4];}) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 191 3 декабря, 2016 Опубликовано 3 декабря, 2016 · Жалоба Здесь речь о пространстве ядра, в котором нет 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-ядру. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Viwon 0 3 декабря, 2016 Опубликовано 3 декабря, 2016 (изменено) · Жалоба nill Да, нужно просто передать, и преобразования можно осуществить на стороне DSP, как вариант так и сделаю. Но мне кажется, что преобразование данных в удобный для человека/железа вид, проверка допустимости входных параметров, и другая мелочь — это работа для драйвера, а DSP пусть занимается основной математикой. Lagman Что касается передачи набора байт, то хочется придерживаться правила, что все параметры в /sys должны быть в текстовом виде. Это очень удобно, можно управлять устройством стандартными командами типа echo, cat. jcxz Про PRUSS посмотрю, пока даже не знаю что это. Общение ARM<->DSP у меня происходит через общую память, при обновлении данных вызывается прерывание и адресат их забирает. С ядром маленькое недоразумение, я имел ввиду ядро ОС Linux, не ARM-ядро. А ядро Linux не использует стандартные библиотеки, а в нем отключена поддержка float. Изменено 3 декабря, 2016 пользователем Viwon Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 191 3 декабря, 2016 Опубликовано 3 декабря, 2016 · Жалоба Про PRUSS посмотрю, пока даже не знаю что это. Общение ARM<->DSP Ну раз не знаете, значит это не про Вас ;) С ядром маленькое недоразумение, я имел ввиду ядро ОС Linux, не ARM-ядро. А ядро Linux не использует стандартные библиотеки, а в нем отключена поддержка float. А при чём тут использует или не использует ядро линуха какие-то библиотеки? Какое Вам до этого дела? Вы же своё ПО компилите. И какие нужно библиотеки можете в него включить по своему усмотрению. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость nill 3 декабря, 2016 Опубликовано 3 декабря, 2016 · Жалоба А что это за ядро, где нет stdlib? У нас тут вышло небольшое недопонимание. В ядре, разумеется, есть своя реализация стандартной библиотеки, но в ней нет файла stdlib.h и нет функции strtof, о которых говорилось в пятом сообщении. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 197 4 декабря, 2016 Опубликовано 4 декабря, 2016 · Жалоба http://yarchive.net/comp/linux/kernel_fp.html + порт нужных функций из stdlib. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lagman 1 4 декабря, 2016 Опубликовано 4 декабря, 2016 · Жалоба там написано 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tarbal 4 16 декабря, 2016 Опубликовано 16 декабря, 2016 · Жалоба Доброго времени суток! Подскажите, пожалуйста, функции перевода. Нашел только для преобразования строка->float, нужна еще и в обратную сторону. Нужно для драйвера, который принимает параметры в текстовом виде(через файлы в /sys), преобразует их в бинарный вид и располагает в определенной области памяти, откуда их забирает DSP. Часть параметров действительные числа, как и результат вычислений. Процессор OMAP-L138(ARM + DSP) Насколько мне известно в ядре float не используется и навряд ли вы что-то найдете. Простейшее решение -- писать в драйвер сразу в нужном формате. Для этого драйвер надо открыть в бинарной моде. В пространстве пользователя преобразовываете во float и пишете в драйвер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться