Обсуждаем контроллеры компании Atmel.
Ответить

Re: Как записать код лаконичнее

Вс окт 23, 2022 15:51:36

Есть ещё вариант, если ответ нужно получить очень быстро... это хранить количество различающихся элементов в переменной...
пусть A и B изначально равные массивы;
чар D =0;
....
если нужно изменить элемент одного из массивов (или элементы с одинаковым номером сразу обоих массивов) то
if (А[i ]!=B[i ]) D--; //сравниваем их значение
A[i ]=x; // изменяем
if (А[i ]!=B[i ]) D++; //снова сравниваем их значение

так D будет всегда равна количеству различающихся ячеек и проверив D==0 находим равенство массивов...

метода специфичен... но тоже работоспособен.

Re: Как записать код лаконичнее

Вс окт 23, 2022 20:23:24

Вот до каких глубин умственной работы может довести а-ли-ментарнейший вопрос :) :)) А ТС уже давно ушёл за пиво'м.
Спойлер"Мсье, вы не заметили - ваша дама уже ушла" © из старого анекдота

Re: Как записать код лаконичнее

Пн окт 24, 2022 23:38:30

всем спасибо
пока расписал в столбик , чтобы не ошибиться
if((r1[0]==r2[0])
&&(r1[1]==r2[1])
----
---
&&(r1[39]==r2[39]))

Re: Как записать код лаконичнее

Вт окт 25, 2022 08:30:01

А ТС просто издевается, тролль недоделанный :)

Re: Как записать код лаконичнее

Вт окт 25, 2022 10:26:13

Хахаха, круто! Прям плюсану даже за такой лаконичный и нестандартный подход! Ма-ла-дец афтар, уделал всех.
Жаль, что массив всего на 40, а не на 4000 элементов!

Re: Как записать код лаконичнее

Вт окт 25, 2022 11:08:48

Жаль, что массив всего на 40, а не на 4000 элементов!

При помощи баша могу эту копипасту сгенерить и для массива в 4000 элементов :)

Re: Как записать код лаконичнее

Вт окт 25, 2022 11:58:54

Eddy_Em писал(а):При помощи баша могу эту копипасту сгенерить и для массива в 4000 элементов

Компилятор может не осилить.

Re: Как записать код лаконичнее

Вт окт 25, 2022 12:30:04

codenamehawk, не, только что проверил. gcc осиливает отлично.
Вложения
1.c
(148.14 KiB) Скачиваний: 52

Re: Как записать код лаконичнее

Вт окт 25, 2022 12:38:56

Лаконизм записи у ТС достиг высот невиданных :) Что до 4000 элементов, то осталось найти Мегу, в которую можно этот хекс впиндюрить. Мега8 точно не согласится.

Re: Как записать код лаконичнее

Сб окт 29, 2022 19:06:00

Хватить спорить
Зная ваш "талант" тестировщика, решил перепроверить. Компилятор GCC 7.3.
Код:
#include <avr/io.h>

uint8_t arr1[8] = { 1,2,3,4,5,6,7,8 };
uint8_t arr2[8] = { 1,2,3,4,5,6,7,9 };

uint8_t my_memcmp(uint8_t* buf1, uint8_t* buf2, uint8_t count)
{
  while (count--) if (*buf1++ != *buf2++) return 1;
  return 0;
}

int main()
{
  DDRD = (1 << PD0);
  PORTD |= 1 << PD0;
  if (my_memcmp(arr1, arr2, 8)) PORTD &= ~(1<< PD0);
  for (;;);
}

Симуляция с тактовой 1 МГц. По листингу такты вроде сходятся.

Функция my_memcmp на разных оптимизациях
СпойлерИзображение

Изображение

Изображение
изображение_2022-10-29_184711928.png
(83.16 KiB) Скачиваний: 30
изображение_2022-10-29_184928286.png
(85.93 KiB) Скачиваний: 29
изображение_2022-10-29_185054921.png
(85.43 KiB) Скачиваний: 29

Стандартная функция memcmp на разных оптимизациях
СпойлерИзображение

Изображение
изображение_2022-10-29_185406004.png
(86.23 KiB) Скачиваний: 22
изображение_2022-10-29_185510596.png
(84.67 KiB) Скачиваний: 22


У кого есть сомнения в результате - можете считать такты по листингу

Re: Как записать код лаконичнее

Сб окт 29, 2022 19:53:41

VladislavS, а с чем сравнить-то? Где сравнение с ассемблерной вставкой? У вас одна версия компилятора, у меня другая.
VladislavS писал(а):Компилятор GCC 7.3.
Опустились до 7.3, давайте еще ниже, может там еще быстрее будет.
VladislavS писал(а):можете считать такты по листингу
конечно, по считаем такты, AVR GCC 12.2.0.
VladislavS писал(а):Компилятор GCC 7.3.
Мне, там, самому поставить 7.3 или как?

Re: Как записать код лаконичнее

Сб окт 29, 2022 20:36:36

Опустились до 7.3
Что значит опустился? Я AVR вообще не занимаюсь. Не поднимался, знаете ли.

давайте еще ниже, может там еще быстрее будет.
Какой был компилятор под рукой, тем и собрал.

Мне, там, самому поставить 7.3 или как?
Нет, я за вас буду выбирать компилятор и ключи оптимизации. Мышка отвалится самому ткнуть?

Re: Как записать код лаконичнее

Сб окт 29, 2022 20:47:06

VladislavS писал(а):Я AVR вообще не занимаюсь. Не поднимался, знаете ли.
Кажется в теме stm этот вопрос уже разбирали.
Пока у вас не будет сравнение с ассемблерной вставкой, оставим этот бесполезный спор.

Re: Как записать код лаконичнее

Сб окт 29, 2022 20:47:21

VladislavS, а с чем сравнить-то? Где сравнение с ассемблерной вставкой? У вас одна версия компилятора, у меня другая.
Вы версию компилятора и ключи оптимизации вообще не соизволили указать.

Пока у вас не будет сравнение с ассемблерной вставкой, оставим этот бесполезный спор.

Ассемблерная вставка от компилятора зависит? Вы же её протестировали. Не доверяете своим тестам?

Re: Как записать код лаконичнее

Сб окт 29, 2022 20:59:31

Ладно, ваша взяла, версия 9.2.0
ассемблер 77мкс
ваша функция на -Os 141мкс, на -O3 51мкс, размер тестового кода на -Os 142 байта, на -O3 226 байт.

Re: Как записать код лаконичнее

Сб окт 29, 2022 21:03:19

версия 9.2.0
Из какого софта или самосборный?

Re: Как записать код лаконичнее

Сб окт 29, 2022 21:11:37

С их сайта скаченый, файл avr-gcc.exe датируется от 07.09.2019
Спойлер
Код:
C:\WinAVR\bin>avr-gcc -v
Using built-in specs.
Reading specs from c:/winavr/bin/../lib/gcc/avr/9.2.0/device-specs/spec
s-avr2
COLLECT_GCC=avr-gcc
COLLECT_LTO_WRAPPER=c:/winavr/bin/../libexec/gcc/avr/9.2.0/lto-wrapper.
exe
Target: avr
Configured with: ../configure --prefix=/omgwtfbbq/win64 --target=avr --enable-la
nguages=c,c++ --disable-nls --disable-libssp --disable-libada --with-dwarf2 --di
sable-shared --enable-static --enable-mingw-wildcard --host=x86_64-w64-mingw32 -
-build=x86_64-pc-linux-gnu
Thread model: single
gcc version 9.2.0 (GCC)

Сейчас-то уже новее есть.

Re: Как записать код лаконичнее

Вс окт 30, 2022 07:16:27

всем спасибо
пока расписал в столбик , чтобы не ошибиться
if((r1[0]==r2[0])
&&(r1[1]==r2[1])
----
---
&&(r1[39]==r2[39]))

Ужос! Вам уже Eddy_Em всё написал в самом начале. Если вы боитесь memcmp.

Re: Как записать код лаконичнее

Вс окт 30, 2022 12:09:08

ассемблер 77мкс
ваша функция на -Os 141мкс, на -O3 51мкс

Вот это странно! Или действительно компилятор знает какие-то супербыстрые недокументированные команды (но мне VladislavS объяснил, что это не так) :) , или же асмовская вставка сделана коряво. Применение асма не гарантирует оптимальность кода без включения бо'шки. :(

VladislavS
Команды то те же, а вот применять их можно по разному.

Я не понимаю, как ещё по разному применять команды, кроме как собрать из них фрагмент программы - или оптимальный (как, видимо, делает умный компилятор), или через ~опу (если не шибко думать).

Re: Как записать код лаконичнее

Вс окт 30, 2022 12:15:43

Да нет, просто использует более выгодный по скорости порядок и состав инструкций. Никаких недокументированных возможностей конечно же не использует. Компилятор то, он же работает по заложенным в него шаблонам тех или иных действий.

Ну а топикстартер конечно же всех просто уделал, применив свой, наиболее "лаконичный" способ :))) Вот, "учитесь"!
Ответить