Assembler и C в рамках маломощных микроконтроллеров

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

И есть линейка своих собственных исполнительных устройств, модулей, датчиков и т.п. реализованных на AVR(в основном это ATmega168).

При этом данная линейка - это хобби, ее я реализую для себя и вкладываю туда функционал нужный мне, и пишу соответственно на том, что нравится мне. А не Вам, и не ради моды.

Меня часто спрашивают, почему я пишу прошивки для AVR микроконтроллеров на ассемблере.

Часто слышу стереотипы - ассемблер никому не нужен, очень сложный, нет переносимости, большие трудозатраты. И даже такие, как - на нем никто не пишет и Вы не должны, в общем я кому-то, получается, что-то должен.

Первое и пожалуй главное - ничто не научит работать с периферией лучше, чем кодинг на ассемблере.

Я применяю МК по прямому назначению - работа с периферией, если мне потребуется рисовать UI или считать математику я буду смотреть в сторону SoC или вообще в сторону микрокомпьютеров типа всяческих PI, где буду использовать более подходящий высокоуровневый язык чем Си.

Кстати по этой причине мне не особо интересны STM микроконтроллеры.

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

Более того, у вас буквально ассемблер с несколькими десятками команд, чистая периферия МК и все, ничего лишнего. Вам не нужно знать третье звено - как работает компилятор! А в Си Вам придется с ним разбираться, если конечно вы не пишете студенческую работу и ограничены в ресурсах МК.

Третье, как вообще можно отлаживать даже программу на Си для МК, не зная ассемблера? Как можно написать оптимальный бутлоадер не зная ассемблера? Как посчитать такты в критических по времени местах? Как на 512 байт ОЗУ контролировать ресурсы(тот-же stack) в крупном проекте? Да никак, поэтому вы все на Си и на STM где больше ресурсов. Потому что тупо не можете. А я вот например могу на Cortex асме писать код для STM и периферию я их гораздо лучше понял взявшись за асм после Си.

Четвертое - трудозатратно. Не особо, возможно на багфиксинг утечек памяти на Си вы потратите не намного меньше времени, чем я на реализацию на асме. Здесь ключевое - наработки - сообщество Си наработало огромный пласт кода, и вы не задумываясь его используете считая свой код основными трудозатратами. При этом говоря про асм все почему-то думают о пустом листе, на котором все, все, все нужно писать с нуля. С чего бы? Переносимость? Об этом ниже. На асм можно точно также наработать(и это было ранее) все теже функции, что и вы используете в Си. Но нет, популяризация Си свела на нет наработки на асм.

Пятое - переносимость кода, да это главный минус в асм. Однако умение строить алгоритмы существенно снижает трудозатраты. Так же как и разделение кода на уровни. Я лично наработал операционку с кучей функций, я не пишу математику и другие процедуры с нуля, я их просто подключаю и вызываю также как это делаете вы в Си. Более того, мой код(особенно код верхнего уровня) без проблем переносится между МК семейства AVR. И потом, как вы вообще представляете перенос сложной программы на Си с AVR скажем на STM, да никак. Где ваша хваленая переносимость Си?

Если мне нужно что-то по быстрому накидать для периферии - я возьму микрокомпьютер и за минуты накидаю на Java то, на что вы потратите в несколкьо раз больше времени на Си.

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

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

Я не вижу по большей части где и для чего использовать Си. Это просто мода.

Даже используя ESP я предпочту микро питон, а не все эти глючные библиотеки HAL написанные на си, хотя наверное вы привыкли и не замечаете какой откровенно плохой код вы используете.

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

Умный дом

214 постов2.5K подписчиков

Вы смотрите срез комментариев. Показать все
2
Автор поста оценил этот комментарий

Первое и пожалуй главное - ничто не научит работать с периферией лучше, чем кодинг на ассемблере.

Тут полностью соглашусь

Второе - ассемблер не сложный

А вот тут с вами играет злую шутку архитектура. Это AVR. Всё потому, что архитектура простая как валенок (чем и крута) и ассемблер там как бейсик. То есть утверждение верно только для AVR8 и только для простых проектов.

При этом данная линейка - это хобби, ее я реализую для себя и вкладываю туда функционал нужный мне, и пишу соответственно на том, что нравится мне. А не Вам, и не ради моды.

А вот это главное - пишите на чём хотите, никого это не волнует по большому счёту. Пока за коммерческий проект не возмётесь. Хоть сразу бинари на клаве с двумя кнопками.

раскрыть ветку (30)
1
Автор поста оценил этот комментарий

В коммерческом продукте и не такое можно встретить. Устроившись в свое время на работу, первое что мне пришлось делать - восстанавливать схемы печатных плат. Разработчик накидывал посадочные места и соединял их без "лишней" суеты ))
А чем работа с периферией отличается в случае ассемблера и С/С++? И там и там работа ведется через запись/чтение регистров.

раскрыть ветку (28)
0
Автор поста оценил этот комментарий

И там и там работа ведется через запись/чтение регистров.

Или путём подключения библиотеки, разработчики которой за тебя с ними поработали. Это удобно, но для понимания сути лучше таки регистры подёргать.

раскрыть ветку (27)
1
Автор поста оценил этот комментарий

Кто мешает работать с регистрами напрямую? Когда начинал работать с AVR ничего подобного HAL STM32 не было, по крайней мере не встречал. Сейчас он уже тоже из коробки идет?

раскрыть ветку (26)
0
Автор поста оценил этот комментарий

Уже есть?

Уже гораздо навороченней есть - ардуина! :)

(чур меня)


зы: на счёт официального HAL на avr8 не в курсе, давно от дел отошел. Но самописных проектов было вагон.

раскрыть ветку (21)
1
Автор поста оценил этот комментарий

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

ещё комментарии
ещё комментарии
Автор поста оценил этот комментарий

Мешает засилие примеров и документации реализованых на готовых библиотеках Си прячущих полность работу с регистрами.

раскрыть ветку (3)
0
Автор поста оценил этот комментарий

Набираю в поисковике "помигать светодиодом AVR" или "запустить таймер AVR", встречаю примеры работы с регистрами на Си, редко Asm. Готовые функции чего-то не попадаются.

раскрыть ветку (2)
Автор поста оценил этот комментарий

А еще проще пример слабо?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Пиши: avr прерывания

Автор поста оценил этот комментарий

Спасибо за поддержку. Но я не плохо знаю(точнее знал, давно не писал) архитектуру Cortex(STM) и раскрылась мне она хорошо именно на ассемблере, хотя ассемблер там, скажем так, не приятен, он создан для компиляторов на мой взгляд. Так что речь не только про AVR, а до AVR был Z80.

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку