Страница 1 из 1

Си и ассемблер для AVR

Добавлено: 16 мар 2022, 13:53
w5277c
Это моя первая тема на данном форуме. Как раз послужит испытательным полигоном.

Еще в прошлом веке мой Учитель БКВ знакомясь с новым потоком студентов 1-го кусра 2-го семестра предложил нам на выбор два основных языка, на котором мы должны будем работать все остальные годы обучения.
Он предложил Си и Паскаль обрисовав общие их достоинства.
Весь поток почти в полном составе проголосовал за Си...
Я не хочу сказать плохо о своем Учителе, но тогда он нас знатно протролил.
Конечно же в наших же интересах, потому что, с учетом всех факторов сложившейся ситуации, Си был лучшим выбором среди всех других языков.
Т.е. по сути, никакого выбора он нам не давал. Я бы тогда предпочел ассемблер, но все равно вынужден был бы изучать Си, а еще Си плюс плюс и как минимум Джава.

И это правильно. Должен быть один универсальный язык. Он должен быть достаточно гибким с большими возможностями, он должен объединять людей создавая крупные сообщества, которые создали и создадут кучу кода. Ведь 'программист должен быть ленивым'.

Но я, к сожалению, от своего Учителя не услышал в чем именно он должен быть ленивым? Т.е. использовать чужой код не создавая свой велосипед? Или наоборот, использовать свой код и не тратить кучу сил и времени на чужие поделия? А что если мне получится создать всем велосипедам велосипед?

И так, судя по сказанному, я имею богатый опыт программирования на Си. Для многих он стал первым и основным языком разработки ПО. Но не для меня, для меня первым был ассемблер на Z80(ну после BASIC'а конечно). Спустя многоие годы практики я вернулся к Ассемблеру в рамках AVR и это было просто волшебно.

У меня даже как-то был спор с современными поклонниками ZX Spectrum. На котором основные профессиональные и сложные программы были разработаны именно на ассемблере. Эти любители Си и Speccy утверждали, что даже в ассемблере есть указатели(которые я так не люблю в Си). Черт, я не понимаю, почему вдруг IX и IY - index registers у них вдруг стали указателями(pointers).
В общем пообщавшись с соврменным сообществом Speccy я сделал два вывода: 1) Они любят Си(который достаточно тяжел для Speccy). 2)Speccy 4rever всеже умер, к моему сожалению.

Теперь к сути.

Да Си имеет множество преимуществ, но также он имеет кучу недостатков, и лишь фанатики могут замечать первое и не видеть второго.
Прошу следующие утверждения рассматривать в рамках железа AVR и задач в рамках этого железа и не более того.
Если Вы не имели опыта работы с данными микроконтроллерами и не создавали проекты на Си и Ассемблере, то прошу Вас удержаться от высказываний в виде утвержений. Просто потому, что утверждения от дилетанта всегда выглядят глупо.

Какие плюсы я вижу в Си:
1) Огромное сообщество и обгромные наработки кода - это позволяет достаточно легко найти необходимую библиотеку или пример и даже часто применить ее используя банальный copy-paste. В том числе достаточно легко найти того, кто будет знать твой язык и сможет оказать тебе помощь.
2) Готовые стандартные библиотеки проверенные годами и кучей программистов, работа со строками, массивами, математика и прочее.
3) Компактный синтаксис, на первых парах близкий к обычному английскому.
4) Мультиплатформенность - как минимум один и тот-же код(конечно если это Hello World) можно скомпилировать для многих разных МК.

Плюсы ассемблера:
1) Дебаг ког в код - при деаге Вы будете видеть ровно то, что написали, ведь в Си вместо Си кода вы будете видеть ассемблер.
2) Полный контроль ресурсов - именно Вы и Ваш код будет распоряжаться микроскопическими ресурсами МК(без влияния компиляторов)
3) Оптимизация - именно Вы строите модель выполнения кода и сами решаете где и какую оптимизацию применить(вместо порой очень глупого компилятора)
4) Прямое взаимодействие с ресурсами МК(регистрами периферии) без лишних прослоек - ведь основная работа с МК сводится к работе с периферией, а низкоуровневая реализация перифериии лучше всего интегрируется именно с ассемблером.
5) Вам не нужно ломать голову и понимать чьи-то стереотипы(пусть и очень популярные), которые могут попросту не соответсвовать Вашему процессу мышления, Вы можете кодить так как Вы себе это видите. К примеру вопрос с теми -же указателями о которых я поговорю позже. Вопрос стандартизации я также постараюсь рассмотреть ниже.
6) Возможность контроллировать расход ресурсов - ОЗУ, ПЗУ, ППЗУ в том чсиле считать такты процессора - что крайне важно для AVR.

Частые ложные утверждения :
1) У Си есть библиотеки - на ассемблере также можно использовать библиотеки как и на Си. Использование библиотек в Си не дает никакого преимущества перед Ассемблером.
2) Скорость разработки ПО - код в текстовом виде на Си более компактен, но разве основаня задача разработчика это скорость написания текста? Мы тратим огромное количество времени на реализацию фундамента решения, его каркаса, а не на синтаксис. Порой проект приходится несколько раз начинать с нуля. При этом базовые процедуры не меняются.
3) Си прост к понимаю - пониманию чего? Вы абстрагируетесь от МК, с которым 95% кода будет связано с его периферией. Вы больше запутаетесь, чем поймете работу с МК.
4) У Си большое сообщество - насколько оно большое для AVR? Практически все проблемы, которые Вам поможет решить сообщетсво будет связано именно с самим Си а не с МК или ассемблером. Остальное придется решать самому.
5) Мультиплатформеннсть Си - для обычного новичка на AVR это действительно так. Но как только Вы серьезно коснетесь периферии, Вы начнете работать с регистрами, работу с которыми нужно будет переписывать для каждого МК отдельно. Hello Word на си для многих МК Вы написать сможете, но не намного больше этого.
6) Код на си легко читаем - пожалуй это самое основное заблужление. И его я рассмотрю более побробно:

Да, простая программа на Си выглядит просто и интуитивно понятно. Пока в ход не вступают приоритеты, струкуры и указатели и другие нововведения в синтаксисе. Это очень хорошо, что у Вас хорошая память и Вы легко запоминаете приоритеты операций - типа сначала умножение и деление, потом сложение и вычитатние, и где-то там(или в начале) операции сдвига, бинарная логика и прочее. Точно хорошо помните? А Вы знаете, что таких проблем в асм'е нет? Там точная зависимоть от порядка выполнения команды. Да, если Вы пишете на одном языке, то для Вас запомнить табличку на всю жизнь не проблема, а если Ваши инстрменты зависят от задачи(как оно и должно быть у профессионала)? Указатели - в ассемблере нет указателей, нет указателей на указатели и указателями погоняющие. Есть просто значение, часто это значение является адресом памяти и на этом жирная точка, все предельно ясно. В Си же в функцию передаюстя какие-то указатели, которые не несут информации о типе данных и их размере - я должен об этом догадываться, либо анализировать весь код. В моих процедурах мне достаточно просто почитать короткую шапку, чтобы понимать с чем я имею дело. А как насчет того, что в ассемблере я работаю с байтами, словами, двойными словами и прочее? Я точно, всегда знаю размер данных. Мне чужды 100500 понятий в Си одних и тех-же примитивов, к примеру char,wchar,byte,int(еще добавим буковку u) - в каком виде мне хранить символ? Да еще так, чтобы я мог использовать стандартные библиотеки! Вы думаете в асме есть такие проблемы с символами?
А с мультиплатформенностью - так это вообще забавно, у меня есть своя ОС на асме, она позволяет использовать один и тот-же код для разных МК.

И пожалуй пока все. Если что, позже продолжу.