Например TDA7294

Форум РадиоКот • Просмотр темы - Как записать код лаконичнее
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Сб янв 17, 2026 18:23:51

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 71 ]    , 2, ,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Пт окт 21, 2022 19:54:45 
Опытный кот
Аватар пользователя

Карма: 2
Рейтинг сообщений: 164
Зарегистрирован: Ср авг 03, 2022 05:22:56
Сообщений: 848
Рейтинг сообщения: 0
Кстати, еще один способ - в цикле от 0 до n проводить накопление абсолютной (без учета знака) разности элементов массивов: x += abs(A[n] - B[n]). В конце цикла проверить значение x. Если оно отличается от 0, значит массивы разные по значениям.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Пт окт 21, 2022 20:05:35 
Мудрый кот

Карма: 25
Рейтинг сообщений: 498
Зарегистрирован: Сб май 05, 2012 20:24:52
Сообщений: 1852
Откуда: KN34PC, Болгария
Рейтинг сообщения: 0
Если собираемся применять математику, существует столько методов, сколько хотим. Напр. CRC даже в датчики вложены. Но вычислительная мощность крошечных mcu идет на "безжалостное" использование. С любовью напр. возвращаюсь к использованию, напр. к люб. ATtiny13 - сколько функций и математики можно собрать, а объем памяти все равно не достигнет :).


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Пт окт 21, 2022 20:12:02 
Собутыльник Кота
Аватар пользователя

Карма: -12
Рейтинг сообщений: -24
Зарегистрирован: Пт июл 12, 2019 22:52:01
Сообщений: 2516
Рейтинг сообщения: 0
Прикольно! Я тоже хачю так песать! :)))

Самое убогое, что я видел - инициализация абдуринщиками ЖК-экранчика. Когда нужно толпу команд инициализации переслать, периодически небольшие паузы делать. И китаезы, как обычно, ничего, лучше тупого копипаста на несколько страниц текста, не придумали. Хотя достаточно завести структуру, инициализировать во флеше, а потом в цикле все это УГ пересылать, делая при необходимости нужные паузы…

_________________
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Пт окт 21, 2022 21:39:40 
Это не хвост, это антенна

Карма: 12
Рейтинг сообщений: 136
Зарегистрирован: Вт июн 07, 2011 08:03:18
Сообщений: 1327
Рейтинг сообщения: -2
Ой, да ладно, дядя! Ардуино - это С++, ты зто хаваешь? Или просто, какой я тут крутой?


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Сб окт 22, 2022 00:48:18 
Электрический кот

Карма: 5
Рейтинг сообщений: 173
Зарегистрирован: Пн май 01, 2017 20:01:45
Сообщений: 1085
Рейтинг сообщения: 0
Кстати, еще один способ - в цикле от 0 до n проводить накопление абсолютной (без учета знака) разности элементов массивов: x += abs(A[n] - B[n]). В конце цикла проверить значение x. Если оно отличается от 0, значит массивы разные по значениям.


Во-первых, функция "abs" не бесплатная и имеет схожие затраты, как и у "if". Что, вообще, лишает смысла.
Во-вторых, на двух абсолютно разных массивах вы можете получить "0". Ошибку сами найдете?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Сб окт 22, 2022 01:41:38 
Говорящий с текстолитом
Аватар пользователя

Карма: 18
Рейтинг сообщений: 236
Зарегистрирован: Пт дек 10, 2021 12:48:46
Сообщений: 1563
Откуда: Тюмень
Рейтинг сообщения: 0
А как ?

Один из способов такой... :)
Вложение:
1.png [19.49 KiB]
Скачиваний: 76


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Сб окт 22, 2022 02:47:13 
Опытный кот
Аватар пользователя

Карма: 2
Рейтинг сообщений: 164
Зарегистрирован: Ср авг 03, 2022 05:22:56
Сообщений: 848
Рейтинг сообщения: 0
Во-первых, функция "abs" не бесплатная и имеет схожие затраты,

Во-первых, знаете, как выражается разность в формате unsigned? :) Математику надо хоть немного то знать
Во-вторых, на двух абсолютно разных массивах вы можете получить "0". Ошибку сами найдете?

Во-вторых, яж написал - разность по модулю, без учета знака то есть. Накопление этой разности. Если хотябы один элемент отличается в массивах, то разность уже не будет нулевой. а если второй элемент отличается в другую сторону, то разность по модулю не будет отрицательной и накопление разности не обнулится.


Последний раз редактировалось MLX90640 Сб окт 22, 2022 07:57:59, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Сб окт 22, 2022 07:57:26 
Электрический кот

Карма: 5
Рейтинг сообщений: 173
Зарегистрирован: Пн май 01, 2017 20:01:45
Сообщений: 1085
Рейтинг сообщения: 0
... ошибки MLX90640 искать не собирается, а свой возраст продемонстрирован очень четко. На сём разговор закончен.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Сб окт 22, 2022 08:00:01 
Опытный кот
Аватар пользователя

Карма: 2
Рейтинг сообщений: 164
Зарегистрирован: Ср авг 03, 2022 05:22:56
Сообщений: 848
Рейтинг сообщения: 2
u37,
Я там пояснил для вас, даже как для школьника, суть модуля разности - это просто расстояние между двумя точками без учета направления. Эта разность всегда положительна. Так что ищите ошибки в своей математике за 5 класс :)
Вот что за манера на этом форуме - чуть чо, не разобравшись в вопросе, сразу обвинять в ошибках и упорно не желать разобраться в сути. Недавно этот, как его там, Demiurg, с пеной у рта доказывал, как надо функции писать, и тоже ссылался на возраст. А теперь вот и u37 доказывает свои незнания школьной математики за 5 класс :)

Ну и по аналогии с Demiurg-ом, давайте разберем, что вы, u37 тут понаписали:
Цитата:
Код:
int cmp=0;
for (.... +4)
{ cmp |=(r1[i] ^ r2[i]) | (r1[i+1] ^ r2[i+1]) | (r1[i+2] ^ r2[i+2]) | (r1[i+3] ^ r2[i+3]); }
if (cmp == 0) ...

Вас ист дас, что есть это? Поясните ход ваших мыслей. Зачем +4, почему i+3, что такое | и для чего оное? И зачем делите элементы массива по 4 штуки? А если массивы не кратные числу 4? А может сразу в одну линейку 40 штук записать? Или все-таки по одному?
Если делаете логическим сравнением по xor, то незачем делить массив на группы по 4 штуки. Сей глубокий смысел излишен. Сделайте просто xor по одному элементу из каждого массива и не мудрите.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Сб окт 22, 2022 10:19:31 
Говорящий с текстолитом
Аватар пользователя

Карма: 18
Рейтинг сообщений: 236
Зарегистрирован: Пт дек 10, 2021 12:48:46
Сообщений: 1563
Откуда: Тюмень
Рейтинг сообщения: 0
MLX90640
Вам бы "семикласснику", манерам общения стоило бы поучиться… :facepalm: или Вы с пелёнок кипятком писаете? Свои ранее плюсы убрал, так как видимо не на пользу пошли… :( бревна в своём глазу не замечаете? Вопрос риторический, если что… базар разводить не буду...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Сб окт 22, 2022 11:43:01 
Друг Кота
Аватар пользователя

Карма: 62
Рейтинг сообщений: 889
Зарегистрирован: Вт апр 24, 2007 07:45:40
Сообщений: 6238
Откуда: Minsk
Рейтинг сообщения: 3
расстояние между двумя точками без учета направления. Эта разность всегда положительна.

Чисто математически - да. Но при реализации на МК... Досчитали до 256 - и плучили 0. Для разности мало одного байта? Берём минимум 2 ? Тогда: расширение первого байта-операнда до целого слова, потом второго, потом разность. Это отнюдь не 1 машинная команда в цикле.
В общем, пока конкурента моей реализации не вижу. И чего это многие как чёрт ладана боятся асма, хотя бы на уровне вставки? "У меня памяти достаточно, на френ мне ваш асм. Но вот почему оно так медленно работает?!"

_________________
Изображение


Последний раз редактировалось Jack_A Сб окт 22, 2022 18:07:40, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Сб окт 22, 2022 12:56:26 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2557
Рейтинг сообщения: 0
И чего это многие как чёрт ладана боятся асма, хотя бы на уровне вставки?
Пока ЯВУ справляется с задачей, асм зло. Аргументы всё те же и уже десятки лет не меняются: трудоёмкость и совместимость.

"У меня памети достаточно, на френ мне ваш асм. Но вот почему оно так медленно работает?!"
Вот когда будет медленно работать, тогда и стоит найти узкое место и оптимизировать именно его. Тыкать асм куда ни попадя плохая идея.

Добавлено after 2 minutes 39 seconds:
В общем, пока конкурента моей реализации не вижу.
Где можно посмотреть вашу реализацию?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Сб окт 22, 2022 18:06:40 
Друг Кота
Аватар пользователя

Карма: 62
Рейтинг сообщений: 889
Зарегистрирован: Вт апр 24, 2007 07:45:40
Сообщений: 6238
Откуда: Minsk
Рейтинг сообщения: 0
Где можно посмотреть вашу реализацию?

Дык у меня оно - на уровне идеи :)) (пост от 21.10)
А так приблизительно выглядело бы:
Код:
     LDI   ZL,low(Array1)
      LDI   ZH,highArray1)
      LDI   YL,low(Array2)
      LDI   YH,high(Array2)
lab: ld R16,z+
      ld  R1,y+
      sub R16.R1
      brne out_cycle
      cpi   ZH,high(Array1+40)
      brlo  lab
      cpi   ZL,low(Array1+40)
      brlo  lab
out_cycle: tst R16  ; вот сюда мы придём с 0 в R16 , если массивы совпали  :))

Если бы массивы были в одном 256-байтовом сегменте, было бы ещё проще - не проверяли бы ZH, но компилевич нам это не гарантирует.
Полностью согласен - асм пихать куда ни попадя - плохая идея, при этом - не моя :) Но если надо, то...
И непонятна хотелка ТС насчёт "лаконичности" - в МК не лезет? быстродействия не хватает? или места на диске компа в директории MY_PROJECTS ? :))
----------
ПыСы Давно не писал на асме, там, кажется в LDI на 2 умножать надо :shock:

_________________
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Сб окт 22, 2022 20:58:57 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2557
Рейтинг сообщения: 0
Ну, давайте посмотрим. Достаточно несложно ищется код memcmp из Microsoft CRT, который слегка избыточен под задачу ТС. Или напишем прямо в лоб сами. Ничем не хуже и гарантировано работает, да ещё на любом компиляторе и процессоре. А если оптимизацию -O3 поставить, то ещё и быстрее вашего варианта. Так что, победу вы себе рановато приписали.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Сб окт 22, 2022 21:25:50 
Друг Кота
Аватар пользователя

Карма: 62
Рейтинг сообщений: 889
Зарегистрирован: Вт апр 24, 2007 07:45:40
Сообщений: 6238
Откуда: Minsk
Рейтинг сообщения: 0
Интересно бы посмотреть сгенерированный код с ентой самой оптимизацию -O3. Я не представляю, как можно короче - у меня ни одной лишней операции. Как я уже выразился, быстрее можно только если оба массива находятся в одной "странице" памяти (можно - каждый в своей), тогда не нужно проверять ZH на конец цикла. Я для МК на Си не писа'л никогда, поэтому не знаю - можно ли заставить компайлер размещать массив на границе блока.
Или, может быть, Си - язык настолько высокого уровня, что генерирует секретные супербыстрые команды, недоступные ассемблеру ? :))
А то получается - мой рекорд пытаются опорочить бездоказательным "может быть..." :)) :( :)
----------
Насчёт ссылок. Первая - какое отношение имеет Мелкософт к Атмел и почему в нём должны быть коды AVR? Может, где-то в нём что-то и глубоко упрятано по этой теме, но ввиду позднего в ремени и оно_мне_надо? искать не стал. По второй ссылке. На мой взгляд, код достаточно мутный, использует туеву хучу регистров, объём больше моего и сомневаюсь насчёт быстроты. Можно бы протестировать - но а на фига?
И вообще - нужно ли искать источники, в которых решают задачу уровня 2*2=4, если это не просто, а очень просто?

_________________
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Сб окт 22, 2022 22:19:19 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2557
Рейтинг сообщения: 0
Интересно бы посмотреть сгенерированный код с ентой самой оптимизацию -O3.
Ну там в строке параметров поменяйте -Os на -O3. В чём сложность то?

Я не представляю, как можно короче - у меня ни одной лишней операции.
Не, короче, а быстрее! И разработчики компиляторов знают как это делать.

можно ли заставить компайлер размещать массив на границе блока.
Есть атрибуты выравнивания данных.

Или, может быть, Си - язык настолько высокого уровня, что генерирует секретные супербыстрые команды, недоступные ассемблеру ? :))
Команды то те же, а вот применять их можно по разному.

А то получается - мой рекорд пытаются опорочить бездоказательным "может быть..." :)) :( :)
Если честно, то законченного рабочего кода мы ещё и не видели. Порочить нечего.

Насчёт ссылок. Первая - какое отношение имеет Мелкософт к Атмел и почему в нём должны быть коды AVR?
Дело в том, что код memcmp в стандартных библиотеках достаточно навороченный для оптимизации на разных процессорах. Он учитывает разрядность, выравнивание данных и "тип индейцев". Код от мелкомягких, как мне кажется, неплохо для восьмибиток подходит и в стандартной библиотеке avr gcc он не должен быть хуже.

По второй ссылке. На мой взгляд, код достаточно мутный, использует туеву хучу регистров, объём больше моего и сомневаюсь насчёт быстроты.
Во-первых, не путаем размер и скорость. Во-вторых, регистры на то и есть, чтобы их использовать. В-третьих, сравнивать стоит не фрагмент кода, а законченное решение. В-четвёртых, поставьте -O3, если нужна скорость.

Можно бы протестировать - но а на фига?
Ну конечно, можно просто назначить себя победителем.

ЗЫ: А есть ещё компилятор для AVR от IAR...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Вс окт 23, 2022 07:13:16 
Друг Кота

Карма: 66
Рейтинг сообщений: 1023
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 4381
Откуда: Ижевск
Рейтинг сообщения: 2
Как вариант, на основе выше предложенных решений. 26 байт кода и 364 цикла сравнения одинаковых массивов. :)
СпойлерИзображение


Вложения:
Сравнение массивов.PNG [14.96 KiB]
Скачиваний: 113
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Вс окт 23, 2022 09:18:24 
Мудрый кот

Карма: 20
Рейтинг сообщений: 145
Зарегистрирован: Вс дек 25, 2016 08:34:54
Сообщений: 1849
Рейтинг сообщения: 0
Хватить спорить
СпойлерИзображение Изображение
Не знаю, правильно asm-вставку сделал, не правильно, не важно. Регистры r10 r11 надо как-то на выбор компилятора предоставить.
А так 141мкс против 77мкс на тактовой частоте МК 1МГц, такты сами посчитаете.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Вс окт 23, 2022 10:33:33 
Друг Кота
Аватар пользователя

Карма: 62
Рейтинг сообщений: 889
Зарегистрирован: Вт апр 24, 2007 07:45:40
Сообщений: 6238
Откуда: Minsk
Рейтинг сообщения: 0
Если честно, то законченного рабочего кода мы ещё и не видели. Порочить нечего.

Наверное, нечестно. Потому что мой код в посте от 22.10 6.06pm
Вообще мне стал неинтересен этот пустой спор об очевидных вещах.

_________________
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Вс окт 23, 2022 14:19:05 
Говорящий с текстолитом
Аватар пользователя

Карма: 18
Рейтинг сообщений: 236
Зарегистрирован: Пт дек 10, 2021 12:48:46
Сообщений: 1563
Откуда: Тюмень
Рейтинг сообщения: 0
26 байт кода и 364 цикла

:beer:
Мой вариант:
Вложение:
1.png [5.9 KiB]
Скачиваний: 64

38 слов – 291 цикл… на выполнение алгоритма при 1 МГц уходит 410 мкс… :)


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 71 ]    , 2, ,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y