Как стать автором
Обновить

.NET Micro Framework: кратко о портировании

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

1. Вступление


Для людей, решивших заняться портированием, Microsoft поставляет специальный инструмент: .Net Micro Framework Porting Kit. Он представляет собой набор исходных кодов и конфигурационных файлов, из которых можно скомпилировать CLR. Система построения сделана на базе MSBuild. На текущий момент компиляция запускается только из командной строки. Практически никаких графических средств не предоставляется. Исключением является только утилита SolutionWizard, которая позволяет конфигурировать проекты портов. Также нет никакой поддержки сред разработки. Грубо говоря, порты пишутся чуть ли не в блокноте. Но в ближайшее время ситуация должна измениться в лучшую сторону.

2. Архитектура .NET Micro Framework


Прежде чем говорить о портировании, очень важно понимать, как устроен .Net Micro Framework внутри. В прошлой статье я кратко рассказал о архитектуре .Net Micro Framework, тут же я рассмотрю ее поподробнее. В документации к .Net Micro Framework Porting Kit есть такая вот картинка:



Это 4-слойная архитектура .Net Micro Framework. Та же документация говорит (в моем вольном переводе) следующее:

Hardware Layer

Этот слой содержит микропроцессор и другие компоненты, из которых состоит ваша аппаратная платформа. На текущий момент .NET Micro Framework может быть запущен на процессорах таких архитектур, как ARM7, ARM9, Cortex, XScale, ARC и ADI Blackfin.

Кроме того, имеется возможность запустить .Net Micro Framework поверх операционной системы. Конечно, в этом случае «железо» никуда не исчезает. Просто взаимодействие с аппаратной частью будет происходить через API операционной системы. Именно таким образом работает эмулятор, входящий в состав .NET Micro Framework Platform SDK. Он представляет собой ни что иное, как порт .NET Micro Framework для Windows.

Runtime Component Layer

Этот слой состоит из 3-х компонентов:

• .NET Micro Framework common language runtime (CLR);
• Hardware abstraction layer (HAL);
• Platform abstraction layer (PAL).

CLR

Среда исполнения .NET Micro Framework CLR (TinyCLR) является подмножеством .NET Framework CLR. TinyCLR отличается от «большой» CLR тем, что она была специально переработана для использования в небольших встраиваемых устройствах.

.Net Micro Framework Porting Kit поставляется вместе с исходными кодами TinyCLR. Данные коды представляют собой аппаратно-независимую библиотеку, которая может быть скомпилирована разными компиляторами для разных архитектур.

HAL и PAL

TinyCLR взаимодействует с нижележащей аппаратной частью через HAL и PAL. Как HAL, так и PAL состоят из набора функций, вызываемых из TinyCLR. Эти функции написаны на C++. Вполне понятно, что функции HAL очень тесно связаны с «железом». Функции, входящие в PAL, наоборот, спроектированы так, чтобы не зависеть от аппаратной реализации.

Многие функции HAL и PAL образуют пары. Они используются совместно для выполнения конкретной задачи. TinyCLR вызывает функцию PAL, которая в свою очередь использует функцию HAL для доступа к аппаратной части.

Кроме того, в HAL входит так называемый Bootstrap код. После подачи питания этот код занимается инициализацией аппаратной части и затем запускает TinyCLR.
TinyCLR продолжает загрузку и занимается высокоуровневой инициализацией. Bootstrap код выполняет свои задачи, используя функции из HAL и специальные ассемблерные вставки.

Class Library Layer

Библиотека классов .NET Micro Framework представляет собой объектно-ориентированную коллекцию типов, которые разработчики используют при написании встраиваемых приложений. Сюда могут быть включены и сторонние типы. Например, разработчики отладочных плат добавляют сюда классы для работы с периферийными устройствами, расположенными на этих платах.

Application Layer

Этот уровень содержит приложения, которые вы создаете для своих устройств. На сегодняшний день единственным языком разработки таких приложений является C#.

Таким образом, основной задачей портирования является написание функций и конфигураций уровня HAL. Теперь посмотрим, каким образом это делается.

3. Solutions в .NET Micro Framework Porting Kit


Каждый порт в рамках .Net Micro Framework Porting Kit представляет собой Solution. Solution в свою очередь состоит из нескольких Project’ов. Всего существует 5 видов Project’ов:

• NativeSample
• PortBooter
• TinyBooter
• TinyBooterDecompressor
• TinyCLR

NativeSample — это простой «Hello, World» проект. Основной задачей при его реализации является написание достаточного количества функций HAL, чтобы вывести строку «Hello, World» в отладочную консоль.

PortBooter – загрузчик порта. Он позволяет прошивать новые версии TinyCLR в процессе разработки и отладки порта. Реализации этого проекта требует добавления новых функций HAL к уже написанным для NativeSample. Это переходный проект для подготовки к реализации следующих проектов.

TinyBooter — это загрузчик .NET Micro Framework. В момент подачи питания он производит всю необходимую инициализацию и запускает TinyCLR. Кроме того он позволяет прошивать новые версии TinyCLR. В процессе реализации этого проекта в HAL добавляется еще несколько новых функций.

TinyBooterDecompressor — это специальная надстройка, призванная минимизировать физический размер TinyBooter. TinyBooter хранится в заархивированном виде и при включении питания распаковывается и загружается с помощью TinyBooterDecompressor.

TinyCLR – собственно, сама среда исполнения. Получение работоспособной TinyCLR и есть цель портирования. В процессе работы над этим проектом дописываются оставшиеся функции HAL. TinyCLR включает в себя TinyBooter.

Таким образом, реализовывая эти проекты по очереди, вы создаете слой HAL.

4. Solution Wizard и компоненты проектов


Создание нового Solution начинается с SolutionWizard. Эта утилита позволяет создать Solution с нуля, сделать новый Solution на базе существующего (клонировать) и отредактировать существующий.
В процессе работы SolutionWizard позволяет выбрать так называемые Features, которые будут входить в Solution. Features представляют собой функциональные свойства .Net Micro Framework. Например, есть такие Features, как I2C, UART, SD и т.д. Таким образом, если вам не нужны некоторые возможности .Net Micro Framework, то вы можете просто не включать их в проект, тем самым уменьшив физический размер TinyCLR.

Каждая Feature реализуется набором Libraries, которые объединены в Library Categories. Library представляет собой отдельный проект MSBuild, реализующий свою задачу. Собственно, Library и включают в себя исходный код. Так как может существовать множество реализаций одной и той же задачи (например, для разных процессоров), то может существовать и множество Library. Именно поэтому они объединены в Library Categories. По умолчанию реализацией Library Category является stub Library. Это такая Library, в которой в место всех функций стоят заглушки. Она не несет никаких функций и нужна только для обеспечения работы линковщика, даже если нет ни одной нормальной реализации. Вся эти компоненты могут ссылаться друг на друга.

Таким образом, получается следующая связка:
Feature -> Набор Library Categories-> Одна из Library, реализующих каждую категорию.
Разобраться в этой «каше» непросто. Чтобы хоть как-то было понятно, посмотрим на эту картинку:



С первого взгляда понятнее не становится. Попробуем разобраться.

Здесь представлена реализация Feature I2C. Feature раскрашены желтым цветом, Library Category — зеленым, Library — синим, а Stub Library — черным. Также на схеме есть следующие типы связей:

• Depend – зависит от;
• Associate – ассоциирована с;
• Realise – реализует;
• Stub – Library с заглушками.

Из этой картинки видно, что Feature I2C реализуется тремя Library Category: I2C_CLR, I2C_PAL, I2C_HAL. Кроме того, она еще зависит от другой Feature Hardware. Каждая Library Category соответствует одному из уровней в слое Runtime Component Layer.

Категория I2C_CLR реализуется Library I2C и I2C_Stub. Категория I2C_PAL реализуется Library I2C_pal и I2C_pal_stubs. Самое интересное мы видим в реализации I2C_HAL. Тут, кроме stub Library, существует еще 5 Library для разных процессоров.

Так вот, для каждой Library Category, ассоциированной с выбранной ранее Feature, SolutionWizard позволяет выбрать одну Library. Вы можете выбрать одну из существующих, выбрать stub, если она не нужна на данный момент, либо можете сгенерировать шаблон для новой Library.

Так как количество Library Category порядка сотни, то бОльшую часть выбора SolutionWizard берет на себя. Однако вы можете подкорректировать этот выбор. Кроме того, вы можете выбрать проекты, которые будут входить в Solution.

Результатом работы SolutionWizard является либо новый Solution, либо изменения в существующем Solution.

Далее начинается непосредственно написание кода и компиляция.

5. Заключение


Я рассмотрел самые общие понятия и принципы создания портов .Net Micro Framework. Дальше начинаются частности, выходящие за рамки этой статьи. Например, работа с MSBuild, распределение памяти, особенности реализации конкретных функций, и т.д. Об этом всем я напишу в следующих статьях.
Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
+22
Комментарии 18
Комментарии Комментарии 18

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн