7-шаговый путь обучения встраиваемому IoT за пределами Arduino

Обычно энтузиасты встроенного IoT начинают работать с такими платформами, как Arduino и, возможно, в некоторой степени с другими платформами, такими как ESP или Raspberry Pi. Я считаю, что очень часто в определенный момент, когда ученик уже нашел свою точку опоры, он задается вопросом, что ему делать дальше, чтобы расширить свои знания в этой области. Я заметил, что, вероятно, по сравнению с веб-технологиями, учащиеся не находят в Интернете столько рекомендаций о том, какой путь обучения им следует пройти. Чаще всего на форумах можно встретить людей, спорящих о том, какой путь лучше выбрать.

Хотя платформы tinkering являются хорошими средствами начального уровня для встраиваемого IoT, они, конечно, абстрагируют тонну основ. Нельзя ожидать, что вы сразу же перейдете от платформы для мастеринга к специализированной отрасли. В этой статье я сначала расскажу о том, почему платформы для создания самоделок, такие как Arduino, могут не дать всех необходимых фундаментальных знаний для создания опыта в области встроенного IoT, а затем расскажу о том, какие знания вам нужно получить, чтобы выйти за рамки платформ для создания самоделок.

Чтобы было понятно, я не пытаюсь сказать, что нельзя использовать код Arduino в производстве. Однако, если человек хочет этого, понимание низкоуровневых деталей становится необходимым для понимания компромиссов.

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

Почему я не могу всегда придерживаться Arduino?

С точки зрения программного обеспечения, вы должны помнить, что такие платформы, как Arduino, чрезвычайно абстрактны. Это достигается путем добавления программных слоев поверх кода более низкого уровня, чтобы удалить многие детали низкого уровня. Кроме того, платформы Arduino включают низкоуровневые микропрограммы, чтобы сделать их прикладное программное обеспечение программируемым на нескольких устройствах. Правильно, идея заключается в том, чтобы облегчить кривую обучения для начинающих разработчиков встраиваемого оборудования. Хотя для тех, кто хочет в конечном итоге создавать устройства производственного класса, необходимо иметь в виду следующее:

  • Влияет ли накладной расход кода на размер моей программы? Во встраиваемых устройствах используются недорогие микроконтроллеры, которые часто не имеют большого объема памяти. Учитывая имеющееся у вас приложение, вам нужно понять, может ли библиотека Arduino и накладные расходы на прошивку негативно повлиять на ваше приложение.
  • Дает ли код Arduino доступ ко всем необходимым мне функциям микроконтроллера? Существующие библиотеки Arduino не всегда раскрывают всю мощь базового оборудования. Микроконтроллеры часто поставляются со специальными функциями, которые позволяют повысить скорость/производительность. Код Arduino не всегда дает возможность полностью настроить все специфические для микроконтроллера функции. Если вам нужно выжать какие-то специфические особенности, то вам нужно будет понять, как получить доступ к нижним уровням аппаратного обеспечения.

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

  • Аппаратное обеспечение Arduino добавляет накладные расходы на компоненты, которые не используются в производстве. Это влечет за собой дополнительные расходы на аппаратное обеспечение в чувствительной к затратам отрасли массового производства. В этой статье блога дается хороший обзор дополнительных аппаратных средств Arduino.
  • Аппаратное обеспечение Arduino (печатная плата и распаянные на ней компоненты) не подходит для всех областей применения/отраслей. Часто в зависимости от отрасли, на которую вы ориентируете свой продукт, вам придется приобретать квалифицированные компоненты для этой отрасли. Кроме того, сама печатная плата иногда должна быть квалифицирована для отрасли/области применения, например, для бытовой электроники, автомобильной, промышленной и т.д. Это позволяет убедиться в том, что аппаратное обеспечение может выдержать условия, в которых оно будет использоваться.

Что же делает такие платформы, как Arduino, особенными?


Я лично думаю, что величие таких платформ, как Arduino, заключается в том, как им удалось заинтересовать многих людей в аппаратном обеспечении. Уже доказано, что Arduino облегчает начальный уровень для новичков, которые не имеют большого опыта работы с аппаратным обеспечением. Если что, у обучающихся развивается чувство построения логики в условиях встроенных ограничений. Это имеет множество преимуществ в дальнейшем при разработке на более низком уровне. И последнее, но не менее важное: Arduino также является отличным средством для быстрого создания прототипов идей даже для опытных профессионалов.

Так с чего же начать?


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

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

  • Использовать системные языки программирования, такие как C и C++
  • Приоритет использования микроконтроллеров
  • Отдавать предпочтение разработке «под чистую», если только вам действительно не нужна RTOS
  • иметь некоторое подключение к сети (проводное или беспроводное).

Каждый из этих пунктов вносит свой вклад в совокупность знаний, которые вам необходимы, или основ, которые вы должны приобрести, чтобы стать Давайте рассмотрим каждый пункт и посмотрим, какой вклад он вносит.

Языки системного программирования

Языки системного программирования — это часто компилируемые языки, которые действительно эффективны и генерируют действительно оптимизированный/быстрый код. Языки системного программирования обеспечивают необходимый контроль, который нужен разработчику для настройки и выжимания необходимой производительности из системы. Несмотря на то, что на подъеме находятся некоторые другие системные языки, такие как Rust и micropython, в области встраиваемых систем в настоящее время наиболее часто используются два языка — C и C++. Большинство пользователей Arduino часто знакомы с их синтаксисом, поскольку Arduino уже использует C++. Поэтому для получения полного представления о языке было бы неплохо начать с курса Си или Си++. Это также поможет учащемуся понять смысл многих непонятных кодов в Arduino. Как минимум, важно получить знания в таких областях, как указатели, структуры и динамическое распределение памяти. Если пойти дальше, то знания в определенных структурах данных, таких как очереди и кольцевые буферы, также будут полезны.

Некоторые хорошие ресурсы для изучения C или C++ включают следующие:

  • Вводная специализация по программированию на C на Coursera — это хорошо изученный курс, если вы заинтересованы в C.
  • Специализация «Кодирование для всех: Специализация по C и C++ на Coursera также дает вам базовые знания как по C, так и по C++.

После расширения ваших знаний по C или C++ я также очень рекомендую бесплатную онлайн-книгу A Dive into Systems. Я считаю, что эта книга дает отличный обзор компьютерных систем сверху донизу. Она является отличным предвестником всех предстоящих тем.

Использование микроконтроллеров

Микроконтроллеры (MCU) появились в связи с потребностями встраиваемой промышленности. MCU обладают рядом функций и периферийных устройств, которые предназначены для использования во встраиваемых системах. Если вы не слишком хорошо знакомы с тем, что такое MCU, или с разницей между MCU и микропроцессором или SoC, я настоятельно рекомендую вам прочитать мою другую статью в блоге здесь. Общие периферийные устройства MCU включают, как минимум, ввод-вывод общего назначения (GPIO), аналого-цифровые преобразователи (АЦП), таймеры/счетчики и некоторые виды последовательной связи. Кроме того, MCU оснащаются специальными механизмами, такими как прерывания или режимы низкого энергопотребления. Вам также нужно знать, что разнообразие MCU огромно. Существует огромное количество компаний (вероятно, от десятков до сотен), производящих множество различных MCU. Итак, с точки зрения фундаментальных знаний, что нам нужно знать/выучить? Как минимум, вы должны понимать:

  • Механику архитектур встроенных процессоров и их набор инструкций. Вы можете выбрать одну из нескольких архитектур, включая ARM Cortex-M, RISC-V, AVR и другие.
  • Основная теория, лежащая в основе распространенных периферийных устройств. Например, как работает таймер или счетчик? Как работает АЦП? Как работает GPIO? Это поможет вам понять, что можно изменить в том или ином периферийном устройстве, чтобы добиться желаемого. Кроме того, вы увидите, что существует несколько способов достижения одной и той же цели.
  • Как управлять и настраивать специальные функции микроконтроллера и ядра процессора. Сюда входят такие понятия, как прерывания и работа с низким энергопотреблением.
  • Как конфигурировать периферийные устройства микроконтроллера и их возможности для удовлетворения требований вашего приложения или даже оптимизации вашего приложения.
  • Как отлаживать код на низком уровне. Это также подразумевает понимание цепочек отладочных инструментов и их конфигурации.

В целом, вам необходимо понимать систему микроконтроллеров изнутри и уметь конфигурировать ее на низком уровне с помощью регистров. Это требует знания архитектуры микроконтроллера и основ работы с различными периферийными устройствами. Это также означает, что, основываясь на вышеупомянутых знаниях, в конечном итоге вашей целью должно быть умение взять любой технический паспорт MCU или справочное руководство, чтобы извлечь информацию, необходимую для конфигурирования, программирования и отладки MCU. Кроме того, эти знания могут быть полезны при проектировании аппаратного обеспечения для MCU, а также при выборе MCU для вашего приложения (понимание компромиссов между производительностью, мощностью и стоимостью).

Что касается ресурсов, я нашел курс из двух частей Embedded Systems — Shape The World: Microcontroller Input/Output, а затем курс Embedded Systems — Shape The World: Multi-Threaded Interfacing» Джонатана Вальвано, охватывает большую часть того, что вам здесь нужно. Есть также курсы, предлагаемые компанией ARM в рамках профессионального сертификата Embedded Systems with ARM на edX, хотя эти курсы можно считать все еще немного абстрактными в некоторых аспектах.

Голая разработка и RTOS

Во встраиваемых системах приоритет отдается «голой» разработке. В «пустых» приложениях код приложения выполняется непосредственно на аппаратном устройстве (MCU). Другими словами, код приложения имеет прямой доступ к кремнию (аппаратному обеспечению) без каких-либо посредников (например, операционной системы), как показано на рисунке ниже.

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

До этого момента учащийся получил достаточно фундаментальных знаний для многих различных областей применения. Учащийся уже может расширить эти знания до специфики определенной отрасли. Хотя, на мой взгляд, важно идти дальше, чтобы создать всеобъемлющий фундамент.

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

Что касается ресурсов для Bare Metal, то здесь важно ознакомиться с методами планирования. Я нашел книгу «An Embedded Software Primer» Дэвида Э. Саймона довольно полезной и легко читаемой. Здесь также важно знать структуру данных из первого пункта. Если вы предпочитаете отдельные ресурсы по изучению структур данных, есть курс Data Structures от UC San Diego на Coursera или полная специализация Data Structures and Algorithms, есть также Data Structures and Algorithms Using C++ на edX, который особенно сосредоточен на C++. Наконец, The Algorithms — отличный ресурс помимо этих курсов, который предоставляет открытый исходный код на нескольких языках для популярных структур данных и алгоритмов.

Знания, которые учащийся приобрел к настоящему времени, дают достаточное представление о том, как может выглядеть планирование RTOS. Однако выбор развертывания RTOS — это нечто большее, чем просто управление планированием задач. Здесь для учащегося было бы полезно попрактиковаться в развертывании легкой RTOS, такой как FreeRTOS или Mbed OS. Здесь вам будет полезен плейлист YouTube Shawn Hymel Introduction to RTOS.

Помимо легких RTOS, в настоящее время также часто можно встретить использование Linux во встроенных одноплатных компьютерах. Это делается для приложений, которые становятся более универсальными по своей природе и требуют много ресурсов. Для таких приложений очень важно научиться создавать собственный образ Linux. Существует также плейлист Shawn Hymel Introduction to Embedded Linux на YouTube, который очень полезен и удобен для начинающих. Однако этот плейлист требует, чтобы у вас были некоторые основы работы с командной строкой Linux. Лично я считаю весьма полезным бесплатный учебный курс «Введение в Linux» от Linux Foundation.

Сетевое подключение

Поскольку встраиваемые устройства часто являются частью более крупной сети, на начальном этапе, в зависимости от отрасли, в которой развертывается устройство, устройства часто были частью специализированной проводной сети. Это не обязательно означало, что устройства в сети будут открыты для внешнего мира (например, интернет/облако), а скорее будут общаться друг с другом в изоляции (например, в автомобиле). Позже, когда приложения IoT стали более распространенными, беспроводные сети также стали более распространенными (например, WiFi, Bluetooth). Таким образом, для того чтобы получить базовые знания в области встроенных систем, учащемуся стоит освоить некоторые основы сетевых технологий. Как минимум, необходимо понимать различные уровни сетевой модели и различные протоколы.

Здесь учащийся может пройти стандартный курс по компьютерным сетям или даже специализированный по встраиваемому IoT. Программа микромастеров по Интернету вещей на edX имеет целый ряд курсов, которые охватывают основы сетей IoT. Кроме того, примером стандартного курса по компьютерным сетям является специализация по компьютерным коммуникациям на Coursera.

Краткий обзор 7-шагового пути обучения

Подводя итог вышесказанному, можно сказать, что путь обучения после Ardunio состоит из следующих этапов:

1. Получить глубокие знания в C или C++, включая такие темы, как структуры и указатели 👨💻

📚 Ресурсы: Вводная специализация по программированию на C на Coursera, или как для C, так и для C++: Кодирование для всех: Специализация по C и C++ на Coursera

2. Соберите знания о структурах данных и алгоритмах 🧮

📚Ресурсы: Data Structures by UC San Diego Course на Coursera, если интересно, есть полная специализация Data Structures and Algorithms, также есть Data Structures and Algorithms Using C++ на edX. Наконец, The Algorithms — отличный ресурс помимо этих курсов, который предоставляет открытый исходный код на нескольких языках для популярных структур данных и алгоритмов.

3. Создайте базу знаний о компьютерных системах 💻

📚Ресурсы: Бесплатная онлайн-книга «A Dive into Systems» содержит очень легко усваиваемый, удобный для начинающих материал.

4. Понимание микроконтроллеров на низком уровне 🤖

📚Ресурсы: Курс из двух частей, объединяющий курс «Встраиваемые системы — формируем мир»: Ввод/вывод микроконтроллеров, а затем курс «Встраиваемые системы — Формирование мира: Multi-Threaded Interfacing. На edX также есть профессиональный сертификат Embedded Systems with ARM, хотя его можно считать абстрактным в некоторых аспектах.

5. Изучите принципы проектирования ПО Bare Metal и методы планирования во встраиваемых системах ⠞.

📚Ресурсы: Ресурсы из пункта 4 могут покрыть часть этих знаний, хотя книга «An Embedded Software Primer» Дэвида Э. Саймона дает более полную картину с примерами кода. Книга также дает представление о работе RTOS.

6. Научитесь развертывать RTOS и/или Embedded Linux ⌨️.

📚Ресурсы: Shawn Hymel Introduction to RTOS YouTube Playlist. Плейлист YouTube Shawn Hymel Introduction to Embedded Linux. Для создания основ командной строки Linux есть курс «Введение в Linux» от Linux Foundation.

7. Получите знания о компьютерных сетях 📡

📚Ресурсы: Программа микромастерства «Интернет вещей» для получения специализированных знаний по встроенным IoT. Кроме того, специализация «Компьютерные коммуникации» для получения общих знаний о компьютерных сетях.

Заключение

Студенты, изучающие встроенный IoT, которые начинают с Arduino, часто оказываются в затруднительном положении, пытаясь сориентироваться на пути за пределы Arduino. Большинство студентов стремятся в конечном итоге получить знания для определенной области применения встраиваемых систем или отрасли, например, автомобильной, аэрокосмической, промышленной или какой-либо другой. Это еще больше запутывает ситуацию, поскольку учащиеся начинают видеть все эти различные требования к работе и незнакомые им термины, от которых у них голова идет кругом. Дело в том, что независимо от того, какую отрасль в итоге выберет учащийся, все сводится к одному — фундаменту. После этого учащийся может выбрать специализацию, в которой он сможет накопить опыт. В этом посте я описываю 7 шагов, которые должен сделать каждый изучающий Arduino, чтобы создать такую основу для следующего шага в своей карьере. У вас есть вопросы? Есть ли другие темы, которые, по вашему мнению, должен изучить студент? Поделитесь своими мыслями в комментариях ниже 👇. Если вы нашли это полезным, не забудьте подписаться на рассылку новостей здесь, чтобы быть в курсе новых статей блога.

Оцените статью
Procodings.ru
Добавить комментарий