А вот посоветуйте книжек

Насоветовал тут в фейсбуке кучку книжек по программированию микроконтроллеров:

https://www.facebook.com/tikhonovruslan/posts/2193043937400492

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

  • Что такое микроконтроллер? (опционально – что такое ARM, Cortex, STM32 и так далее)
  • Устанавливаем среду разработки (без нее вот просто никуда, даже светодиодом не поморгать без Keil)
  • Пишем простейшую программу (тут половина читателей отваливается, потому что даже “простейшая” программа требует шаманства в виде настройки тактирования, и идет делать сайты на PHP)
  • Работаем с GPIO
  • Работаем с таймерами
  • Работаем со всякой остальной периферией
  • Тема для продвинутых – что такое DMA и как с ним жить
  • Тема для очень продвинутых – как в CubeMX накликать в проект FreeRTOS

На этом “стандартный” курс заканчивается – но дальше-то что? Рано или поздно в любом проекте на микроконтроллере “вырастает” несложная RTOS (или присутствует там с самого начала). При этом в литературе “для начинающих” это почему-то считается сложной темой, а книг “для продолжающих” почему-то нет. Вот где почитать, например, о том, как написать драйвер периферии или внешнего устройства? Как и когда использовать DMA? Да вот даже какие-то вопросы с потреблением памяти – покажите мне книжку, где было бы достаточно подробно расписано, что происходит со стеком в многозадачной системе во время обработки прерывания?

В общем, что есть хорошего на эту тему “для продолжающих”, с описанием принятых “лучших практик”?

20 комментариев

  1. kettle пишет:

    на тему профилирования памяти МК буквально на днях была статья на хабре.
    по-моему в 1989 году встречалась мне в библиотеке книжечка именно про написание операционных систем… но я сейчас вряд ли вспомню ее название. :)

    > требует шаманства в виде настройки тактирования
    Голосом Каа: свистишшшшшшь.
    В кубике это делается расстановкой галочек, а не в кубике rcc_clock_setup_in_hse_8mhz_out_48mhz(); или типа того.

    > Как и когда использовать DMA? Да вот даже какие-то вопросы с потреблением памяти
    Это не микроконтролерое и в концепции “тяп-ляп и в продакшн” никому кроме узкого круга спецалистов не нужно.

    • > была статья на хабре

      Ну Артамонов на хабре это какбэ ок, но не ждать же, пока он все напишет? :)

      > встречалась мне в библиотеке книжечка именно про написание операционных систем

      Да таких полно (кажется, даже Таненбаума издательство “Мир” переводило) – хотя вот как раз старые книжки применительно к МК могут быть вполне интересны.

      > В кубике это делается расстановкой галочек, а не в кубике rcc_clock_setup_in_hse_8mhz_out_48mhz(); или типа того.

      Вот есть такое мнение, что даже обычный сишный хелловорлд – вот что-то типа такого:

      #include <stdio.h>
      
      int main(void){
          printf("Hello world!\r\n");
          return 0;
      }
      

      непедагогичен, ибо единственный способ его объяснить – это сказать – “половину слов отсюда мы еще не знаем и узнаем только к концу курса”.

      Ну а так одно шаманство – с регистрами – подменяется другим, с расстановкой галочек (ага, а теперь у нас будет не STM32, а LPC17** или MSP432 какой-нибудь, а то и Миландр – где там галочки ставить?) или вызовом какой-то волшебной функции (тут есть, правда, шансы в недалеком будущем узнать, что она делает).

      > никому кроме узкого круга спецалистов не нужно

      Ну вот как в этот “узкий круг спецалистов” попадают?

      • kettle пишет:

        > хотя вот как раз старые книжки применительно к МК могут быть вполне интересны.
        Они интересны не к МК, а к низкоуровневому, системному, программированию. В то время как большинство “программистов” разрабатывают прикладное ПО, даже если оно втиснуто в МК.
        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 годится только для “не-программистов”.

          • kettle пишет:

            > Ну а вот кто у нас должен получиться “на выходе”
            Тоже самое, что и на входе.
            По сути это не обучение с нуля, это курсы повышения квалификации. Человеку, который в целом владеет кодингом под МК по-быстрому рассказывают про периферию нового для него МК. При этом они уже в целом понимаю что такое embedded и как его готовить.
            Но возможно это только с моей колокольни, я до сих пор помню, что CD/C9 это CALL/RET, а EMT 350/351 завершение программы и вывод строки, адрес которой в R0. :)

            > А другие варианты?
            Да хз.
            мертвый паскаль или мертвый бейсик.
            Это (особенно второе) м.б. и не строго, но зато просто, понятно и работает сразу. А после того, как появится понимание что такое программа, циклы, ветвление, ввод/вывод, переменные и т.д., можно переходить к реальным языкам. Но, опять же, это с моей колокольни и опыта обучения кодингу не самых тупых подростков. И чем дальше, тем больше я склоняюсь к тому, что для обучения программированию нужен абстрактный язык а-ля “русский паскаль” Ершова или псведоЭВМ Кнута. Причем именно в том виде, как оно оформленно в КуМире, т.е. написал, кнопку нажал, результат получил. Без компиляции, без линковки, без прочей шелухи.
            А поняв базовые принципы дальше можно освоить любой язык, например, тот же “Язык программирования Це”, который и сам по себе много где используется, и является прародителем более других языков.

            • > Человеку, который в целом владеет кодингом под МК по-быстрому рассказывают про периферию нового для него МК.

              Да вот ни фига. Многие из этих книжек позиционируются, как “учебники для начинающих” (хотя совершенно непригодны для этого), а для “человека, который в целом владеет кодингом под МК” предназначены вендорские Technical Reference Manual и Application Notes.

              > просто, понятно и работает сразу

              Тогда Python.

              • kettle пишет:

                для начинающих кого?
                Влезающих в программирование вообще? или в программирование МК?

                Питон? После “Вложенные инструкции объединяются в блоки п овеличине от ступов.” – спасибо, не надо. Уж лучше фортран с его форматом строки :)

                • Влезающих в программирование МК.

                  • kettle пишет:

                    Есть у меня мнение, что нет никакого “программирования МК”.

                    • Ну почему? Микроконтроллеры всяко есть, как-то они программируются, соответственно, и такой род человеческой деятельности, как “программирование МК”, вполне себе существует. От остального программирования (в том числе низкоуровневого для “больших” систем) оно местами отличается.

                    • kettle пишет:

                      А вот ничем и не отличается.
                      по сути два варианта: либо вы используете обертку, которая скрывает от вас физическую реализацию, либо шаритесь по регистрам как вам заблагорассудится.
                      Что такое МК? Вот у меня (я уже упоминал) есть интел эдисон: это МК или это “большая система”?
                      Когда-то давно был такой термин “Однокристальная ЭВМ”. И есть еще похожий термин “SoC”. И они более правильные, чем МК, т.е. проц и немножко периферии втиснуто в один корпус. И не болеет того. А с точки зрения быдлокодинга нет никакой разницы: у вас ВВ51 стоит отдельным корпусом или в том же корпусе, что и процессор и даже не одна, а целых три.

                    • Неправильно. В “больших” системах можно годами жить и ни разу не услышать слова “прерывание”, DMA там – это неведомая хуйня, которая ускоряет работу с дисками, памяти хоть жопой жуй, а повисший процесс не ставит раком всю систему.

                      Эдисон, очевидно, ни разу не “однокристаллка”, там память отдельно.

                    • kettle пишет:

                      Можно подумать, вас кто-то в ардуине заставляет изучать прерывания и ДМА. А повисший процесс… Вот скажите, 8086 и msdos это большая система? А 486 (или даже выше) и Netware, пусть будет 4.11, большая система или так себе поделка?
                      И в целом: первые бытовые а-ля 8080/z80 – это микроконтроллеры или большие системы? Или БК0010… Каких размеров? :)

                      А насчет эдисона обломитесь, оперативка там в одном корпусе с ядрами. А внешняя ПЗУ… Ну так у i8040 тоже “флешки” не было, так что, вычеркиваем ее из списка микроконтроллеров? :)

                    • > 8086 и msdos это большая система

                      По нынешним меркам – нет.

                      > 486 (или даже выше) и Netware, пусть будет 4.11, большая система

                      Скорее да (один из “разделителей” между микроконтроллерами и микропроцессорами – это наличие виртуальной памяти).

                      > первые бытовые а-ля 8080/z80 – это микроконтроллеры или большие системы

                      Если запихнуть весь Speccy в “однокристаллку” – то будет микроконтроллер (и неплохой).

                      А насчет эдисона – там, ЕМНИП, package-on-package, оперативка и ядро у Atom тех лет все-таки раздельные.

                    • kettle пишет:

                      А можно тогда критерии этих мерок? Особенно в плане обязательности виртуальной памяти?
                      Так, для справки, pdp-11 чем-то подобным обладало. Как были и уровни работы процессора. Емнип два бита, но что бы все четыре были я не помню, а system/user – было. Не уверен насчет виртуально как не существующей памяти, но по-моему по обращению к несуществующему адресу вылетал трап и теоретически ядро могло это отлавливать и обрабатывать.
                      А вот nw4.11 как раз виртуальную память не поддерживала. Это появилось только в 5-й версии. И емнип, в 4.11 еще полноценная кооперативная многозадачность, когда один процесс раком ставит всю систему.
                      Да, PoP, но какая разница? Корпус там один, северных/южных мостов, по-моему, нет.
                      В чем разница между одним корпусом и набором корпусов с точки зрения программера?
                      Если спек залить смолой в один кирпич, оставив снаружи только разъемы, он как-то по-другому кодится будет?

                    • Ну ок, убедил, нет никакой разницы между Core i9 и PIC16. Что дальше?

                    • kettle пишет:

                      Между ними большая разница.
                      но тем не менее дальше вы берете либо libc и ее производные, либо reference manual на “железо”.

                    • …или и то, и другое одновременно.

  2. Дмитрий пишет:

    Есть хороший сайт с кучей тем
    http://narodstream.ru/

    А книгу хоть сколько-то полезную знаю только одну:
    https://leanpub.com/mastering-stm32