Что лучше выбрать для программирования микроконтроллеров C или Assembler?

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

Какой ЯП лучше подойдет под эту цель: C, Assembler или какой-то другой?


Ответы (2 шт):

Автор решения: Kpekep_o

Дело в том что конкретно в вашем случае всё просто вопрос в быстродействии, в идеале С+Ассемблер в критически важных местах. Asm или C - оба довольно близки к железу. К примеру я поступил следующим образом. Накупил на алиэкспрессе горсть Attiny13a, рассыпуху, раздичных переключателей, мелочевки, светодиодов, макетных плат, несколько AVRASP почему attiny13a? потому что проще некуда, простенькая в освоении, дешевая. И начал буквально с азов, с понимания что такое p-n переход, как устроенны микросхемы, процессоры, начал с железа. Изучил датащит тини13 от корки до корки, там и англ парралельно подтягивал, что вобщем то нужное в нашем деле. Ну и поскольку я так дотошно начал со всем разбираться, было решено так же поступить и с языком, было решено учить asm. В целом, нужно понимать, что современные языки всё выше и выше, всё дальше от железа, AVR что уж там греха таить, постепенно отходят уступая место STM32. Поэтому мне хотелось отдать дань уважения 8 битным уходящим в закат AVR и понять суть, философию работы блоков, регистров, портов, интерефейсов на уровне железа, то как это взаимодействует между собой. Это потрясающе, завараживает, в каком то смысле это словно магия, волшебство, потрясающе осознавать что на таком крохотном кристалике столько разных блоков, которые взаиможействуют между собой, а ты будто волшеблик пишешь заклинание(код). И ASM как нельзя к стати даёт прочувствовать как же всё устроено, как всё работает. На ASM вы буквально за ручку водите микроконтроллер от команды к команде, от порта к регистру, от трегистра к стеку, вы знаете что происходит в каждом такте, полный контроль, люблю контроль. К тому же это не так уж и сложно, даже напротив - ASM довольно таки интересен. Советую очень хорошую книгу для начинающих, написанную очень доступно и понятно (Мортон Д. - Микроконтроллеры AVR. Вводный курс). Что уж там греха таить, по началу спалил и залочил не правильными фьюзами пару тройку камней, но это attiny13a, при его стоимости не так жалко. Ну а потом начал учить С, к слову в процессе изучения. В идеале это С код, но в моментах где нужно очень ответственно проследить выполнение того или иного участка, там где нужна 100% контроль, безотказность, надежность, вот там очень камельфо делать ассемблерные вставки. Если говорить о скорости, то она вобщем то одинаковая, с поправкой на ветер в пользу ASM который естественно на чуточку где то там будет и быстрей. ОДНАКО! если говорить о читаемости, скорости разработки, хоть какой то там переносимости, то тут С конечно же впереди. Вы конечно же можете не занудничать как я, к примеру возьмите сразу мегу328, изучите asm хотя бы поверхностно, да бы понять суть, философию, хотя бы светодиодиком поморгайте по крассике, напишите свой delay, как фообще та задержка то формируется разберитесь))), это очень интересно, это вам не delay(1000); В любом случае, на сколько я понял вас не устроила ардуина, это радует, это уже отлично, на верном пути, а C или ASM это уже другой вопрос, и как по мне кодить удобней, читабельней и комфортней на С, но когда нужно пройти ооочень важный момент - делаем ассемблерную вставочку. Удачи!

→ Ссылка
Автор решения: gbg

Индустриальный вариант - использование сочетания C/asm в общей связке. Для тех участков кода, где время критично, можно выкатить дизассемблер горячего места и посмотреть, что там наворотил компилятор.

Альтернативно, можно вставить в программу кусок чисто в асм.

Однако, такая эквилибристика между языками потребует отличного знания как стандарта языка C и опций компилятора, так и ассемблера - вместо поиска одной проблемы, у вас будет сразу две - в C и в asm.

Так что если ваше C-кунгфу еще недостаточно сильно, выбросьте его из уравнения и сосредоточьтесь на ассемблере, благо у AVR аритектура прямолинейна и дубова.

Важно также понимать, что на процессорах без SIMD, кэшей, конвейеров, и прочих наворотов взрослых Пентиумов и Core, написание на ассемблере дает возможность получить код с предсказуемым и гарантированным временем исполнения - можно просто посчитать машинные инструкции и свериться с табличкой в даташите под названием "Количество тактов, потребное для выполнения инструкций"

→ Ссылка