Насоветовал тут в фейсбуке кучку книжек по программированию микроконтроллеров:
https://www.facebook.com/tikhonovruslan/posts/2193043937400492
В процессе обратил внимание, что большинство из них — это построенные примерно по одному шаблону учебные курсы, причем совершенно недостаточные в современных условиях. Вот откроем содержание практически любой из них и увидим примерно такой список тем:
- Что такое микроконтроллер? (опционально — что такое ARM, Cortex, STM32 и так далее)
- Устанавливаем среду разработки (без нее вот просто никуда, даже светодиодом не поморгать без Keil)
- Пишем простейшую программу (тут половина читателей отваливается, потому что даже «простейшая» программа требует шаманства в виде настройки тактирования, и идет делать сайты на PHP)
- Работаем с GPIO
- Работаем с таймерами
- Работаем со всякой остальной периферией
- …
- Тема для продвинутых — что такое DMA и как с ним жить
- Тема для очень продвинутых — как в CubeMX накликать в проект FreeRTOS
На этом «стандартный» курс заканчивается — но дальше-то что? Рано или поздно в любом проекте на микроконтроллере “вырастает” несложная RTOS (или присутствует там с самого начала). При этом в литературе «для начинающих» это почему-то считается сложной темой, а книг «для продолжающих» почему-то нет. Вот где почитать, например, о том, как написать драйвер периферии или внешнего устройства? Как и когда использовать DMA? Да вот даже какие-то вопросы с потреблением памяти — покажите мне книжку, где было бы достаточно подробно расписано, что происходит со стеком в многозадачной системе во время обработки прерывания?
В общем, что есть хорошего на эту тему «для продолжающих», с описанием принятых «лучших практик»?
на тему профилирования памяти МК буквально на днях была статья на хабре.
по-моему в 1989 году встречалась мне в библиотеке книжечка именно про написание операционных систем… но я сейчас вряд ли вспомню ее название. :)
> требует шаманства в виде настройки тактирования
Голосом Каа: свистишшшшшшь.
В кубике это делается расстановкой галочек, а не в кубике rcc_clock_setup_in_hse_8mhz_out_48mhz(); или типа того.
> Как и когда использовать DMA? Да вот даже какие-то вопросы с потреблением памяти
Это не микроконтролерое и в концепции «тяп-ляп и в продакшн» никому кроме узкого круга спецалистов не нужно.
> была статья на хабре
Ну Артамонов на хабре это какбэ ок, но не ждать же, пока он все напишет? :)
> встречалась мне в библиотеке книжечка именно про написание операционных систем
Да таких полно (кажется, даже Таненбаума издательство «Мир» переводило) — хотя вот как раз старые книжки применительно к МК могут быть вполне интересны.
> В кубике это делается расстановкой галочек, а не в кубике rcc_clock_setup_in_hse_8mhz_out_48mhz(); или типа того.
Вот есть такое мнение, что даже обычный сишный хелловорлд — вот что-то типа такого:
непедагогичен, ибо единственный способ его объяснить — это сказать — «половину слов отсюда мы еще не знаем и узнаем только к концу курса».
Ну а так одно шаманство — с регистрами — подменяется другим, с расстановкой галочек (ага, а теперь у нас будет не STM32, а LPC17** или MSP432 какой-нибудь, а то и Миландр — где там галочки ставить?) или вызовом какой-то волшебной функции (тут есть, правда, шансы в недалеком будущем узнать, что она делает).
> никому кроме узкого круга спецалистов не нужно
Ну вот как в этот «узкий круг спецалистов» попадают?
> хотя вот как раз старые книжки применительно к МК могут быть вполне интересны.
Они интересны не к МК, а к низкоуровневому, системному, программированию. В то время как большинство «программистов» разрабатывают прикладное ПО, даже если оно втиснуто в МК.
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
и программист даже не знает в каком цикле loop вызывается и что происходит до setup.
Хотя, надо заметить, он и код до main тоже не знает.
> непедагогичен
10 print «Hello world!»
вот этот — педагогичен. :)
А обучать на Си это, кмк, не самая хорошая идея.
> где там галочки ставить?
Вот у миландра и спрашивайте.
Либо вы поднимаетесь на уровень «хочу тактироваться от HSE в 4МГц так что бы работало USB», либо для ознакомления листаете RM, а потом вдумчиво читаете понравившиеся главы, плотно подсаживаясь на конкретное железо.
> Ну вот как в этот “узкий круг спецалистов” попадают?
Через постель. :))
> большинство “программистов” разрабатывают прикладное ПО, даже если оно втиснуто в МК
Ну а вот кто у нас должен получиться «на выходе» после этого «Штурмуем STM32», например? Прикладники? Они с большой вероятностью будут работать с готовой RTOS (даже не используя SPL или HAL), и им вот этот рассказ про регистры периферии нахрен не нужен, разве что для общего знакомства. Системщики? Ну разве что личинки этих самых системщиков.
> А обучать на Си это, кмк, не самая хорошая идея.
А другие варианты? Java на порядок хуже (особенно в части непедагогичности), Pascal мертв, Python годится только для «не-программистов».
> Ну а вот кто у нас должен получиться “на выходе”
Тоже самое, что и на входе.
По сути это не обучение с нуля, это курсы повышения квалификации. Человеку, который в целом владеет кодингом под МК по-быстрому рассказывают про периферию нового для него МК. При этом они уже в целом понимаю что такое embedded и как его готовить.
Но возможно это только с моей колокольни, я до сих пор помню, что CD/C9 это CALL/RET, а EMT 350/351 завершение программы и вывод строки, адрес которой в R0. :)
> А другие варианты?
Да хз.
мертвый паскаль или мертвый бейсик.
Это (особенно второе) м.б. и не строго, но зато просто, понятно и работает сразу. А после того, как появится понимание что такое программа, циклы, ветвление, ввод/вывод, переменные и т.д., можно переходить к реальным языкам. Но, опять же, это с моей колокольни и опыта обучения кодингу не самых тупых подростков. И чем дальше, тем больше я склоняюсь к тому, что для обучения программированию нужен абстрактный язык а-ля «русский паскаль» Ершова или псведоЭВМ Кнута. Причем именно в том виде, как оно оформленно в КуМире, т.е. написал, кнопку нажал, результат получил. Без компиляции, без линковки, без прочей шелухи.
А поняв базовые принципы дальше можно освоить любой язык, например, тот же «Язык программирования Це», который и сам по себе много где используется, и является прародителем более других языков.
> Человеку, который в целом владеет кодингом под МК по-быстрому рассказывают про периферию нового для него МК.
Да вот ни фига. Многие из этих книжек позиционируются, как «учебники для начинающих» (хотя совершенно непригодны для этого), а для «человека, который в целом владеет кодингом под МК» предназначены вендорские Technical Reference Manual и Application Notes.
> просто, понятно и работает сразу
Тогда Python.
для начинающих кого?
Влезающих в программирование вообще? или в программирование МК?
Питон? После «Вложенные инструкции объединяются в блоки п овеличине от ступов.» — спасибо, не надо. Уж лучше фортран с его форматом строки :)
Влезающих в программирование МК.
Есть у меня мнение, что нет никакого «программирования МК».
Ну почему? Микроконтроллеры всяко есть, как-то они программируются, соответственно, и такой род человеческой деятельности, как «программирование МК», вполне себе существует. От остального программирования (в том числе низкоуровневого для «больших» систем) оно местами отличается.
А вот ничем и не отличается.
по сути два варианта: либо вы используете обертку, которая скрывает от вас физическую реализацию, либо шаритесь по регистрам как вам заблагорассудится.
Что такое МК? Вот у меня (я уже упоминал) есть интел эдисон: это МК или это «большая система»?
Когда-то давно был такой термин «Однокристальная ЭВМ». И есть еще похожий термин «SoC». И они более правильные, чем МК, т.е. проц и немножко периферии втиснуто в один корпус. И не болеет того. А с точки зрения быдлокодинга нет никакой разницы: у вас ВВ51 стоит отдельным корпусом или в том же корпусе, что и процессор и даже не одна, а целых три.
Неправильно. В «больших» системах можно годами жить и ни разу не услышать слова «прерывание», DMA там — это неведомая хуйня, которая ускоряет работу с дисками, памяти хоть жопой жуй, а повисший процесс не ставит раком всю систему.
Эдисон, очевидно, ни разу не «однокристаллка», там память отдельно.
Можно подумать, вас кто-то в ардуине заставляет изучать прерывания и ДМА. А повисший процесс… Вот скажите, 8086 и msdos это большая система? А 486 (или даже выше) и Netware, пусть будет 4.11, большая система или так себе поделка?
И в целом: первые бытовые а-ля 8080/z80 — это микроконтроллеры или большие системы? Или БК0010… Каких размеров? :)
А насчет эдисона обломитесь, оперативка там в одном корпусе с ядрами. А внешняя ПЗУ… Ну так у i8040 тоже «флешки» не было, так что, вычеркиваем ее из списка микроконтроллеров? :)
> 8086 и msdos это большая система
По нынешним меркам — нет.
> 486 (или даже выше) и Netware, пусть будет 4.11, большая система
Скорее да (один из «разделителей» между микроконтроллерами и микропроцессорами — это наличие виртуальной памяти).
> первые бытовые а-ля 8080/z80 – это микроконтроллеры или большие системы
Если запихнуть весь Speccy в «однокристаллку» — то будет микроконтроллер (и неплохой).
А насчет эдисона — там, ЕМНИП, package-on-package, оперативка и ядро у Atom тех лет все-таки раздельные.
А можно тогда критерии этих мерок? Особенно в плане обязательности виртуальной памяти?
Так, для справки, pdp-11 чем-то подобным обладало. Как были и уровни работы процессора. Емнип два бита, но что бы все четыре были я не помню, а system/user — было. Не уверен насчет виртуально как не существующей памяти, но по-моему по обращению к несуществующему адресу вылетал трап и теоретически ядро могло это отлавливать и обрабатывать.
А вот nw4.11 как раз виртуальную память не поддерживала. Это появилось только в 5-й версии. И емнип, в 4.11 еще полноценная кооперативная многозадачность, когда один процесс раком ставит всю систему.
Да, PoP, но какая разница? Корпус там один, северных/южных мостов, по-моему, нет.
В чем разница между одним корпусом и набором корпусов с точки зрения программера?
Если спек залить смолой в один кирпич, оставив снаружи только разъемы, он как-то по-другому кодится будет?
Ну ок, убедил, нет никакой разницы между Core i9 и PIC16. Что дальше?
Между ними большая разница.
но тем не менее дальше вы берете либо libc и ее производные, либо reference manual на «железо».
…или и то, и другое одновременно.
Есть хороший сайт с кучей тем
http://narodstream.ru/
А книгу хоть сколько-то полезную знаю только одну:
https://leanpub.com/mastering-stm32
Зашел на «хороший сайт». Открыл первую же попавшуюся статью — про таймеры.
http://narodstream.ru/stm-urok-147-ll-tajmery-chast-1/
Ну это, я как бы могу reference manual и без перевода/пересказа читать.
https://leanpub.com/mastering-stm32 — ну та же примерно хуйня, стандартный рассказ обо всей периферии (для первого знакомства подойдет) и FreeRTOS в Advanced Topics.