Azure rtos. часть 1: обзор и запуск (stm32 + cubeide + hal)

3 Software architecture overview[edit]

The STM32CubeMP1 Package is based on the STM32Cube MCU package but has been adapted to a Linux Framework (OpenSTLinux).

STM32CubeMP1 Package introduces new components such as OpenAMP and RessourceManager that allow easy communication and ressource sharing between main processors running with Linux on Cortex A, and MCU coprocessors running on Cortex M.

  • OpenAMP is a library implementing the remote processor service framework (RPMsg) which is a virtio-based messaging bus that allows a local processor to communicate with remote processors available on the system.
  • ResourceManager is a utility that handles peripheral-accessibility requests and system-resource configuration.
Note:

Please refer to Coprocessor_management_overview for further information related to coprocessor management

The figure below gives an overview of the STM32CubeMP1_architecture.

Note:

Please refer to STM32CubeMP1 Package versus legacy STM32Cube MCU Package for further information on differences between STM32CubeMP1 Package and STM32Cube MCU Package

Что есть у Microsoft?

Microsoft традиционно занимается «большими» ОС, среди которых тоже есть специализированные решения в виде Windows 10 IoT Enterprise LTSC, значительно дешевле настольных систем и со специальными возможностями встраивания. Windows 10 IoT Enterprise требует практически полноценного (хоть и промышленного и малогабаритного) компьютера для запуска. Впрочем, есть редакция Windows 10 IoT Core, ориентированная только на приложения UWP, где требования к системе ниже: она успешно запускается на Raspberry Pi 2.

Здесь же нельзя не упомянуть класс операционных систем Windows Embedded Compact, которые могут работать на системах, по вычислительным возможностям находящимся где-то между полноценными компьютерами и микроконтроллерами. Compact – отдельный класс ОС, не совместимых с «настольной» Windows, требующих особых средств разработки. Последний выпуск датируется 2013-м годом, далее ОС развития не получила, но все еще продается и поддерживается, как и несколько предыдущих версий.

С развитием Интернета вещей Microsoft постепенно стал предлагать решения и для систем с ограниченными ресурсами, таких, как микроконтроллеры. Предполагается, что именно на микроконтроллерах будут создаваться именно сами устройства Интернета вещей, отправляющие данные в облако и принимающие команды от него.

На данный момент доступны и сторонние реализации среды выполнения для C#: https://www.nanoframework.net/, https://www.wildernesslabs.co/. Отметим, что последняя аппаратная платформа вполне подходит и для запуска ucLinux, так что к выбору ОС следует относиться, как к выбору инструмента для решения задачи: что удобнее, то и применяем.

В 2019 году Microsoft поглощает Express Logic, и среди решений для микроконтроллеров от Microsoft появляется Azure RTOS, которая раньше называлась X-WARE IoT Platform. В Azure RTOS входит ядро ThreadX вместе с дополнительными компонентами, а также добавлены средства подключения к Azure IoT Hub и Azure IoT Central. Само название Azure RTOS подчеркивает применение совместно с сервисами Azure для устройств Интернета вещей.

В состав Azure RTOS входят:

  • сама ОС ThreadX, а именно, ядро, планировщик, реализующий многозадачность и синхронизацию задач;
  • стек TCP/IP NetX/NetX Duo;
  • стек FAT FileX;
  • стек USB Host/Device/OTG USBX;
  • реализация графического интерфейса GUI: GUIX и инструмент разработки (GUIX Studio);
  • реализация равномерного износа флеш-памяти для FileX: LevelX;
  • система трассировки событий TraceX;
  • SDK для Azure IoT поверх NetX Duo – готовые средства для подключения устройства к службам Azure.

Нельзя не отметить одно из специализированных решений высокой готовности: Azure Sphere. Это — безопасная платформа для приложений интернета вещей со встроенными механизмами коммуникаций и безопасности. Она представляет собой микроконтроллер (скорее даже SoC) с установленным ядром Linux, а также готовыми облачными сервисом для доставки обновлений безопасности.

Restrictions

  • The tool doesn’t check for different parameters’ compatibility, e.g. CPU/IO/etc frequencies, allocated memory and so on. It simply eases your workflow with these 2 programs (PlatformIO and STM32CubeMX) a little bit.
  • In order to add CubeMX middlewares to your build the manual adjustments should be applied, the stm32pio doesn’t handle them automatically. For example, FreeRTOS can be added via PlatformIO’ feature or be directly compiled in its own directory using option:
    lib_extra_dirs = Middlewares/Third_Party/FreeRTOS

    You also need to move all / files to the appropriate folders respectively. See PlatformIO documentation for more information.

Инструменты, которые нам понадобятся

Эксперименты будем проводить на Windows 10 (подойдет также любая, начиная с 7).

Будем также использовать STM32 HAL — набор универсальных API для микроконтроллеров STM32. Есть много мнений и «за», и «против» использования HAL. На наш взгляд, HAL, внося некоторый «оверхед», все же позволяет получить хорошо читаемый и модифицируемый код. HAL не требует скачивания, все необходимые библиотеки будут загружены автоматически при создании проекта.

Скачиваем и устанавливаем STM32CubeIDE — бесплатная IDE от STMicroelectronics на базе открытых инструментов.

Загружаем исходный код ThreadX c GitHub. Существуют, конечно, «правильные» способы использования репозитория с исходным кодом в виде клонирования репозитория или создания форка, но для простоты описания просто скачиваем его как архив: зеленая кнопка «Clone», затем «Download zip». UPD (см. комментарии): для того, чтобы структура исходного кода полностью соответствовала данному руководству, необходимо использовать определенный коммит. Для того, чтобы его получить, сначала установите клиент Git для командной строки, затем откройте командную строку, создайте временную директорию, перейдите в нее и выполните команды:

Затем переименуйте результирующую директорию из threadx в threadx-master.

Теперь подключаем плату STM32F4Discovery через разъем Mini-USB к компьютеру, проверяем наличие устройства «ST Link» в диспетчере устройств. Плата питается по этому же кабелю.

Package Details: stm32cubemx 6.3.0-23

Package Actions

  • View PKGBUILD /
    View Changes
  • Download snapshot
  • Search wiki
  • Flag package out-of-date
  • Vote for this package
  • Enable notifications
  • Submit Request
Git Clone URL: https://aur.archlinux.org/stm32cubemx.git (read-only, click to copy)
Package Base: stm32cubemx
Description: graphical software configuration tool for STM32 microcontrollers that allows generating C initialization code
Upstream URL: https://www.st.com/en/development-tools/stm32cubemx.html
Keywords: arm
cortex
cortex-m
stm32
Licenses:
Submitter: laserk3000
Maintainer: laserk3000
Last Packager: laserk3000
Votes: 39
Popularity: 0.75
First Submitted: 2016-06-04 10:14
Last Updated: 2021-08-05 21:15

Dependencies (3)

  • bash (bash-devel-git, bash-devel-static-git, bash-xdg-dirs-git, bash-git)
  • java-runtime=11 (jdk5, jre7-openjdk-infinality, java-8-openjdk-shenandoah, jre8-openjdk-infinality, java-gcj-compat, jdk9, jre9, jdk-devel, jre10, jdk6, jdk12-openj9-bin, zulu-12-bin, jre6, jre12, jdk8-openjdk-dcevm, server-jre, jdk13-openj9-bin, jdk9-openj9-bin, jdk10, jdk11-openjdk-dcevm, jre8-openjdk-jetbrains, jdk10-openj9-bin, jdk14-openj9-bin, jdk7, jre7, jre14, jdk8-jetbrains, zulu-14-bin, zulu-13-bin, jdk-bcl, jre-bcl, amazon-corretto-15, jdk11-openjdk-dcevm-conflicts-fixed, zulu-embedded-jdk8, sapmachine-jdk-bin, jdk15-adoptopenjdk, amazon-corretto-8, amazon-corretto-11, jdk11-msopenjdk-bin, liberica-jre-8-full-bin, jdk8-arm, zulu-embedded-jdk, jre11-jetbrains-imfix, zulu-11-bin, zulu-8-bin, zulu-15-bin, amazon-corretto-16, jdk11-graalvm-bin, jdk8-graalvm-bin, jdk16-graalvm-bin, jdk-openj9-bin, jdk-adoptopenjdk, jdk11-adoptopenjdk, liberica-jdk-8-full-bin, liberica-jdk-11-bin, liberica-jdk-11-full-bin, liberica-jdk-11-lite-bin, liberica-jdk-full-bin, liberica-jre-11-bin, liberica-jre-11-full-bin, zulu-embedded-jdk11, jre8-adoptopenjdk, jre-openj9, jre8, jdk8, jre11, jre, jre8-openjdk-shenandoah, zulu-16-bin, jdk-arm, jdk7-j9-bin, jdk7r1-j9-bin, jdk11-openj9-bin, jdk11-graalvm-ee-bin, jdk17-graalvm-bin, jdk-jetbrains, jdk8-openj9-bin, java-openjdk-ea-bin, java-openjdk-loom-ea-bin, jdk8-j9-bin, jdk11-j9-bin, jre-jetbrains, java-openjdk-bin, jre-openjdk, jre11-openjdk, jre7-openjdk, jre8-openjdk)
  • imagemagick (graphicsmagick-imagemagick-compat, imagemagick-no-hdri, imagemagick-git, imagemagick-fftw, imagemagick-full-git, imagemagick-full) (make)
  • https://sw-center.st.com/packs/resource/library/stm32cube_mx_v630-lin.zip
  • LICENSE
  • stm32cubemx.desktop
  • stm32cubemx.sh

5 Arm®Cortex®-M debug on STM32 MPU device[edit]

Two modes are used to debug ArmCortex-M firmware on STM32 MPU devices.

5.1 Engineering modeedit

Very powerful to debug preliminary ArmCortex-M, the engineering mode implies a specific boot mode: the where only the Cortex-M is started. Firmware is loaded via JTAG/SWD into its dedicated RAM.

This mode is not the default one. It must be set via the «Debug Configuration» menu, in the «Debugger» tab , with «through JTGA/SWD link (Engineering mode)» option selected.

The initialization normally done in the Cortex-A (such as clock tree setup or others) must be handled by the ArmCortex-M.

Debugging in engineering mode in an STM32 MPU device is very similar to a standard STM32 MCU debug in terms of functionality, except that in this case the ArmCortex-M core has only one dedicated memory, no Flash memory type.

5.2 Production modeedit

Production mode targets a debug close to the final product.
It means to have an STM32 MPU board up and running on the Cortex-A (Linux) and a Cortex-M firmware to debug (usually an STM32CubeIDE project).

The board, also named «target», is booted in the production mode from the Flash memory (the SD card); it is connected to the Host:

  • via the Ethernet network, using an Ethernet cable or dedicated USB cable
  • and via a USB cable to the ST-LINK probe, giving access to the JTAG/SWD and Linux console

ST-LINK automatically brings support for Cortex-A Linux console via VCP (Virtual COM port). This enables the Target Status widget, visible on the bottom-right of STM32CubeIDE, allowing target IP address discovery. For production mode setup, it is recommended to get the target IP address discovered by the Target Status widget before creating the debug configuration.
This principle is depicted in the Debug Configuration screenshot below.

Network connection can be set up in two ways:

  • Ethernet
    • managed network: IP address attributed by DHCP server
    • unmanaged network: IP address to be manually configured
  • USB

Debug is performed though the following workflow:

1. The firmware built binary is transferred to the target using the network (SSH protocol), more precisely to the Cortex-A Linux file system.

2. Firmware is loaded to Cortex-M core using the “remoteproc” framework.

3. Finally the debug session is started via the JTAG/SWD connection

The production mode is the default one when you create a new debug configuration. It is automatically set via the «Debug Configuration» menu.


Debug configuration, production mode activated.

More information on how to use STM32CubeIDE target status are given in article How to use the Target Status widget in STM32CubeIDE.

At debug launch, some specific pop-up appear:

The SSH Password must be completed: the default one is root.

The RSA key must be approved.

Defining an ArmCortex-M project in an STM32 MPU context also means to define where are downloaded in the ArmCortex-A Linux file system:

  • the Cortex-M firmware: <ProjectName>.elf
  • the load/unload script fw_cortex_m4.sh used by the STM32CubeIDE if present it can be customized
  • and a README, informing a user having a direct connection onto the target.

This is the purpose of «Remote Path Setting» property which is linked to the project. Its default value at creation is /usr/local/project/<ProjectName>, but can also be changed using the Remote Settings properties item.

Inside project structure,directory «<ProjectName>_CM4/Core/RemoteProc/» defines the tree downloaded when debugging in the production mode.

5.3 ST-LINK sharing supportedit

From STM32CubeIDE v1.2.0, it is possible to connect to an ST-LINK probe several applications, in parallel of openOCD. This support relies onto ‘ST-Link Server’.
It is enabled by checking Shared ST-Link inside «Debug Configuration > Debugger > ST-Link Client Setup».

7 Frequently Asked Questions

We do not test external eclipse plug in.

Could I use STM32CubeIDE to test and generate a STM32Cube Expansion Package?

As a partner developing a STM32Cube Expansion package, we recommend using STM32CubeMX. Indeed, the STM32Cube Expansion package should include some examples for the 3 IDEs and this is feasible with STM32CubeMX.

I have analyzed several ST STM32Cube Expansion (X-CUBE-BLE1, X-CUBE-MEMS) but they cannot be re-opened with STM32PackCreator. Have they been designed with STM32PackCreator?

The first X-CUBE have not been designed with STM32PackCreator. So, you may find some tricks which are not feasible with STM32PackCreator. STMicroelectronics supports only the STM32PackCreator feature set.

There is a Example keyword into CMSIS pack standard. Could I use it to describe the 2 to 3 examples (step2) ?

So far, this keyword is not used by STM32CubeMX so far.

There is some beautiful User Interface into STM32CubeMX (for some peripherals). Could I reproduce the same with STM32PackCreator?

STM32CubeMX allows some integration of java code to design complex User Interface. This feature is not expose to external plug in.

Once the STM32Cube Expansion Package is selected into STM32CubeMX additional software management panel, I would like that some settings from dependent peripherals are automatically selected. Is it possible?

This is not possible and not expected. Indeed, your SW component can be used with different series and so, this is not expected to pre-fill the parameters. Our recommendation is to provide some examples with a defined configuration to your users and also a “getting started” document.

Could I modify the XML files generated by STM32PackCreator?

STMicroelectronics does not support this case.

Could I use the Pack ARM CMSIS?

The pack ARM CMSIS can be opened with STM32CubeMX but as some components are also coming from STM32Cube MCU Packages, you may face some incompatibilities. Take care about them.

What is the difference between a STM32Cube Expansion Package and a CMSIS Pack?

The STM32Cube Expansion Package enhanced for STM32 Toolset is in general configurable. The generated code by STM32CubeMX when using STM32Cube Expansion Package has always a similar structure. It is based on STMicroelectronics HAL and LL drivers. It embeds some ready to use examples with .ioc file.

Where are my packages stored?

Look at %HOME%\STM32Cube\Repository\Packs.

2 How to install STM32CubeIDE[edit]

STM32 MPU support inside STM32CubeIDE is available on Linux and Windows host PCs, but
it is NOT on macOS.

STM32CubeIDE for Linux host PC STM32CubeIDE for Windows host PC
Download

Version 1.6.1

  • Download the preferred all-in-one Linux installer from my.st.com
    • Generic Linux Installer — STM32CubeIDE-Lnx
    • RPM Linux Installer — STM32CubeIDE-RPM
    • Debian Linux Installer — STM32CubeIDE-DEB

Version 1.6.1

  • Download the all-in-one Windows installer from my.st.com

    Windows Installer — STM32CubeIDE-Win

Installation guide
User manual
  • When the installation is completed, see additional information about STM32CubeIDE in :
    • STM32CubeIDE quick start guide ()
    • Getting started with projects based on the STM32MP1 Series in STM32CubeIDE ()
Detailed release note

Minor releases may be available from the update site. Check chapter 10 in () for more information on how to update STM32CubeIDE.

1 STM32CubeIDE purpose[edit]

STM32CubeIDE is an advanced C/C++ development platform with peripheral configuration, code generation, code compilation, and debug features for STM32 microcontrollers and microprocessors. It is based on the Eclipse/CDT framework, GCC toolchain for the development and GDB for the debugging.

It allows the integration of the hundreds of existing plugins that complete the features of the EclipseIDE. STM32CubeIDE integrates all STM32CubeMX functionalities to offer all-in-one tool experience, and save installation and development time.

With STM32CubeIDE, you can

  • select the appropriate STM32 device corresponding to your needs
  • configure the device using STM32CubeMX
  • develop and debug applications on top of ArmCortex-M

6 OpenSTLinux project support — Cortex®-A[edit]

From release 1.4.0 on Linux host ONLY, STM32CubeIDE supports OpenSTLinux projects and its associated Yocto ProjectSDK.
Inside STM32CubeIDE, this support means two new Eclipse plugins (SDK & Sources) to be installed, directly from the embedded CA7 project menu context:

  • Setup OpenSTLinux
  • Import an OpenSTLinux Project…


OpenSTLinux Contextual Menu

These Eclipse plugins embed official packages from OpenSTLinux 2.0.

Note that a minimum disk space of 5 GBytes is needed under /tmp during the installation phase.

6.1 How to install Yocto ProjectSDK in STM32CubeIDEedit

We focus in the article How to install the Yocto Project SDK in STM32CubeIDE on various ways to install the Yocto ProjectSDK or point to an already existing SDK installation.

6.2 How to manage OpenSTLinux projectsedit

All projects from OpenSTLinux can be imported inside STM32CubeIDE are available for compilation with Yocto ProjectSDK.

Regarding project structure, these OpenSTLinux projects enrich the Cortex-A part as depicted hereafter. Note that this support is starting from OpenSTLinux v2.0.


Hierarchical Project Structure with OpenSTLinux projects

6.3 How to debug a user space applicationedit

Release 1.6.0 provides support for creating, building and debugging projects aiming to run into the Linux user space of STM32 MPUs. This includes executable, static and shared library.

All tools & software

  • MCU & MPU Embedded Software

    Part number

    Status

    Description

    Type

    Supplier

    X-CUBE-AZRTOS-H7

    Active

    Azure RTOS software expansion for STM32Cube for STM32H7 series

    STM32Cube Expansion Packages
    ST

    X-CUBE-AZRTOS-H7
    Description:
    Azure RTOS software expansion for STM32Cube for STM32H7 series

  • Product Evaluation Tools

    Part number

    Status

    Description

    Type

    Supplier

    B-L462E-CELL1

    Active

    Cellular IoT Discovery kit powered by STM32L4 and ST4SIM

    STM32 Discovery Kits
    ST

    B-L462E-CELL1
    Description:
    Cellular IoT Discovery kit powered by STM32L4 and ST4SIM

    NUCLEO-WB15CC

    Active

    STM32 Nucleo-64 development board with STM32WB15CC, supports Arduino, ST Morpho connectivity

    STM32 Nucleo Boards
    ST

    NUCLEO-WB15CC
    Description:
    STM32 Nucleo-64 development board with STM32WB15CC, supports Arduino, ST Morpho connectivity

  • Software Development Tools

    Part number

    Status

    Description

    Type

    Supplier

    STM32CubeMX

    Active

    STM32Cube initialization code generator

    STM32 Configurators and Code Generators
    ST

    STM32CubeMX
    Description:
    STM32Cube initialization code generator

  • Trainings

    Part number

    Status

    Description

    Type

    Supplier

    Percepio Advanced RTOS Techniques

    Active

    Percepio RTOS Training offers courses in embedded development with a real-time operating system, featuring embedded consultant Jacob Beningo.

    Trainings
    Percepio

    Percepio Advanced RTOS Techniques
    Description:
    Percepio RTOS Training offers courses in embedded development with a real-time operating system, featuring embedded consultant Jacob Beningo.

    Percepio RTOS Fundamentals

    Active

    Percepio RTOS Training offers courses in embedded development with a real-time operating system, featuring embedded consultant Jacob Beningo.

    Trainings
    Percepio

    Percepio RTOS Fundamentals
    Description:
    Percepio RTOS Training offers courses in embedded development with a real-time operating system, featuring embedded consultant Jacob Beningo.

Чем уникальна Azure RTOS

Исследование показывает, что данная ОС является одной из наиболее часто применяемых (более 6 миллионов инсталляций). В основном она используется в специализированном оборудовании, таком, как устройства беспроводной связи, принтеры, модемы, устройства хранения данных, медицинские устройства, интеллектуальные датчики.

Но помимо Azure RTOS, существует большое количество других ОС, выполняющих те же типовые функции. Естественно, возникает вопрос о том, какие уникальные возможности есть именно в этой ОС?

  • Малый размер. Минимальная система занимает 2 КБ ROM. Размер увеличивается автоматически по мере использования возможностей ОС.
  • Поддерживаются различные методы реализации многопоточности, как вытесняющая, так и кооперативная многопоточность.
  • Детерминированное время переключения контекста (меньше 100 циклов), быстрая загрузка (меньше 120 циклов), опциональная проверка ошибок, пикоядро без «слоев».
  • Поддержка большого количества микроконтоллеров и IDE для разработки.
  • Порог вытеснения (Preemption threshold) — порог вытеснения N означает, что данный поток может быть вытеснен только потоками с приоритетом выше N, т.е. от 0 до (N — 1) включительно, а потоки с приоритетом ниже N (т.е. больше N включительно) не могут вытеснять данный поток. Правильное использование данной возможности уменьшает количество переключений контекста, а также уменьшает время реакции на внешние события. Подробную информацию можно найти в статье.
  • Сцепление событий (Event chaining) — позволяет объединить несколько событий в единый сигнал синхронизации для потока, что позволяет синхронизироваться сразу по нескольким событиям, причем в разных комбинациях (И, ИЛИ).
  • Наследование приоритета (Priority inheritance) — позволяет избежать негативных последствий ситуации инверсии приоритетов. Описание ситуации инверсии приоритетов — тема для целой статьи, отдельно с данной проблемой многозадачных систем можно ознакомиться здесь.
  • Оптимизированная обработка прерываний от аппаратных таймеров;
  • Модули (Modules). ThreadX позволяет «обернуть» один или несколько потоков приложения в «модуль», который может быть динамически загружен и запущен на целевом устройстве. Модули позволяют производить обновление «в полях» с целью исправления ошибок. Также при помощи модулей можно разбить микропрограмму на сегменты и динамически определять набор выполняемых потоков, чтобы сэкономить память.
  • Встроенная трассировка событий и аналитика стека. Подбор размера стека потока является одной из самых важных задач при разработке с использованием ОС для микроконтроллера. Нельзя сделать слишком маленький стек, т.к. в отсутствие защиты памяти при переполнении стека — произойдет порча областей памяти других задач. Слишком большой стек также недопустим, т.к. приведет к излишнему расходованию памяти, а она ограничена.

Также рекомендуем интересное сравнение ThreadX с FreeRTOS от инженера, работающего с обеими ОС, а также .

Usage

You can always run

$ stm32pio --help

to see help on available commands.

Basically, you need to follow such a workflow (refer to the example which explains the same just illustrating it with some screenshots/command snippets):

  1. Create the CubeMX project ( file) like you’re used to, set up your hardware configuration, but after all save it with the compatible parameters
  2. Run stm32pio that automatically invokes CubeMX to generate a code, creates the PlatformIO project, patches the file.
  3. Work with your project normally as you wish, build/upload/debug etc.
  4. When necessary, come back to the hardware configuration in the CubeMX, then run stm32pio again to re-generate the code

See the commands reference file listing the complete help about the available commands/options. On the first run, stm32pio will create a config file , syntax of which is similar to the . You can also create this config without any following operations by initializing the project:

$ stm32pio init -d path/to/project

It may be useful to tweak some parameters before proceeding. See the config reference showing meanings for every key.

3 Auto-assessment

Any SW component is not adapted to the development of a STM32Cube Expansion enhanced for STM32 Toolset. Indeed, the possibility of configurations is huge and not covered completely by the tools. Some other methods may be feasible but are not considered in the normal flow.

We refer to this list of questions to identify the right candidates. The questions should be taken in the generic understanding of the Industry.

Did I already use STM32CubeMX or STM32CubeIDE to generate a project?

If yes, move to the next question
The concept is based on the usage of STM32CubeMX. We recommend starting only when you have already acted as a standard user of STM32CubeMX. If not, start downloading and opening STM32CubeMX, pick up a STM32 MCU, configure peripherals, generate the project for your preferred IDE and look at the result.

Is well structured?

If yes, move to the next question
My software is structured in functional units/components self-content from an architecture point of view.

Does have a standard build system?

If yes, move to the next question
We exclude cases such as complex cases with different linker scripts, generating more than one binary file, if your software needs to dynamically adapt the run-time configuration. STM32CubeMX generates simple project structure (cf basic or advanced structure).

Am I ready to adapt my architecture to STM32Cube rules when interacting STM32Cube components?

If yes, move to the next question
STMicroelectronics has defined some rules to interact between STM32Cube components to guarantee coherency between SW components. There is no impact on your own SW component architecture but on the structure of the project (location of your SW component into the project itself, location of the HAL drivers, usage of STM32Cube API…). Indeed, the project structure must be as expected by STM32CubeMX. Using STM32PackCreator and STM32CubeMX prevents most of the problems (link to STM32PackCreator Getting Started).

Am I ready to add this delivery method on a long run?

If yes, move to the next question
We value working with partners and customers on the long run. The work related to the STM32CubeExpansion package is valuable if you intend to upgrade it regularly with new versions of your SW component. Therefore, the method could be done one time but needs to be thought on the long run.

is HW agnostic

— Check the training
Your software component has no relation with any HW components (no peripherals of STM32Cube Ecosystem offer). This video training and the associated I-Cube describe the creation of STM32CubeExpansion in a simple SW component.

has some HW relation with UART, I2C, SPI, GPIO

— Check the training
This video training and the associated I-Cube describe the creation of STM32CubeExpansion in a simple SW component with the usage of GPIO.

has some HW relation with Timers

— Take care: refer to STM32PackCreator limitation
Basic usage of timers is supported. Complex and advanced features are too complex to be implemented in our tools.

has some HW relation with other peripherals than the ones mentioned above

— Be cautious — check the training

Что происходит в данном примере

Приведенное приложение — классический пример «лампочки и кнопочки» для RTOS. На плате распаяно 4 светодиода, и задача приложения — мигать ими, причем у каждого из них должна быть своя частота этого мигания. Без RTOS это сделать будет достаточно сложно и неудобно (UPD: см. комментарии).

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

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

Как только это событие происходит, все светодиоды гаснут (чтобы было видно, что происходит), а время задержки увеличивается в два раза. При следующем нажатии — возвращается к исходному.

Для каждого из четырех потоков используется один и тот же код потока (thread_entry), который на «вход» в качестве параметра получает индекс светодиода, а соответствующая информация (порт, вывод, время задержки, имя потока) будет получена потоком из соответствующей структуры BoardLedsSettings. Это очень удобно: нам не понадобилось писать по функции для каждого потока, вместо этого мы используем единую функцию, просто передавая ей параметр.

В RTOS для микроконтроллеров принято вручную выделять память для стека потока. В некоторых ОС это происходит неявно, но происходит всегда. Стек, как известно, используется для хранения локальных переменных и сохранения контекста при вызове вложенной функции

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

Выделенная область стека передается в функцию tx_thread_create() в виде указателя и размера области памяти в байтах

Обратите внимание, что в нашем примере достаточно было просто объявить массив нужной длины и передать указатель на массив в эту функцию, что означало бы статическое выделение памяти для стека. Но мы пошли более сложным путем, чтобы показать, как в ThreadX устроено динамическое управление памятью

Мы статически создали массив для пула байтов (byte_pool_0), создали сам пул в строке

Затем выделили из этого пула память для стека каждого потока в строке

И передали соответствующий указатель (pointer) в функцию создания потока:

Обратим внимание на следующее:

  • Поскольку мы выделяли память динамически, мы также можем ее и освободить, например, после уничтожения потока. Память вернется в пул и может быть в дальнейшем использована повторно. В ThreadX уже решена проблема фрагментации возвращенной в пул памяти, поэтому проблем с повторным выделением не будет.
  • Все созданные потоки запускаются автоматически (параметр TX_AUTO_START).
  • Параметр TX_NO_TIME_SLICE отключает механизм time-slice для создаваемого потока. Это означает, что квант времени на исполнение процесса мы не задаем, а вместо этого полагаемся на планировщик.
  • Данный код не подходит для производства, поскольку для упрощения примера не производится анализ возвращенного значения функций на предмет возникновения ошибок.
  • ThreadX достаточно гибко конфигурируется путем применения директив препроцессора. Для упрощения примера мы их не рассматривали. Подробная информация доступна .

Инициализация потоков производится в теле функции tx_application_define(), которая в качестве параметра получает указатель на первый адрес неиспользуемой памяти. Мы также могли использовать этот адрес для организации пула байтов, вместо статического выделения.

2 Three webinars to start up

Three webinars have been prepared by our teams to show you a part of the capacity of the STM32Cube Expansion Do It Yourselves. Each video lasts approximately 1 hour and needs between half a day to one day to reproduce it.

Sequencer Sample :

An utility for multi-tasking without an Operating System, which is HW independent code.
In the example, a LED is managed through a GPIO.

Sequencer video

Sequencer video (chinese)

Download the Sequencer Sample code

DSPDemo Sample :

This SW component uses the DSP integrated in the Core to generate an internal signal. This internal signal is then captured and displayed thanks to CubeMonitor. There is no interaction with the external hardware.

DSPDemo video

DSPDemo video (chinese)

Download the DSPDemo Sample code

STDIO Sample

The application code frequently uses standard I/O library functions, such as printf(),scanf(), or fgetc() to perform input/output operations.The I/O library functions can be redirected to use different channels (peripheral) depending on the hardware and the application needs.The most common channels used for STDIN (scanf, getchar) and STDOUT (printf) are UART and USB Device Virtual Com Port class. STDIN could retrieve data from a USB keyboard using the USB Host HID class.

STDIO video

STDIO video (chinese)

Download the STDIO Sample code