Использование LLM для написания кода

Обсуждаем контроллеры компании Atmel.
Ответить
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 370
Зарегистрирован: Ср мар 09, 2016 08:07:41

Сообщение JackSmith »

Любым инструментом надо уметь пользоваться, и использовать по назначению. Мне нужна была функция для вывода значений переменных на ST7735. Qwen мне выдал приемлемый и рабочий вариант с первого раза. Я должен это игнорировать? Почему я должен вручную высчитывать пиксели и заниматься подобной мурой?
Реклама
Опытный кот
Сообщения: 729
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

Ну, коль своей головы нет, то конечно не возбраняется пользоваться чужим умом, даже искусственным :)
По-моему, это одна из самый простых задач - вывод текста на мелкий дисплей. Раньше мы такие задачи решали самостоятельно. Да и в инете есть куча библиотек к этому дисплею, нужно только взять их.
Вручную там не нужно высчитывать пиксели. Достаточно написать несложную функцию получения пикселей из массива шрифта и помещения их в дисплей в заданные координаты. Это решается элементарно, а заодним и развивает собственный мозг. Ну, это тем, у кого он есть. У кого нет - то и развивать нечего.
К сожалению нынешнее поколение зумеров без сторонней помощи не способно решить даже самое простое. Скоро дойдет до того, что сами себе подтереть жопу в сортире не смогут без совета ИИ-ботов.

Сейчас уже вполне официально признали, что поколение зумеров впервые за последние несколько веков оказалось глупее и беспомощнее предыдущего поколения. Такие вот дела. Мультик Wall-e смотрели? Не слишком то он фантастичен. Нужно только подождать, пока человечество скатится в эту яму.

PS. Я вот такую задачу могу решить даже в уме:

Код: Выделить всё

CoordXY Print(const char* str, uint8_t len, const FontInfo& font, CoordXY coord, uint16_t color)
{
    while(len-- && str != '\0' && *str != '\n')
    {
        coord = Print(*str++, font, coord, color);
    }
    return coord;
}

CoordXY Print(const char ch, const FontInfo& font, const CoordXY& start, uint16_t color)
{
    GlyphInfo glyph = font.GetGlyphInfo(ch);
    CoordXY size = {glyph.width, font.height};
    SetDisplayWin(start, start + size - CoordXY{1, 1});

    BitMask mask{size.x, size.y, font.bitmap + glyph.offset};

    for(uint8_t y = 0; y < size.y; y++)
    {
        for(uint8_t x = 0; x < size.x; x++)
        {
            if(mask.GetPix({x, y}))
                SetDisplayPix({x + start.x, y + start.y}, color);
        }
    }
    return {start.x + size.x, start.y};
}

Код: Выделить всё

    Print("Hello World!", MAX_LEN, arial_14px, {10, 20}, COLOR_RED);
    
    len = sprintf(text, "T = %3d", value);
    Print(text, len, arial_14px, textCoord, COLOR_BLUE);
Реклама
Мучитель микросхем
Сообщения: 466
Зарегистрирован: Чт май 07, 2026 00:30:38

Сообщение Zapolyarny »

Rapra писал(а): Вс авг 30, 2026 09:10:16 PS. Я вот такую задачу могу решить даже в уме:
Любую задачу можно решить в уме, вопрос лишь в верности результата ;)
(я вышеописанную не решу, так как не знаю работу sprintf - не использую её).
Опытный кот
Сообщения: 729
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

А что результат? Результат - РАБОТАЕТ! Нормально работает, как раз для дисплеев типа ILI9341 и тому подобных. Вы сомневаетесь в этом??
Если кто не может по коду проследить, вот объяснение от ИИ-бота: https://chat.deepseek.com/share/2sra8jh0t7pdomrpxl В конце он даже добавил: "Это классическая реализация вывода текста на графический дисплей с использованием битовых шрифтов." Во как! А вы говорите - не работает :)

sprintf - для примера. Хотя нормально она тоже работает, че зазря гнать? Это просто форматированный вывод в текстовую строку. Можно заменить любой другой реализацией, не суть важно. Главное - получить массив типа char в ANSI-кодировке
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Сообщения: 601
Зарегистрирован: Вт окт 01, 2024 15:22:33

Сообщение Adrift »

Rapra писал(а): Вс авг 30, 2026 11:57:03А что результат? Результат - РАБОТАЕТ! Нормально работает, как раз для дисплеев типа ILI9341 и тому подобных.
Тут ошибка, ИИ ее сразу видит )

Код: Выделить всё

while(len-- && str != '\0' && *str != '\n')
Реклама
Опытный кот
Сообщения: 729
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

Точно, очепятка :) Писал то прямо здесь, а не в IDE.
Хотя, работать оно будет по ограничению длины в len. Просто не будет видеть конец строки по нуль-термитатору.
Правильно будет *str != '\0'
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 370
Зарегистрирован: Ср мар 09, 2016 08:07:41

Сообщение JackSmith »

PS. Я вот такую задачу могу решить даже в уме
примитивно. без DMA, без буферов, нет работы с CS, DC, про фоновый цвет забыли видимо. вся низкоуровневая механика спрятана в библиотечные функции...
По-моему, это одна из самый простых задач - вывод текста на мелкий дисплей. Раньше мы такие задачи решали самостоятельно. Да и в инете есть куча библиотек к этому дисплею, нужно только взять их
конечно, но только сделать надо за 15 секунд.

Меня неправильно поняли. Драйвер у меня есть, надо было просто составить макет и реализовать вывод показаний датчиков на дисплей. Четыре шрифта 16х8 на выбор, с кириллицей.
вот что мне выдал Qwen

Код: Выделить всё

# //=== TFT-дашборд ===//
def ljust(s, n):
    return (s + ' ' * n)[:n]     # дополняет И обрезает до n

def rjust(s, n):
    return (' ' * n + s)[-n:]

def fmt_temp(v):
    if v is None:
        return "--.-"
    return f"{float(v):+.1f}"

def fmt_hhmm(t):
    if not isinstance(t, tuple):      # пока данных не было, там float-заглушка
        return "--:--"
    return f"{t[3]:02d}:{t[4]:02d}"

def temp_color(v):
    return tft.RED if v is not None and float(v) >= 0 else tft.BLUE

def tft_update():
    gc.collect()
    lt = time.localtime(time.time() + TZ_OFFSET * 3600)

    # y=0 — текущее время
    font.print_str(0, 0,
        ljust(f"{lt[3]:02d}:{lt[4]:02d}:{lt[5]:02d} {lt[2]:02d}.{lt[1]:02d}", 16),
        tft.WHITE, tft.BLACK)

    if current_press is not None:
        # y=16/32 — BMP280
        press = f"{current_press:.0f}" if current_press is not None else "---"
        bmp_time = fmt_hhmm(time.localtime(last_bmp_update + TZ_OFFSET * 3600)) if last_bmp_update else "--:--"
        font.print_str(0, 16,
            ljust(f"BMP280 {rjust(press, 3)} {bmp_time}", 16),
            tft.GREEN, tft.BLACK)
        big_font.print_str(0, 32, ljust(fmt_temp(current_temp), 8), temp_color(current_temp), tft.BLACK)

    if remote_temp is not None:
        # y=64/80 — DS18b20
        font.print_str(0, 64, ljust(f"DS18b20 {fmt_hhmm(remote_time)}", 16), tft.CYAN, tft.BLACK)
        big_font.print_str(0, 80, ljust(fmt_temp(remote_temp), 8), temp_color(remote_temp), tft.BLACK)

    if remote_sht30_temp is not None:
        # y=112/128 — SHT30
        hum = f"{float(remote_sht30_humidity):.0f}%" if remote_sht30_humidity is not None else "--%"
        font.print_str(0, 112,
            ljust(f"SHT30 {rjust(hum, 3)} {fmt_hhmm(remote_sht30_time)}", 16),
            tft.YELLOW, tft.BLACK)
        big_font.print_str(0, 128, ljust(fmt_temp(remote_sht30_temp), 8), temp_color(remote_sht30_temp), tft.BLACK)
результат
Изображение
Опытный кот
Сообщения: 729
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

JackSmith писал(а): Вс авг 30, 2026 12:32:35 примитивно
Ха. А вы не заметили, что в коде нет аппаратного уровня? Там есть только функции SetDisplayWin() и SetDisplayPix(), а их реализация может быть любой, какой необходимо - в том числе и с DMA, блэкджеком и шлюхами :)
JackSmith писал(а): Вс авг 30, 2026 12:32:35 сделать надо за 15 секунд.
Для этого у опытного программиста уже есть набор давно написанного и оттестированного инструментария. Просто подключаем нужную библиотеку и пользуемся. А вам нужно еще затратить энное число минут на тестирование того, что нагенерил ИИ
JackSmith писал(а): Вс авг 30, 2026 12:32:35 вот что мне выдал Qwen
А в наше время это называлось "ГОВНОКОД" и за него били ссаными тряпками :)
Последний раз редактировалось Rapra Вс авг 30, 2026 12:43:13, всего редактировалось 1 раз.
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 25
Зарегистрирован: Пн дек 15, 2014 19:04:08
Откуда: г. Пермь

Сообщение Andry_67 »

Я не понимаю, почему появление ИИ некоторые расценивают как какую-то катастрофу. Например, ИИ я активно пользуюсь с начала этого года. И скажу: Я очень доволен такой возможностью, я бы так сказал с появлением ИИ, программирование микроконтроллеров заиграло новыми красками. Правда этим инструментом нужно научиться правильно пользоваться. Не думайте, что ИИ сделает за вас всё. Всё равно программировать вам придётся самим. Но на ИИ можно переложить всякие мелкие задачи. Например настроить SPI, настроить таймеры и так далее. Так же не понимаю тезиса, что с появлением ИИ все отупеют. Это примерно то же самое, что с появлением автомобилей все разучатся ходить. Отупеть вам не получится. Иногда искусственный интеллект косячит, и чтобы понять где и что он сделал не так и почему не работает, нужно быть опытным программистом.
Тезис о том, что все сейчас в край обленятся тоже не поддерживаю. Вы же лентяи сейчас из интернета всё качаете. Куски кода, библиотеки, даже иногда целые проекты. Я начинал программировать в конце 80-х. Не было никаких интернетов. И все знания и приёмы программирования я брал из книжек. И теперь мы дожили до момента, когда кусок кода можно не только с интернета скачать. А его можно прямо в интернете заказать.
Вот например, сейчас я стал делать вещи к которым раньше даже не знал как подступиться. Например делать ассемблерные вставки для STM32. Там всё очень непросто, один неправильный аргумент и ничего работать не будет. При чём даже компилятор ничего не скажет. И вообще благодаря искусственному интеллекту я плотно пересел на STM32. Например у STM32F401... чтобы просто настроить одну ножку нужно 6 строк кода. При чём все буковки должны быть написаны правильно. И тут ИИ здорово помогает.
Так что давайте будем тихо радоваться, что научный прогресс предоставил нам такую возможность облегчить себе жизнь. Ну а те, кто искусственным интеллектом ещё не пользуются, давайте подтягивайтесь.
Мучитель микросхем
Сообщения: 466
Зарегистрирован: Чт май 07, 2026 00:30:38

Сообщение Zapolyarny »

Rapra писал(а): Вс авг 30, 2026 11:57:03 sprintf - для примера. Хотя нормально она тоже работает, че зазря гнать?
Я не говорил, что она работает ненормально. Однажды применил, обнаружил, что слишком ресурсоёмкая (я использую довольно-таки скромные мк) и больше не применял. Так что, судить о её функциональности в принципе не могу.
Опытный кот
Сообщения: 729
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

Andry_67 писал(а): Вс авг 30, 2026 12:42:21 Я не понимаю, почему появление ИИ некоторые расценивают как какую-то катастрофу.
Я выше написал - поколение зумеров за последние несколько веков официально признано более глупым и беспомощным, чем предыдущее поколение.
Вы скоро будете спрашивать у ИИ, как жопу в сотрире подтереть :))
Опытный кот
Сообщения: 729
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

Zapolyarny писал(а): Вс авг 30, 2026 12:44:27 Я не говорил, что она работает ненормально. Однажды применил, обнаружил, что слишком ресурсоёмкая (я использую довольно-таки скромные мк) и больше не применял.
Так если начнете писать свою реализацию с таким же функционалом, то она тоже станет такой же ресурсоемкой.
Кстати, есть легкие реализации tiny printf.
Мучитель микросхем
Сообщения: 466
Зарегистрирован: Чт май 07, 2026 00:30:38

Сообщение Zapolyarny »

Andry_67 писал(а): Вс авг 30, 2026 12:42:21 Я не понимаю, почему появление ИИ некоторые расценивают как какую-то катастрофу
.....
научный прогресс предоставил нам такую возможность облегчить себе жизнь.
Вероятно, именно последняя фраза ключевая. Мы же всё-таки уже старое поколение. Имея той или иной степени опыт и знания, получили новый отличный инструмент, который действительно расширил границы наших возможностей.
Но что это несёт новому поколению?
Я уже видел собственными глазами (ещё 20 лет назад) как дети лет 15 тычут пальцами в корову и спрашивают что это и не верят, что это - молоко, творог, сыр, сметана, кефир, котлеты и прочие кожаные изделия.
Я не уверен, что новым поколениям обязательно это знать, вполне возможно, роботы всё сделают и не сломаются. А если сломаются?
Так что, отсыл к Wall-e выше наверняка верный, и ИИ - это палка о двух концах.
Rapra писал(а): Вс авг 30, 2026 12:47:37 Так если начнете писать свою реализацию с таким же функционалом, то она тоже станет такой же ресурсоемкой.
Кстати, есть легкие реализации tiny printf.
Конечно, я же получу её копию (в лучшем случае). Я просто избегаю её.
(Напомнило:
- Что мешает?
- Геометрия!
- Просто игнорируйте её. :) )
Опытный кот
Сообщения: 729
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

Andry_67 писал(а): Вс авг 30, 2026 12:42:21 Например у STM32F401... чтобы просто настроить одну ножку нужно 6 строк кода. При чём все буковки должны быть написаны правильно. И тут ИИ здорово помогает.
Опять же, если разучиться читать, то без ИИ и шагу не сделать :)
А настроить ножку у STM32F401 я могу и по памяти.
CMSIS:

Код: Выделить всё

MODIFY_REG(GPIOA->MODER, GPIO_MODER_MODER5_Msk, 0x1 << GPIO_MODER_MODER5_Pos);
MODIFY_REG(GPIOA->OSPEEDR, GPIO_OSPEEDER_OSPEEDR5_Msk, 0x2 << GPIO_OSPEEDER_OSPEEDR5_Pos);
или HAL API:

Код: Выделить всё

GpioA::Configure<GpioA::Pin5::mask>::SetOutputPins<OutType::PP, Speed::HIGH>();
Последний раз редактировалось Rapra Вс авг 30, 2026 12:59:09, всего редактировалось 1 раз.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 370
Зарегистрирован: Ср мар 09, 2016 08:07:41

Сообщение JackSmith »

Rapra писал(а): Вс авг 30, 2026 12:39:06 А в наше время это называлось "ГОВНОКОД" и за него били ссаными тряпками :)
аргументируйте.
Опытный кот
Сообщения: 729
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

В наше время аргументов не требовалось :)
Хотя аргументы здесь - y=16/32 - это и есть говнокод. Я ж говорю - зумеры просто не понимают даже почему это - говнокод :)

И еще: float(v):+.1f}
На каком, простите, микроконтроллере вы это запускаете?
Вымогатель припоя
Сообщения: 601
Зарегистрирован: Вт окт 01, 2024 15:22:33

Сообщение Adrift »

Rapra писал(а): Вс авг 30, 2026 12:27:05Точно, очепятка :) Писал то прямо здесь, а не в IDE.
И это простейший код, а если он будет посложнее:
Спойлер

Код: Выделить всё

template<typename T>
constexpr static const T* find(const T* str, const T* target, T until = '\0')
{
	while (true)
	{
		for (;; str++)
		{
			if (!*str || *str == until) return nullptr;
			if (*str == *target) break;
		}

		auto begin   = str++;
		auto pattern = target + 1;

		while (true)
		{
			if (!*pattern) return begin;
			if (!*str || *str != *pattern++) break;
			str++;
		}

		str = begin + 1;
	}
}
Это я писал и вроде проверил, однако даже бесплатная версия ChatGPT, если ему думание включить, говорит, что правильно во втором цикле делать так:

Код: Выделить всё

if (!*str || *str == until || *str != *pattern++) break;
Потому что иначе при таком вызове фрагмент строки будет найден несмотря на ограничитель until:

Код: Выделить всё

find("abc\ndef", "c\nd", '\n')
Вероятно строку с ограничителем внутри никогда искать и не будут, но сам факт... ИИ видит далеко не очевидные ошибки, как минимум не давать ему проверять код было бы глупо.
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 25
Зарегистрирован: Пн дек 15, 2014 19:04:08
Откуда: г. Пермь

Сообщение Andry_67 »

С зуммерами дело имел. То что они тупые не соглашусь. А вот то, что они ленивые это да! Чтобы программировать, нужно сидеть читать думать, пытаться разобраться. Им лень. А чтоб какую-нибудь игру настроить, или в каком-нибудь телеграме прокси прописать. Они резко становятся умными. Прямо чудеса какие-то.
А настроить ножку у STM32F401 я могу и по памяти.
это мощно :))
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 370
Зарегистрирован: Ср мар 09, 2016 08:07:41

Сообщение JackSmith »

Хотя аргументы здесь - y=16/32 - это и есть говнокод. Я ж говорю - зумеры просто не понимают даже почему это - говнокод :)

И еще: float(v):+.1f}
лол, так и скажите, что ничего не понимаете в программировании.
Мучитель микросхем
Сообщения: 466
Зарегистрирован: Чт май 07, 2026 00:30:38

Сообщение Zapolyarny »

Рискну заметить, что это любители питонов ничего не понимают в программировании. Собственно, он для них и создавался.
Ответить

Вернуться в «AVR»