Работа с портами пинам. Макросы, X-macro

Обсуждаем контроллеры компании Atmel.
Ответить
Вымогатель припоя
Сообщения: 690
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

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

Языки С и С++ давно уже стали стандартном в программировании микроконтроллеров. С одной стороны они достаточно близки к железу, чтобы непосредственно управлять работой микроконтроллера и распределением ресурсов, с другой стороны обладают достаточной абстракцией для построение общей логики. И это, можно сказать, золотая середина между железом микроконтроллера и логикой программы. Конечно, С и С++ несовершенны, но в мире ничего нет идеального. И по крайней мере у этих языков есть хорошая поддержка, они развиваются, хоть и медленно, а их компиляторы генерируют достаточно эффективный код. Вручную вот вряд ли лучше напишешь.

В противовес этому, автор говорит о каком-то самопальном "языке высокого уровня", построенном на черт знает какой базе (этот секрет он не раскрывает). Судя по скупым упоминаниям, этот "ЯВУ" в какой-то мере напоминает язык Си в альфа-версии до 89-го года или что-то типа того. Хотя до сих пор неизвестно, есть ли у автора какие-либо алгоритмические инструменты типа условного ветвления, циклов и тому подобного, какие есть типы данных. Известно только то, что есть какие-то макросы и какие-то подпрограммы с параметрами, которые позволяют написать Power_Led_On и SetPort одной строчкой. И это выделяется как главное преимущество.

Автор постоянно твердит, что с программой, написанной на языке Си, почему-то "пациент должен умереть". Странно конечно, почему он так решил. Но лично я больше доверяю С/С++ с почти полувековой историей, чем самодельной мутной конструкции от не слишком компетентного автора. Особенно после его фразы, что если программа вышла из одной точки и не пришла в другую точку, то "ясно дело, аппаратный сбой" из-за того, что на плате какой-то винтик был залит маской.
Реклама
Мучитель микросхем
Сообщения: 407
Зарегистрирован: Чт май 07, 2026 00:30:38

Сообщение Zapolyarny »

Rapra писал(а): Чт авг 20, 2026 21:20:37 Конечно, С и С++ несовершенны, но в мире ничего нет идеального.
Rust ;)
Реклама
Вымогатель припоя
Сообщения: 690
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

Тоже неидеален, весьма неидеален. Я бы назвал это пародией на C/C++. Взяли язык С/С++, поменяли в нем синтаксис до неузнаваемости и выплюнули в виде новой концепции. А новая концепция - это переставленная наоборот старая концепция. Как будто через зеркало переписали.
Взять например объявление переменной. В Си: int var; В Rust: let var: i32. В Си переменная по умолчанию является изменяемой, в Rust - неизменяемой.
Объявление функций. Си: int Foo(int a); Rust: fn foo(a: i32) -> i32
Оператор case заменили на match такого же содержания, но с измененным синтаксисом.
В структуре struct поменяли видимость полей по умолчанию.
namespace и using из С++ заменили на mod и use.
Понятный и компактный в C++ принцип организации классов с полями и методами заменили на отдельно структуры struct, отдельно методы impl и отдельно обобщенные/виртуальные методы trait. При этом ООП в полном смысле он не поддерживает.
Ну и так далее, так далее, так далее.
То есть, можно сказать, что Rust - отзеркалированный, разломанный и криво пересобранный С/С++. В результате получили несовместимый с С/С++ язык примерно похожего содержания. При этом он не является ООП-языком, у него ограниченная поддержка, а проблемы тоже отзеркалировались. Так что, по большому счету, Rust - это замена одних проблем другими.
С++ предоставляет больше свободы, которую при желании можно ограничить, а Rust создает видимость "безопасности", которую при желании можно обойти.

Что касается безопасности рассматриваемого здесь авторского "ЯВУ", тут это вопрос вообще даже никак не затрагивался. Хотя автор утверждает что там всё чики-пуки и "поциент не умрет", но никакого реального подтверждения этому нет. Поскольку инструментарий языка - "top secret", "большая страшная тайна", то и проверить ничего нельзя. Есть только голословные утверждения автора, что "на языке Си поциент точно умрет".
AQ29 писал(а): Чт авг 20, 2026 13:27:39
Adrift писал(а): Вс авг 16, 2026 13:34:37 Эзапрещается ли у вас использование не инициализированных переменных? Забыл программист переменную инициализировать, ...
Зачем в ЯВУ сделано возможность работы с необъявленными переменными - непонятно.
Здесь при наборе текста необъявленная переменная и номер строки красится в красный цвет, при компиляции появляется запись в таблице ошибок, hex-файл не создаётся.
Так что необъявленная переменная не пройдёт.
Вас, AQ29, спрашивают не про объявление переменной, а про её инициализацию, то есть, присвоение переменной конкретного значения перед использованием в выражениях. Не секрет, что в железе ОЗУ после сброса содержит случайные значения. И если сделать:

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

int a;    // просто объявление переменной без присваивания ей определенного значения
if(a > 10) { } // если эта переменная больше 10, то...
В этом случае программа может работать случайным образом от запуска к запуску. Об этом компилятор и предупреждает при компиляции.
Однако, в языке С/С++, если переменная объявлена в глобальной области видимости, то при компиляции она попадает в секцию .bss и обнуляется стартовым кодом инициализации.
Adrift спрашивал как раз именно про такое поведение неинициализованной переменной, есть ли у AQ29 какая-то защита при компиляции от использования переменной с неопределенным значением.
Мучитель микросхем
Сообщения: 407
Зарегистрирован: Чт май 07, 2026 00:30:38

Сообщение Zapolyarny »

Rapra писал(а): Пт авг 21, 2026 03:08:12 То есть, можно сказать, что Rust - отзеркалированный, разломанный и криво пересобранный С/С++.
Любопытно. У меня нет пока своего мнения о нём, но Ваше очень противоположно тому, что о нём пишут официально. Спасибо, попробую посмотреть на него с Вашей точки зрения, насколько мне хватит мозгов.
---
Мне несколько непонятно, почему решение проблем должно приводить к новому синтаксису. Это кошмар. Предположим, что Rust - идеален, благодаря безопасности, обеспечиваемой на уровне компиляции. Ну и оставили бы синтаксис С, расширив его, если необходимо, или просто оставив зарезервированным более неиспользуемое. А внутри компилятора творили бы всё, что хочется... :dont_know:
Последний раз редактировалось Zapolyarny Пт авг 21, 2026 12:44:38, всего редактировалось 2 раза.
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Сообщения: 593
Зарегистрирован: Вт окт 01, 2024 15:22:33

Сообщение Adrift »

Rapra писал(а): Пт авг 21, 2026 03:08:12Adrift спрашивал как раз именно про такое поведение неинициализованной переменной, есть ли у AQ29 какая-то защита при компиляции от использования переменной с неопределенным значением.
Я больше про всякие MISRA C/C++ говорил, где запрещается использование не инициализированных переменных.

ps. Году так в 2000-м, когда только первые флешевые мк появляться начали, писал я подобный гибридный C+asm компилятор, но для PIC. Последние исходники которые нашел датированы 2004 годом, т.е. больше 20 лет назад я уже посчитал данное направление бесперспективным и пересел на С. И это когда у мк было пару KB флеша всего, компиляторы были несравнимо хуже сегодняшних и аппаратных отладчиков у любителей практически не было, потому было не важно, что моя поделка эту отладку не поддерживала. Но правда у меня в начале 90-х был спектрум и, естественно, я знал бейсик и z80 ассм, но также уже были книги по C, паскалю, аде и форту. А если ничего кроме бейсика и ассма не интересно, то и получаются ситуации когда до последнего держаться за давно устаревшие макро ассемблеры...
Реклама
Вымогатель припоя
Сообщения: 690
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

Zapolyarny писал(а): Пт авг 21, 2026 09:20:42 Любопытно. У меня нет пока своего мнения о нём, но Ваше очень противоположно тому, что о нём пишут официально.
Так получилось, что я познакомился с Rust уже после того, как изучил C++. Поэтому я рассматривал Rust через призму C++. Хотя конечно, для тех, кто переходит с чистого Си на Rust, он кажется чем-то волшебным и удивительным. В целом то да, по сравнению с чистым Си есть немало интересных моментов. Например те же трейты (аналоги виртуальных методов С++) дают интересные фичи. Из С++ взяты области видимости (названо это модулями), что позволяет разделить пространство имен функций и переменных. В чистом Си с этим проблематично. Так же из С++ взяли шаблоны, constexpr-ы (переназвали их макросами), контейнеры (векторы, очереди, списки и тд), сделали аналог try-catch (обработка ошибок). Ну и прочее там. За основу взят С++, разломан, перевернут и пересобран с другими именами и синтаксисом, который частично был надерган из других языков. Например, в циклах и условиях убрали скобки, а малопонятное сишное for(i = 0; i < 10; i++) , которое кстати не шибко то удобопечатаемое пальцами, заменили на словесное описание диапазона.
В части безопасности - это тоже весьма относительно. Поскольку обойти ограничения - можно, нужно только написать "волшебное слово" - и тут же появляются и приведения типов, и небезопасные операции.
В С++ тоже есть некоторая защита от дурака, которая точно так же обходится "волшебными словами".
А если сделать язык со слишком сильной защитой, то на нем нельзя будет решать некоторые специфические задачи, которые нередко встречаются в микроконтроллерах.
Чистый Си имеет наименьшую защиту от дурака. Хуже его только ассемблер (и макроассемблер), в котором можно вообще всё что угодно наворотить. Именно поэтому творение AQ29 я считаю наиболее опасным с точки зрения возможных ошибок при написании кода.

Поэтому, повторюсь, для человека, переходящего с чистого Си, Rust действительно даст вау-эффект. А для того, кто уже знал С++, уже не все так радостно будет. В одном месте - улучшения, в другом - ухудшение.
Что касается зеркального изменения синтаксиса, ну эт чисто маркетинговый ход, как мне кажется. Чтоб подчеркнуть свое отличие от С/С++ и создать впечатление чего-то принципиально нового. В целом, кому как, люди то все разные, кому-то быть может и хочется принципиально непохожего. В основном, так бывает по молодости, когда ищешь что-то, исследуешь. С возрастом это проходит и предпочитаешь проверенный инструмент.
Adrift писал(а): Пт авг 21, 2026 09:25:26 Я больше про всякие MISRA C/C++ говорил, где запрещается использование не инициализированных переменных.
Так компилятор в целом то и так предупредит, если с неинициализованной переменной попытаться проделать что-то, кроме присваивания ей значения. В настройках парсинга ошибок можно переключить с предупреждения ("горчичник") на ошибку ("красная карточка")
Реклама
Вымогатель припоя
Сообщения: 593
Зарегистрирован: Вт окт 01, 2024 15:22:33

Сообщение Adrift »

Rapra писал(а): Пт авг 21, 2026 10:18:16Так компилятор в целом то и так предупредит, если с неинициализованной переменной попытаться проделать что-то, кроме присваивания ей значения.
По умолчанию в gcc, без -Wall, даже предупреждения не будет.
Встал на лапы
Аватара пользователя
Сообщения: 85
Зарегистрирован: Ср дек 06, 2023 23:51:29
Откуда: 48

Сообщение Нефертити »

Заранее прошу меня простить, если кого-то задену, но.
Кмк, нет никакой разницы, на каком ЯВУ, "или высокоуровневом макроассемблере" вы пытаетесь сочинять, спорить и абстрагироваться.
LLM даже на десктопе выполняет поставленные задачи вполне качественно и без нытья.
Погромисты сами себя убили.
Относись к людям так, как хочешь, чтобы они относились к тебе.
Вымогатель припоя
Сообщения: 690
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

"Погромисты" - да.
Однако, как думаете, кто придумал основы LLM? Тоже "погромисты"? :)
В принципе, использование ИИ-ботов для генерации программного кода - так себе затея, по крайней мере по состоянию на сегодняшний день. Да, он генерирует код. Но малограмотный "погромист" всё равно не может понять, насколько правильно он сгенерирован. Отсюда и уверенность, что ИИ-бот сделает за них всё правильно. Да нет, в лучшем случае он замаскирует ошибки так, что "погромист" и не поймет.

Лично я от любопытства тоже прибегал к помощи ИИ-ботов. И понял, что ИИ-бот может даже водить по кругу. Типа, ты ему указываешь, что вот здесь он допустил ошибку и на деле код не работает как надо. Бот такой "ах да, простите, я ошибся, вот правильный вариант". И снова с ошибкой. И так несколько раз, пока снова не приходит к первому варианту. Или же ты ему пишешь свой, правильно работающий вариант, а бот "ой-ой, простите, я ввел вас в заблуждение, вы совершенно правы, ваш вариант является абсолютно верным и показывает высокую вашу квалификацию" :) Вот и проси после этого ИИ-бот написать код.
Ответить

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