Все зависит от того, чего вы хотите достичь. Если речь идет о программировании микроконтроллеров, то стандартный набор эмбеддера сейчас - это си и ассемблер. Я считаю, что нужно начать с простого ассемблера, к примеру, для AVR. И недолго задерживаясь на ассемблере перейти на си.
Писать на ассемблере можно в AvrStudio. Курсов по ассемблеру
полно в сети.
На ассемблере достаточно написать пару простых программ, чтобы понимать, что обращение к многобайтовой переменной - операция не атомарная, зачем нужны регистры, итп.
Дальше стоит перейти на си. Тут все не сильно отличается от компьютерного программирования. Классическая книга по программированию на си -
Керниган и Ритчи "язык С". Я уверен, что это - не лучшая книга. Но посоветовать ничего другого не могу, так как сам учился по ней. Программировать для начала лучше не для контроллера, а для компьютера - там цикл написал - попробовал быстрее.
Когда вы станете хорошо разговаривать на си (на этом этапе вы уже практически забудете ассемблер, но основные положения в голове останутся), можно посмотреть на С++. Реально на нем программировать для контроллеров сложно, но он очень способствует развитию мозга и дает возможность читать литературу о проектировании программ (которая изобилует терминами из объектно-ориентированного программирования).
Ну, и естественно - практика и еще раз практика.