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

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

    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, распределение памяти, особенности реализации конкретных функций, и т.д. Об этом всем я напишу в следующих статьях.
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 18
    • +1
      Интересно, для Vogue/Playboy-плеера можно .net mf получить?
      • +1
        А какой там процессор?
        • +1
          MIPS Jz4725B.
          Портировать сложно, потому что кроме извращенного MIPS, процессор еще и забагован. JTAG-а нет, только один UART, плюс китайские мануалы. В общем, удовольствие на любителя.

          (Это закрывая глаза на то, что объем работы по разработке драйверов, мягко говоря, огромный.)
          • 0
            Понятно. Не стоит оно того значит. Ответ на вопрос — нет на 99% :)
      • +1
        Осветите пожалуйста юридическую\финансовую сторону.
        • +1
          Вся юридическая и финансовая сторона тут.
          .Net Micro Framework доступен под лицензией Apache 2.0, а значит вы можете использовать его бесплатно в любых целях.
        • +2
          Большое спасибо за статью, жду продолжения.

          P.S.
          Если мне не изменяет память, «realise» это «осознавать», а реализовать это «implement»…
          • 0
            Ну, если быть предельно формальным, то тут не подходит ни первый ни второй термин, так как Library реализуют напрямую Feature. Library Category используются всего лишь для логической группировки.
            А насчет realise, то вот перевод.
          • 0
            Очень хочется пощупать micro framework, но где взять netduino в Москве?
            • +1
              Купите какой-нибудь Qiwi Virtual Visa у любого вендора, рассылающего по всему миру. В этом нет ничего сложного, просто идет около месяца. Я уже кучу разного хлама купил таким образом…
              • 0
                Хоть тут и не netduino, но все-таки загляните сюда. Может быть поможет.
                • 0
                  Почему же. у них есть netduino. Но хочется перед покупкой пощупать товар. Для меня это темный лес.
                  • 0
                    У нас нет netduino, так что, к сожалению, не могу вам помочь.
                    • 0
                      Посмотрите сюда. Человек пишет, что у него есть netduino.
                  • +1
                    я бы вот это купил: www.ghielectronics.com/catalog/product/265
                    или хотя бы вот это: www.ghielectronics.com/catalog/product/256
                    по идее тот же нетдуино, только портов больше и MicroSD разъем…
                    пожалуй после отпуска и куплю :-)
                    • 0
                      Расскажите потом, как оно :)
                      • 0
                        Писатель, да и .NET специалист из меня не очень, но постик накидать попробую :-)
                  • +1
                    Спасибо за пост! Захватило, как Санта-Барбара бабулек! Жду продолжения.

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.