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 подписчиков

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

@yh.853aaa, есть вопрос – хочется оценить возможность разработки устройства. Как с вами связаться электропочтой, например?

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

w5277c@gmail.com пишите, буду рад уделить Вам внимание.

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

Дак вы пример протокола приведите. Лично я такой не встречал.
STM как пример, это может быть, например, PIC или MSP. А смена используемого МК не редкость, а тем более повторное использование кода в другом проекте.

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

Ладно хорошо, что насчет программной реализации сетевых уровней CAN?

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

Ну так я про неё и написал. Но это не официальные библиотеки от AVR, на сколько знаю.

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

Коенчно, это жуткое поделие которое я никогда не возьму в свой инструментарий.

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

ТС, не обижайся, но ты некромант, мое уважение)

На самом деле пиши на чем нравится, главное не бросай.

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

Я не обижаюсь, я просто исхожу из задачи и выбираю оптимальное решение, и не обращаю внимание на стадо. Только не обижайтесь пожалуйста :)

показать ответы
1
Автор поста оценил этот комментарий
А почему не купите готовый модуль? Скиньте примеры,что вы уже успели сделать
раскрыть ветку (1)
Автор поста оценил этот комментарий

Модуль чего? Почитайте мои посты, там есть немного инфы.

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

На того кто посмел критиковать ваше творение ))

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

А при чем тут мое творение? Вы же ассемблер критикуете? Забыли? Так я Вам напомню.


Нет, все, какого хрена я трачу на Вас время. Еще хоть один комментарий уровня ученика ПТУ и идете в игнор лист.

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

)) Дак я и не скрывал, что почти ничего самому делать не пришлось, это и есть достоинство arduino. А вы то накой после этого со своим ассемблером полезли? Что пытались доказать/показать?

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

Вы не слышите меня да. Ну и ладно. Я думаю мы закончили.


Ваш посыл - взял все готовое и я крутой за час все сделал. Услышан но не одобрен.

1) Вы взяли говно библиотеки, ни один нормальный разработчик не будет на них писать свой софт и мы в равных условиях, разница только в том, что вы считаете нормальным писать говно софт, а я нет.

2) Вы не верно выбрали ЯП, это уже не дает вести конструктивную беседу


Исправте хотябы одну из двух ошбок в своем ТЗ и мы окажемся на равных.

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

Понятия не имею. Что с ними?.
Посмотрите библиотеку V-USB, хороший пример связки С и ассемблера.

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

Ну Вы же пример просили привести. Вот, пожалуйтса.


И вообще мы играем в какую-то странную игру, вы ставите мне условие котрые максимально удобны для вас. А чем Вам в принципе не угодили интерфейсы? Ситуация где нужно считать такты как раз часто встречается как раз в программной реализации интерфейсов типа SPI, UART, USB, CAN. Именно здесь и есть преимущество ассемлера.

И потом протокол - это набор соглашений интерфейса логического уровня. Подобные соглагения используются как минимум в UART, USB и CAN.

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

Дак вы так и не ответили, сколько времени у вас уйдет на реализацию приведенного мной примера,  да еще и учитывая что библиотеки вы нарабатываете сам? Плакать от унижения, на сколько я понимаю, мне уже точно не придется?

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

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


Более того, я Вам сказал, такой проект неразумно писать ни на асме ни на си.

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

Сделаете? Всего же час работы, зато размажете меня по стенке и я буду плакать и рыдать от унижения.

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

Заодно, чтобы было у Вас понимание:

Вот библиотека ESP8266(AT mode)

https://github.com/w5277c/core5277/blob/master/core/drivers/...


Вот библиотека семисегментного индикатора

https://github.com/w5277c/core5277/blob/master/core/drivers/...


Не хватает только их немного актуализирвоать и написать еще библиотеку NTP.


Так что был бы этот разговор немного в будущем, Вы бы могли знатно пролететь со своим примером.

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

Сделаете? Всего же час работы, зато размажете меня по стенке и я буду плакать и рыдать от унижения.

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

Не вопрос, давайте АСМ библиотеки или напишем проект оба с нуля, без библиотек?

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

UART - это интерфейс, а не протокол. То же самое касается SPI.

Необходимость ОС в AVR, на мой взгляд, вообще под большим вопросом, ни разу не встречал необходимость в ней. Но, например, FreeRTOS может работать и на Mega.

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

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


Необходимость - это уже другой вопрос, я например не вижу необходимости переноса проектов с AVR на STM.

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

Простой пример. Время на купленных часах постоянно убегало. Мне надоело переводить. Выкинул начинку. Поставил arduino. Проект с подключением по WiFi к домашней сети и синхронизацией времени с NTP сервера занял около часа. За сколько времени вы сможете сделать то же самое на ассемблере самостоятельно?

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

Простой ответ. Библиотеки Wi-Fi сами писали или где-то взяли? NTP библиотеки сами писали или где-то взяли? При наличии данных библиотек на асме - где-то час.


А в Вашем случае я бы вообще писал бы на микро питоне, уложился бы в 5-10 минут. Вы же вероятно ESP ипользуете. Как Вам такой расклад?

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

Основной код программы это работа с периферией? Это ножкой подрыгать или таймер запустить?
Вы пошутили? Или действительно верите, что перенести проект, например, с AVR на STM32, будет одинаково по сложности в случае ассемблера и С?
В каком протоколе необходима выдержка конкретного количества тактов?

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

Да, работы с переферией, UART, 1Wire, GPIO, таймеры и т.п. прсото сделано все по уму, без кишков наружу.

Да, хороший большой проект будет очень сложно перенести с AVR на STM32(не важно си это или ассемблер), а c STM32 на AVR скорее всего вообще невозможно. Более того, я такую процедуру делал, частично перенес свою ос на STM32.


:D Попробуйте сами перенести именно реалтайм ОС(а не программу ее использующую) с AVR на STM32.


Напрмер, с программнй реализацией UART на больших баудрейтах ;) или некоторые реализации железа на SPI

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

Одно из преимуществ С/С++ как раз в том, что код можно собрать на "любой" платформе и пользоваться им, например, алгоритмы или протоколы связи. При этом у вас имеется множество механизмов для отладки и тестирования кода.

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

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

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


Да, с AVR сдесь отличий мало, тем не менее работы с указателями, как бы многим не казалась, ее нет в асемблере - есть незамутненая, элементарная работа с памятью. Здесь конечно лучше говорить предметно, но мне сложно будет прямо сейчас подобрать примеры. Может быть потом.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ну да, бабы - они такие

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

Мой посыл был - arduino это свой мир. Но у вас видимо у вас глаза кровью налились.

Часики уже года полтора работают, а ваши никогда не появятся на свет. Что же лучше ))?

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

Ну если вас будут говном постоянно тыкать выдавая это за эскимо, Ваши глаза тоже будут не очень. Мои, да Вы смеетесь, у меня уже похоже больше сотни разных устройств. Часики - это так сыну в лет 10 поиграться в конструктор.


Боже, на кого я трачу время.

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

Я для arduino нашел и сделал все за час, и обозначил это как преимущество использования перед самописным кодом. Вы же влезли с примером на ассемблере. Дак что вам мешает сделать то же самое используя свой подход?

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

Библиотеки, я Вам уже сказал. Вы кичитесь чужим трудом считая это преимуществом. Я же эти юиблиотеки нарабатываю сам, для таких как Вы.


И главное, в рамках моих проектов 99% кода уже наработано. Мне не нужно писать моного нового кода.


А Ваш пример я бы никогда и не стал писать на Си, как я уже говорил. Такие проекты я бы стал писать на SoC на языках боле высокого уровня. Где Си сильно уступает.


Более того, зная качество библиотек в ардуино я бы нивкакую не ста писать серьезный прект на их базе - пришлось бы реализовывать самому.


Ваш пример хорош только как сделать тяп ляп на быструю руку, о чем я тоже писал. Что в данном случае поступил бы также как Вы. Но мне такая разработка не по душе.

показать ответы
1
Автор поста оценил этот комментарий
"Проект, который можно применить" как я понимаю в стадию масс-продакшена еще не вышел и автор работает над ним в одиночку? Тогда да, можно и на ассемблере)
раскрыть ветку (1)
Автор поста оценил этот комментарий

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

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

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

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

Вот процедура на асме инициализации работы одного из моих устройств:


;Инициализация ядра

MCALL C5_INIT

MCALL SETTINGS_LOAD
MCALL RELAY_UPDATE_STATES


;Инициализация ADC
LDI PID,PID_ADC_DRV
LDI_Z DRV_ADC_INIT
LDI ACCUM,TID_ADC
MCALL C5_CREATE


;Инициализация драйвера BUS UART(аппаратный)
LDI PID,PID_IN_UART_DRV
LDI_Z DRV_UART_H_INIT
LDI TEMP_H,BUS_DR_PORT
LDI TEMP_L,0xff
LDI TEMP_EH,TID_IN_UART
LDI FLAGS,(1<<DRV_UART_OPT_MAGIC)
LDI TEMP_EL,DRV_UART_H_BAUDRATE_19200
MCALL C5_CREATE


;Инициализация драйвера BUS5277
LDI PID,PID_IN_BUS5277_DRV
LDI_Z DRV_BUS5277_INIT
LDS TEMP_H,C5_BUFFER+MSETS_OFFSET+MSET_BUS_ADDR
LDI TEMP_L,TID_EXTRASCAN_T
LDI ACCUM,PID_IN_UART_DRV
LDI FLAGS,(0<<DRV_BUS5277_FLAG_LOGGING)
MCALL C5_CREATE


;Инициализация задачи
LDI PID,PID_MASTER
LDI_Z MASTER_INIT
MCALL C5_CREATE


;Инициализация задачи
LDI PID,PID_RELAY
LDI_Z RELAY_INIT
MCALL C5_CREATE


;Инициализация задачи
LDI PID,PID_SENSORS
LDI_Z SENSORS_TASK_INIT
LDI TEMP_H,BYTE3(5000/2)
LDI TEMP_L,BYTE2(5000/2)
LDI TEMP,BYTE1(5000/2)
MCALL C5_CREATE


;Инициализация драйвера BUTTONS
LDI PID,PID_BUTTONS_DRV
LDI_Z DRV_BUTTONS_INIT
LDI ACCUM,TID_BUTTONS
MCALL C5_CREATE


;Инициализация задачи
LDI PID,PID_BUTTON
LDI_Z BUTTON_INIT
MCALL C5_CREATE

LDS TEMP,C5_BUFFER+ESETS_OFFSET+ESET_PM
CPI TEMP,PM_DS18B20
BRNE _MAIN__DONE


;Включаем подтяжку
LDI ACCUM,DS18B20_RES
MCALL PORT_MODE_OUT
MCALL PORT_SET_HI


;Инициализация 1wire
LDI PID,PID_1WIRE_DRV
LDI_Z DRV_1WIRE_INIT
LDI ACCUM,INPUT_PORT
MCALL C5_CREATE


;Инициализация DS18B20
LDI PID,PID_DHT_DRV
LDI_Z DRV_DS18B20_INIT
LDI ACCUM,PID_1WIRE_DRV
MCALL C5_CREATE


Она что на Си, что на асме, будет приблизительно одинаковая. По моему все не плохо читается, все параметры достаочно понятно описаны в драйверах. Время тратится практически одинаковое.

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

Уже есть?

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

(чур меня)


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

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

Ну как нету, а в ардуино что пишут? Явно не с регистрами играются.

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

Кому? Кто спросил?

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

Простите, Вам отчет предоставить? Почитайте мои посты и комментарии к ним.

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

Остановись!!! От такого ЧСВ у меня ворота выперло блядь!! До осени теперь ждать чтобы заварить. Лучше давай делись литературой или сам напиши что нибудь чтобы быстрее новичку понять stm32. Я бы почитал. Ибо блин видеоуроки сводятся только к тому чтобы светодиодом помигать и всё. Ни тебе пример использования SPI ни как пользоваться UART нормально и самое главное, как это отображать в коде!!

Так шо, нехуй мне ворота ломать, давай пиши и рассказывай как всё устроено.

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

А где здесь ЧСВ? Вроде все конкретно, по фактам. А накуя мне что-то писать? Ну ок, изучи мои труды core5277, осилишь? Сможешь достигнуть первой ступени прозрения, подаван? Тогда поговорим о элементарном.

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

Прощаю, жду отчёт.

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

Мне не трудно, полез и добавил в игнр лист.

показать ответы
5
Автор поста оценил этот комментарий
Что хотели и кому?
раскрыть ветку (1)
Автор поста оценил этот комментарий

Хотел ответить на вопросы в комментариях, которые мне задали в других постах.

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

убрал

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

Щас в комментах начнется :D Убрать?

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

Я, я, я, я

ЧСВ размером с дом. Умный дом.

Что хотел донести, кроме самолюбования? Пост начинается про одно, перетекает в другое, заканчивается третьим

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

В посте я отвечаю, почему я пишу на ассемблере. Поэтому здесь много я. Причем тут ЧСВ, мне о дяде писать, когда спрашивают меня?

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

Я, я, я, я

ЧСВ размером с дом. Умный дом.

Что хотел донести, кроме самолюбования? Пост начинается про одно, перетекает в другое, заканчивается третьим

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

Что хотел, то и сказал. Читать умеете?

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

тс, тебя кто обидел?

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

например, тычащие мне незнакомые люди. А вообще многие, кому я разрыв шаблона устраиваю.

показать ответы