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

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

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

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

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

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

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

А вот посоветуйте книжек: 20 комментариев

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        > Ну вот как в этот “узкий круг спецалистов” попадают?
        Через постель. :))

        1. > большинство “программистов” разрабатывают прикладное ПО, даже если оно втиснуто в МК

          Ну а вот кто у нас должен получиться «на выходе» после этого «Штурмуем STM32», например? Прикладники? Они с большой вероятностью будут работать с готовой RTOS (даже не используя SPL или HAL), и им вот этот рассказ про регистры периферии нахрен не нужен, разве что для общего знакомства. Системщики? Ну разве что личинки этих самых системщиков.

          > А обучать на Си это, кмк, не самая хорошая идея.

          А другие варианты? Java на порядок хуже (особенно в части непедагогичности), Pascal мертв, Python годится только для «не-программистов».

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

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

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

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

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

              Тогда Python.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    1. Зашел на «хороший сайт». Открыл первую же попавшуюся статью — про таймеры.

      http://narodstream.ru/stm-urok-147-ll-tajmery-chast-1/

      Ну это, я как бы могу reference manual и без перевода/пересказа читать.

      https://leanpub.com/mastering-stm32 — ну та же примерно хуйня, стандартный рассказ обо всей периферии (для первого знакомства подойдет) и FreeRTOS в Advanced Topics.

Добавить комментарий для kettle Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *