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

 
 
6 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> Странное предупреждение
jcxz
сообщение Jun 20 2018, 09:40
Сообщение #16


Гуру
******

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



Цитата(juvf @ Jun 20 2018, 10:19) *
безопаснее, и БЫСТРЕЕ..

Не верю! cool.gif
Go to the top of the page
 
+Quote Post
juvf
сообщение Jun 20 2018, 10:10
Сообщение #17


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

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(jcxz @ Jun 20 2018, 14:40) *
Не верю! cool.gif

Bера в церкви. Вы как гуру должны не верить, а знать, что for-loop будет работать не быстрее, чем любые практические реализации memcpy().
а про безопастность - так ТС стрельнул себе в ногу своим forech, причем даже где-то gcc не ругнулся. C memcpy не нужны манимуляции с j.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 20 2018, 10:24
Сообщение #18


Гуру
******

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



Цитата(juvf @ Jun 20 2018, 13:10) *
Bера в церкви. Вы как гуру должны не верить, а знать, что for-loop будет работать не быстрее, чем любые практические реализации memcpy()[/url].

Я и знаю, что это не так. И знаю почему. И я знаю как внутри работает memcpy(). Поэтому он будет быстрее только в определённых случаях.
А в общем случае быстрее будет for loop. Особенно если вспомнить, что компиляторы умеют оптимизировать.

Цитата(juvf @ Jun 20 2018, 13:10) *
а про безопастность - так ТС стрельнул себе в ногу своим forech, причем даже где-то gcc не ругнулся. C memcpy не нужны манимуляции с j.

Не знаю, что Вы имеете в виду под "безопасностью", но даже Вы в своём совете с memcpy() допустили пару неточностей. laughing.gif
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 20 2018, 10:31
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(juvf @ Jun 20 2018, 13:10) *
C memcpy не нужны манимуляции с j.

Увидеть бы весь код. Есть мнение, что j легким движением превратиться в (i * 2 + 0) и (i * 2 + 1).
Go to the top of the page
 
+Quote Post
juvf
сообщение Jun 20 2018, 10:37
Сообщение #20


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

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(jcxz @ Jun 20 2018, 15:24) *
но даже Вы в своём совете с memcpy() допустили пару неточностей. laughing.gif
какую?

Цитата
Поэтому он будет быстрее только в определённых случаях.
в каких? поделитесь?
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 20 2018, 12:52
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(juvf @ Jun 20 2018, 10:19) *
и БЫСТРЕЕ

Цитата(jcxz @ Jun 20 2018, 13:24) *
Поэтому он будет быстрее только в определённых случаях.

Интересно, куда все торопятся? Если судить по моему опыту в ымбеддед, ставить рекорды скорости приходится крайне редко smile3046.gif
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jun 20 2018, 17:59
Сообщение #22


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Цитата(scifi @ Jun 20 2018, 15:52) *
Интересно, куда все торопятся?

Если я знаю несколько способов решить одну и ту же задачу, то естественно выберу тот который работает быстрее и/или занимает меньше ресурсов. Иначе будет как с "640K ought to be enough for anybody".

Цитата(scifi @ Jun 20 2018, 15:52) *
Если судить по моему опыту в ымбеддед, ставить рекорды скорости приходится крайне редко smile3046.gif

Именно потому что опыт это и есть набор эффективных реализаций, которые не тормозят там где не надо.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 20 2018, 18:30
Сообщение #23


Гуру
******

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



Цитата(juvf @ Jun 20 2018, 13:37) *
какую?

Причём вообще в данном примере memcpy()? ...если ТС судя по всему пытается поменять байты местами при перемещении из источника в приёмник?
С чего Вы вообще взяли, что DataBuffer имеет размерность 16 бит, а data_out - 8 бит?
Причём там вообще memcpy()??? Научитесь читать исходники!

Цитата(scifi @ Jun 20 2018, 15:52) *
Интересно, куда все торопятся? Если судить по моему опыту в ымбеддед, ставить рекорды скорости приходится крайне редко smile3046.gif

И экономить электроэнергию - тоже редко? wacko.gif
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 20 2018, 18:42
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(jcxz @ Jun 20 2018, 21:30) *
С чего Вы вообще взяли, что DataBuffer имеет размерность 16 бит, а data_out - 8 бит?

Это очевидно из строчки
DataBuffer[i] = (data_out[j++]<<8) | data_out[j++];
Если data_out будет больше 8 бит, то операция | будет перемешивать биты из двух соседних значений.
(data_out[j++]<<8) | data_out[j++] имеет в этом случае не более 16 значащих бит.
Соответственно DataBuffer не менее 16 бит. Какой смысл делать больше?
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 20 2018, 18:49
Сообщение #25


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(juvf @ Jun 20 2018, 13:10) *
...ТС стрельнул себе в ногу своим forech, причем даже где-то gcc не ругнулся...

GCC не ругнётся нигде и никогда: у ТСа IAR wink.gif


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 20 2018, 19:31
Сообщение #26


Гуру
******

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



Цитата(adnega @ Jun 20 2018, 21:42) *
Это очевидно из строчки
DataBuffer[i] = (data_out[j++]<<8) | data_out[j++];

Уважаемый, из этой строчки очевидно только, что к некоему объекту DataBuffer применяются операции индексирования и присвоения значения, а к объекту data_out - операции индексирования и операции приведения к другому типу (возможно целочисленному).
Всё остальное - Ваши фантазии, не более. laughing.gif

Цитата(adnega @ Jun 20 2018, 21:42) *
Если data_out будет больше 8 бит, то операция | будет перемешивать биты из двух соседних значений.

И что? Может это и есть цель ТСа? laughing.gif

Цитата(adnega @ Jun 20 2018, 21:42) *
Соответственно DataBuffer не менее 16 бит. Какой смысл делать больше?

Я видимо ошибся форумом... Думал - тут форум программистов и электронщиков, а оказывается - гадалок и экстрасенсов. laughing.gif
Я, как можете заметить, не пытаюсь домысливать тайные намерения автора. И я понятия не имею - чего же он пытается изобразить.
Я просто основываюсь на том, что вижу в вопросе.
И всех возможных в мире задач я тоже не знаю - мало ли чего человек хочет? Может ему требуется читать из источника пары байт и записывать их по адресу назначения с расширением до 32-бит. Не задумывались?
Опять спросите "зачем"? Ну хотя бы например:
1. Многие МК имеют SPI-контроллеры, у которых передаваемое данное записывается в регистр, младшие 16 бит которого - собственно передаваемые биты, а старшие биты - различные биты управления (управление сигналами CS, управление межсловным интервалом и т.п.). Знаю несколько таких МК. Вот если нужно скажем передавать байты в SPI в том порядке, в котором они лежат в памяти, но передавать 16-битными словами (для уменьшения блока пересылки DMA) и при этом к словам добавить управляющую информацию, то может и потребоваться перевёртывание 16-битных слов с расширением их до 32 бит.
2. Или например - он готовит фрейм для передачи в видеопамять LCD-контроллера (опять-же по 16-битному SPI), который (контроллер) принимает пиксели с глубиной цвета 32 бита, а в памяти автора отрисовка идёт 16-битными пикселями. Соответственно - при передаче необходимо расширение каждого пикселя до 32 бит.
3. Или: у автора в устройстве на SPI висит пара слэйвов, соединённых в daisy-chain. Каждый из них имеет размер слова ==16 бит. И он хочет записывать в дальний в цепочке слэйв слова из data_out, а в ближний - нули. Ну скажем эти два слэйва - два 16-разрядных ЦАП, соединённых в daisy-chain. И его DMA должен по неким запросам выдавать по 32 бита на запрос (по слову в каждый ЦАП). Вот он и формирует буфер для DMA таким образом.
И это - всего три из тысяч возможных вариантов!
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 20 2018, 20:01
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(jcxz @ Jun 20 2018, 22:31) *
И что? Может это и есть цель ТСа? laughing.gif

Ага. Причем это объекты классов, а операторы [] и | перегружены.
Бритва Оккама. Нет, не слышал.
Если бы было нужно что-то из описанного вами, то код бы выглядел иначе.
Go to the top of the page
 
+Quote Post
juvf
сообщение Jun 21 2018, 04:24
Сообщение #28


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

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(Obam @ Jun 20 2018, 23:49) *
GCC не ругнётся нигде и никогда: у ТСа IAR wink.gif
2Obam, читаем ещё раз первый пост ТС до конца
Цитата
В GCC компайлере такого предупреждения нет.


Цитата
Причём вообще в данном примере memcpy()? ...если ТС судя по всему пытается поменять байты местами при перемещении из источника в приёмник?
С чего Вы вообще взяли, что DataBuffer имеет размерность 16 бит, а data_out - 8 бит?
Причём там вообще memcpy()??? Научитесь читать исходники!

adnega - ППКС,
2jcxz - из кода видно, что с вероятностью близкой к 100, данные из какого-то байтового тх/рх буфера перекидываются в нужный массив DataBuffer. Научитесь читать исходники!.
Но не факт что это так, поэтому я сразу написал
Цитата
если нет перевёртывания с эндианами и DataBuffer - это 16-ти разрядное, то

2jcxz - Научитесь читать посты участников.

Цитата
мало ли чего человек хочет? Может ему требуется читать из источника пары байт и записывать их по адресу назначения с расширением до 32-бит. Не задумывались?
Может быть! Согласен. Может data_out - это класс, а операторы << и | перегруженны. Может даже оператор "++" перегружен в "--". Может где то false переопределён в true. Но из кода видно, что с большей вероятностью просто перекачка из 8 бит массива в 16 битный, поэтому я и сделал оговорку.

Что касается memcpy() и остального....

Цитата
И я знаю как внутри работает memcpy()
Как вы можете знать, как работает memcpy() у ТС, если memcpy реализуется разработчиками каждого компилятора под каждую архитектуру? Вы знаете как каждый memcpy() реализован? У каждого своя реализация. Как правило, memcpy() реализован так, что из всех возможных реализаций код memcpy будет самый оптимальный, вплоть до ухода в асм. Если пользователь компилятора/библиотеки и решит написать свой копипаст, то он будет менее эффективный, в лучшем случае будет такойже, поэтому при копировании памяти не нужно замарачиваться и изобретать скоростной велосипед, а просто использовать memcpy(). Наверно бывают случаю, что memcpy сырой, написан индусами и можно свой написать оптимальней, но это на столько редко.... и нужно хорошо знать архитектуру. Потратите много времени, выиграете 1-2 такта на копировании 1 байта.

более того, если ЕСЛИ всё же нет перевертывания и это 8 и 16 бит, то даже плохой memcpy будет быстрее кода ТС. Посмотрите сколько лишних операций в for у ТС! какие-то приведения типов, операторы, << и |, дополнительный j, операции j++!!! УЖАС!!!(кстати.... j++ достаточно медленный, по сравнению с ++j). Более того, если ЕСЛИ data_out - это signed char или int8_t, то в коде ТС ошибка, которая обнаружиться только при выполнении, и хорошо если на столе ТС, а может и через год-два у пользователя.

jcxz я сюда не батлится с вами захожу, я тут черпаю чужой опыт, делюсь своим и чужим опытом. Поделитесь вы.....
Цитата
Поэтому он будет быстрее только в определённых случаях.

В каких случаях?
Цитата
Вы в своём совете с memcpy() допустили пару неточностей.
какие неточности? Опять же, mне на батл пофиг, просто я не хочу ошибаться и других вводить в заблуждение в отличие от некоторых
Или вы пустослов? Тогда можно нужно отфильтровать ваши посты, ибо это всё равно что "на заборе написано".

ps
вы сами себе противоречите, причем сразу в одном посте.....
Цитата
ТС судя по всему пытается поменять байты местами при перемещении из источника в приёмник...
С чего Вы вообще взяли, что DataBuffer имеет размерность 16 бит, а data_out - 8 бит?
так всё таки "ТС ... пытается поменять байты" или "С чего Вы вообще взяли, что ... data_out - 8 бит?"

С чего вы решили, что я утверждаю, что DataBuffer 16 бит, а data_out - 8 бит? Я писал ЕСЛИ, вы знаете значение слова "если"?
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 21 2018, 05:32
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(juvf @ Jun 21 2018, 07:24) *
С чего вы решили, что я утверждаю, что DataBuffer 16 бит, а data_out - 8 бит? Я писал ЕСЛИ, вы знаете значение слова "если"?

Среди профессионалов принято так: если есть наиболее вероятное и простое объяснение, то нужно пользоваться именно им.
В противном случае один мой знакомый говорил: "а если инопланетяне прилетели и сделали {подставить нужное}".
Если ТС-инопланетянин, пишет, вроде, по нашему, но по ихнему это совсем другой смысл, то jcxz должен посыпать голову пеплом раз не
предположил, что такое возможно. Дальше смысл беседы в этом направлении теряется.
Если по исходнику понятно, что источник шире 8 байт приведет к перемешиванию бит, а в приемнике в итоге получается только 16 значащих бит,
то с уверенностью можно принять за факт их размеры 8 и 16 бит соответственно, и при необходимости заявлять "сам дурак",
если ТС начнет добавлять противоречащие новые обстоятельства.

В соседней ветке про таймеры ТС на третей станице пошел по второму кругу, хотя у меня была полная уверенность, что точка в вопросе поставлена.
В этой связи, jcxz поддерживаю, т.к. без телепатии, а на одной только логике, не понять, что нужно ТС.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 21 2018, 06:22
Сообщение #30


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (adnega @ Jun 21 2018, 08:32) *
"а если инопланетяне прилетели и сделали {подставить нужное}".
К сожалению, аборигены запомнили только, что нужно хлопать при приземлении.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

6 страниц V  < 1 2 3 4 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th April 2024 - 05:11
Рейтинг@Mail.ru


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