Difference between revisions of "Using embOS with STM32CubeMX"

From SEGGER Wiki
Jump to: navigation, search
Line 1: Line 1:
  +
This article describes how '''embOS''' may be used with '''STM32CubeMX'''.
'''[[embOS]] for Cortex-M''' was granted the '''MadeForSTM32''' label. As part of that, SEGGER offers an '''embOS expansion for STM32CubeMX''' that allows users to generate and configure embOS projects for virtually all STM32 devices and various IDEs. This article provides further information on its usage.
 
  +
  +
For using the ''I-CUBE-embOS expansion for STM32CubeMX'', please refer to [[Using I-CUBE-embOS with STM32CubeMX]].
   
 
== MadeForSTM32 ==
 
== MadeForSTM32 ==
''MadeForSTM32'' is a new quality label delivered by ST and is granted after an extended evaluation process. It helps engineers identify software solutions with the highest level of integration and quality for the STM32 microcontrollers' ecosystem.
+
''MadeForSTM32'' is a quality label delivered by ST and granted after an extended evaluation process. It helps engineers identify software solutions with the highest level of integration and quality for the STM32 microcontrollers' ecosystem.
   
''embOS'' was one of the first solutions to receive the ''MadeForSTM32'' (v1) label in an advanced collaboration of ''SEGGER'' and ''ST Microelectronics'' and has since been certified to ''MadeForSTM32'' (v2) as well. As a result, ''SEGGER'' has published the official ''I-CUBE-EMBOS expansion for STM32CubeMX'', which may be used to generate ready-to-go embOS projects for virtually all Cortex-M devices and various IDEs.
+
''embOS'' was one of the first solutions to receive the ''MadeForSTM32'' (v1) label in an advanced collaboration of ''SEGGER'' and ''ST Microelectronics'' and has since been certified to ''MadeForSTM32'' (v2) as well. As a result, ''SEGGER'' has published the official ''I-CUBE-embOS expansion for STM32CubeMX'', which may be used to generate ready-to-go embOS projects for virtually all Cortex-M devices and various IDEs.
   
 
For more information on ''MadeForSTM32'', please visit [https://www.segger.com/products/rtos/embos/tools/third-party-support/made-for-stm32/ SEGGER.com].
 
For more information on ''MadeForSTM32'', please visit [https://www.segger.com/products/rtos/embos/tools/third-party-support/made-for-stm32/ SEGGER.com].
   
== embOS expansion for STM32CubeMX ==
+
== Creating projects from scratch ==
  +
To use ''embOS'' with ''STM32CubeMX'', customers may either
The '''embOS expansion for STM32CubeMX''' contains the '''embOS CMSIS-Pack''', which may also be used independently of STM32CubeMX.<br />
 
  +
* use the ''I-CUBE-EMBOS expansion for STM32CubeMX'' and adapt it to their desired target hardware,
This article focuses on its usage in STM32CubeMX. For its independent usage, please refer to [[Using embOS in CMSIS-Pack projects]].
 
  +
* generate a project in ''STM32CubeMX'' and subsequently add all generated HAL files and further sources to the shipped ''embOS'' start project for their desired target hardware, or
  +
* generate a project in ''STM32CubeMX'' and subsequently add ''embOS'' to that generated project.
   
  +
This article will walk readers through the latter approach.
=== Download ===
 
The embOS expansion for STM32CubeMX may be obtained from [https://www.segger.com/downloads/embos/SEGGER.I-CUBE-embOS SEGGER.com].
 
   
  +
=== Steps to perform in STM32CubeMX ===
After download, the *.pack-file may be accessed or extracted like a *.zip-file and contains the following files and folders:
 
  +
==== Creating the basic project ====
[[File:ICUBE FolderStructure.png|none|embOS I-CUBE folder structure]]
 
  +
Start ''STM32CubeMX'' and create a project for any specific target hardware. For this walk-through, we create a project for the ''32F429IDISCOVERY'' board, but chosing any different evaluation board or device will work as well. After the project was initialized, feel free to add clock configurations, GPIO settings, third-party middleware compontents and further settings as needed. The result should look similar to the screenshot below:
<br />
 
   
  +
[[File:CubeMX_InitialProject.png|800px]]
{| class="seggertable"
 
|-
 
! style="width: 25%;" | File / Folder || style="width: 70%;" | Description
 
|-
 
| ''Middlewares''\ || Contains the embOS documentation, pre-build libraries, include files and target source files for use with GNU, IAR and Keil toolchains
 
|-
 
| ''Projects''\ || Contains a pre-generated STM32CubeMX example project for the STM3240G-Eval board each for IAR Embedded Workbench, arm Keil µVision, and STM32CubeIDE
 
|-
 
| ''STM32CubeMX''\ || Contains additional source code templates for code generation using STM32CubeMX
 
|-
 
| License.txt || The license agreement under which this software pack is provided
 
|-
 
| ReadMe.txt || Trouble-shooting guide for this software pack (also available in [[#Trouble-shooting]])
 
|-
 
| SEGGER.I-CUBE-embOS.pdsc || The Pack description file for this software pack
 
|}
 
   
  +
When done configuring the project, begin to adapt it for ''embOS'' along the guidelines given in the following sections.
=== Installation ===
 
The embOS expansion for STM32CubeMX may be used as-is: it does not need to be extracted before installing it in STM32CubeMX.
 
<br />
 
   
  +
==== Interrupt priorities for embOS ====
To install it, the following steps should be taken:
 
  +
To prepare the project for use with ''embOS'', care needs to be taken of the required interrupt handlers for using ''embOS'' with [[Cortex-M]] devices. To do so, navigate to ''System Core'' in the menu outline and select ''NVIC''. In the editor window, select the ''NVIC'' tab and check the ''Enabled'' checkbox for both the ''Pendable request for system service'' and ''System tick timer'' as shown below:
# Upon starting STM32CubeMX, select ''Help -> Manage embedded software packages''
 
# Select ''From Local ...'' and specify the downloaded ''SEGGER.I-CUBE-embOS.1.2.0.pack'' (installs V1.2.0 of the pack, file name may differ for later versions)
 
   
  +
[[File:CubeMX_InterruptPriorities.png|800px]]
This will extract the pack to your local ''STM32Cube repository'' and make it available in the Packages Manager as shown below:
 
[[File:embOS CMSIS Installed CubeMX.png|none|embOS expansion for STM32CubeMX installed in STM32CubeMX]]
 
   
  +
Please also note the column ''Preemption Priority''. With ''embOS'' for Cortex-M, specific rules for [[Interrupt prioritization]] apply:
=== Usage ===
 
  +
* embOS utilizes the ''Pendable request for system service'' to perform context switches; it must use the lowest priority in the entire system in all cases. Hence, it gets configured for a priority of ''15'' in this example.
After sucessfull installation, the embOS expansion for STM32CubeMX can be used to generate various projects with embOS.
 
  +
* embOS utilizes the ''System tick timer'' to generate a time base; it may use any valid priority for an embOS interrupt. Typically, however, using the second-to-lowest priority in the entire system is advised. In this example, it therefore gets configured for a priority of ''14''.
<br />
 
  +
* In case your application utilizes further interrupts (that shall use embOS API), please ensure these are configured for [[Interrupt prioritization|valid embOS interrupt priorities]] as well.
Here, a project for the STM3240G-Eval board and the IAR Embedded Workbench is created, but the same steps should be applied when creating a project for any other evaluation board or device and/or any other IDE.
 
   
==== Creating the basic project ====
+
==== Interrupt handler generation for embOS ====
  +
''STM32CubeMX'' may generate handlers for specific interrupt sources.
Start STM32CubeMX and create a project for the desired target hardware. After the project was initialized, feel free to add clock configurations, GPIO settings and further settings as needed. The result should resemble the screenshot below:
 
  +
* Since ''embOS'' includes its own handler implementation for the ''Pendable request for system service'', that handler may not be generated by ''STM32CubeMX''. To disable its creation, switch to the ''Code generation'' tab and uncheck the ''Generate IRQ handler'' checbox for this specific handler.
  +
* While ''embOS'' includes a handler implementation for the ''System tick timer'' as well, a seperate handler should be generated by ''STM32CubeMX''. It should call HAL API functions (enable via according checkbox), which we will later use to call embOS' own handler implementation as a callback.
  +
* In case your application utilizes further interrupts, appropiate handlers for these may be generated as required.
  +
  +
[[File:CubeMX_ISRGeneration.png|800px]]
  +
  +
=== Steps to perform in the IDE and project files ===
  +
==== Integrating embOS ====
  +
After generating the project, open its location in the file system:
  +
  +
[[File:CubeMX_FileSystem.png|800px]]
  +
  +
This folder structure may be extended as needed. For the integration of embOS, for example, you may want to add a folder ''embOS'' with subfolders ''Inc'', ''Lib'', ''SEGGER'', and ''Setup''.
  +
  +
Subsequently, copy all relevant files from your shipment of embOS (or, alternatively, from an embOS evaluation version) to the created subfolders:
  +
# To the ''Inc'' folder, copy all files from {SHIPMENT_ROOT}\Start\Inc\:
  +
## BSP.h (optional)
  +
## BSP_UART.h (optional)
  +
## Global.h
  +
## JLINKMEM.h
  +
## OS_Config.h
  +
## RTOS.h
  +
# To the ''Lib'' folder, copy one appropriate library from {SHIPMENT_ROOT}\Start\Lib\:
  +
#*e.g. for GCC-based projects:
  +
#** libosT7VHLDP.a (debug & profiling build of embOS for ARMv7-M little-endian devices with FPU using the [[GCC floating-point options|hard floating-point ABI]])
  +
#** libosT7VLDP.a (debug & profiling build of embOS for ARMv7-M little-endian devices with FPU using the [[GCC floating-point options|soft floating-point ABI]])
  +
#** libosT7BR.a (release build of embOS for ARMv7-M big-endian devices without FPU)
  +
#** libosT6BDP.a (debug & profiling build of embOS for ARMv6-M big-endian devices)
  +
#*e.g. for IAR-based projects:
  +
#** os7m_tlv_dp.a (debug & profiling build of embOS for ARMv7-M little-endian devices with FPU)
  +
#** os7m_tb__r.a (release build of embOS for ARMv7-M big-endian devices without FPU)
  +
#** os6m_tb__dp.a (debug & profiling build of embOS for ARMv6-M big-endian devices)
  +
#*e.g. for Keil-based projects:
  +
#** osT7VLDP.lib (debug & profiling build of embOS for ARMv7-M little-endian devices with FPU)
  +
#** osT7BR.lib (release build of embOS for ARMv7-M big-endian devices without FPU)
  +
#** osT6BDP.lib (debug & profiling build of embOS for ARMv6-M big-endian devices)
  +
# To the ''SEGGER'' folder, copy all files from an appropriate board support package, e.g. from {SHIPMENT_ROOT}\Start\BoardSupport\ST\STM32F429_STM32F429I_Discovery\SEGGER\:
  +
## SEGGER.h
  +
## SEGGER_RTT.c
  +
## SEGGER_RTT.h
  +
## SEGGER_RTT_ASM_ARMv7M.S (with ARMv7-M devices only)
  +
## SEGGER_RTT_Conf.h
  +
## SEGGER_RTT_printf.c (optional)
  +
## SEGGER_RTT_Syscalls_GCC.c (optional; GCC-specific source file: different name with embOS for IAR and embOS for Keil MDK)
  +
## SEGGER_SYSVIEW.c
  +
## SEGGER_SYSVIEW.h
  +
## SEGGER_SYSVIEW_Conf.h
  +
## SEGGER_SYSVIEW_ConfDefaults.h
  +
## SEGGER_SYSVIEW_Config_embOS.c
  +
## SEGGER_SYSVIEW_embOS.c
  +
## SEGGER_SYSVIEW_embOS.h
  +
## SEGGER_SYSVIEW_Int.h
  +
# To the ''Setup'' folder, copy the following *.c-files from an appropriate board support package, e.g. from {SHIPMENT_ROOT}\Start\BoardSupport\ST\STM32F429_STM32F429I_Discovery\Setup\:
  +
## BSP.c (optional)
  +
## BSP_SDRAM.c (optional)
  +
## JLINKMEM_Process.c
  +
## OS_Error.c
  +
## OS_MallockLock.c (GCC-specific source file: different name with embOS for IAR and embOS for Keil MDK)
  +
## OS_Syscalls.c (GCC-specific source file: different name with embOS for IAR and embOS for Keil MDK)
  +
## RTOSInit_STM32F4xx.c
  +
  +
Open the project and add the folders and files to it. The result should resemble the given example below (which uses the Eclipse-based STM32CubeIDE):
  +
  +
[[File:CubeMX_ProjectTree.png|800px]]
  +
  +
In the next step, configure the include paths for embOS header files:
  +
  +
[[File:CubeMX_Includes.png|800px]]
  +
  +
Configure the linker settings for the embOS library (required with Eclipse-based IDEs, but not with e.g. IAR):
  +
  +
[[File:CubeMX_Lib.png|800px]]
  +
[[File:CubeMX_LibPath.png|800px]]
  +
  +
Configure the preprocessor options for your application (must match the chosen embOS library configuration):
  +
  +
[[File:CubeMX_PreProc.png|800px]]
  +
  +
After these configurations, embOS was fully integrated with the project.
  +
  +
==== Modifications to the linker file ====
  +
embOS expects specific symbols in order to retrieve information about stack and heap in your project:
  +
* __heap_end__
  +
* __heap_start__
  +
* __stack_end__
  +
* __stack_start__
  +
  +
These symbols need to be added to the linker file, which is the generated *.ld-file in the project's root path, as shown below:
  +
  +
[[File:CubeMX_Linker.png|800px]]
   
  +
==== Merging the embOS tick with the generated SysTick_Handler() ====
[[File:CubeMX GenericProject.png|none|Basic project for the STM3240G-Eval in STM32CubeMX]]
 
  +
Since ''STM32CubeMX'' already initializes the hardware timer and the ''SysTick'' interrupt, some configurations inside RTOSInit_*.c must be removed.
   
  +
Open RTOSInit_*.c and perform the following changes to ''OS_InitHW()'':
==== Adding embOS to the project ====
 
Now, select ''Software Packs -> Select components'' and add embOS to the project. To do so, select the required components:
 
* SEGGER.I-CUBE.embOS
 
** RTOS embOS
 
**# embOS API configuration
 
**#* Native (allows usage of embOS native API only)
 
**#* CMSIS-RTOS (allows usage of embOS native API and CMSIS-RTOS (v1) API)
 
**#* CMSIS-RTOS2 (allows usage of embOS native API and CMSIS-RTOS (v2) API)
 
**# [https://www.segger.com/doc/UM01001_embOS.html#Different_builds_of_embOS embOS kernel configuration]
 
**#* Debug and Trace
 
**#* Debug and Profiling
 
**#* Debug
 
**#* Stack check and Profiling
 
**#* Stack check
 
**#* Release
 
**#* Extreme Release
 
   
  +
[[File:CubeMX_RTOSInit_InitHW.png|1200px]]
An optional embOS sample application may be added as well. However, we do not recommend adding one of these with STM32CubeMX, for this will result in duplicate implementations of ''main()''. Instead, we will customize a sample application in STM32CubeMX later on.
 
   
  +
Furthermore, the ''SysTick_Handler()'' for embOS should now be used as a callback for the generated handler. To do so, apply the following modification to RTOSInit_*.c as well:
For example, for a ''Debug and Profiling'' configuration using the native embOS API, the Component Selector window would look as shown below:
 
[[File:embOS CMSIS Configured CubeMX.png|none|embOS CMSIS-Pack project configured in STM32CubeMX]]
 
   
  +
[[File:CubeMX_RTOSInit_SysTick.png|1200px]]
Feel free to add further components as desired.
 
<br />
 
After clsoing the component selector, the selected embOS components need to be activated in the ''Software Packs -> Mode'' view:
 
[[File:embOS CMSIS Enabled CubeMX.png|none|embOS CMSIS-Pack project configured in STM32CubeMX]]
 
   
  +
For the generated handler to actually call the callback function, add the following line to the generated SysTick_Handler() implementation, which can be found in stm32f*_it.c inside the ''Src'' folder of the generated project:
==== Customizing the sample application ====
 
Now, ''Software Packs -> Configuration'' may be used to customize the generation of ''main.c'' (i.e. the sample application) for demonstrating embOS' usage. A real-world application would need to modify the generated source code manually in order to fully customize the application, which is not possible with STM32CubeMX itself.
 
   
  +
[[File:CubeMX_SysTick_Handler.png|800px]]
In this example, we will implement one task body and create two extended tasks executing that body, and also implement and create one software timer. Hence, the ''Tasks'' tab would look like this:
 
[[File:embOS_CubeMX_Tasks.png|none|Tasks tab]]
 
   
  +
==== Handle duplicate syscalls implementation ====
The ''Software timer'' tab would like as follows:
 
  +
The files syscalls.c and sysmem.c should be excluded from build in the project, since their contents are already implemented in OS_Syscalls.c with ''embOS''.
[[File:embOS_CubeMX_Timer.png|none|Timers tab]]
 
  +
The files may be found in the ''Src'' folder:
   
  +
[[File:CubeMX_Excluded_Files.png|200px]]
Feel free to add further embOS objects to your application as desired.
 
   
==== Generating and executing the project ====
+
==== Add an embOS application ====
  +
To use embOS in the project, main.c needs to be modified to include the following:
The STM32CubeMX configuration may now be used to create a project for the desired IDE. In this example, we create a project for IAR Embedded Workbench. After creation, open the project which should resemble the following structure:
 
  +
# Inclusion of RTOS.h
[[File:embOS CubeMX compiled IAR.png|none|embOS CMSIS-Pack project compiled in IAR Embedded Workbench]]
 
  +
# Declaration of task control block and task stack
  +
# A function which will be run as the task
  +
# embOS kernel and task initialization:
  +
## ''OS_Init()''
  +
## ''OS_InitHW()''
  +
## ''OS_TASK_CREATE()'', with task control block, task name, priority, function name and task stack
  +
## ''OS_Start()''
   
  +
The resulting modifications to main.c should therefore resemble the following example:
Subsequently, the project may be compiled without warning or error and executed in hardware.
 
<br />
 
Feel free to modify it and add your own application to the project.
 
   
  +
[[File:CubeMX_Main_embOS.png|800px]]
=== Trouble-shooting ===
 
==== Linker Symbols with arm Keil µVision ====
 
When creating projects for arm Keil µVision, manual modification may be required to the used start-up file (e.g. startup_stm32f407xx.s):
 
<br />
 
If the linker cannot find ''Stack_Mem'', an ''EXPORT'' directive for that symbol is missing in the start-up file. To resolve this, please add
 
EXPORT Stack_Mem
 
to the start-up file.
 
   
  +
Subsequently, the application may be compiled and executed in hardware.
==== Linker Symbols with GNU toolchains ====
 
  +
From here, feel free to modify the initial task, to add further tasks, OS objects and interrupt service routines to create your own embOS application.
When creating projects for GNU toolchains, manual modification may be required to the used linker file (e.g. STM32F407IGHX_FLASH.ld):
 
<br />
 
If the linker cannot find ''__stack_start__'' and/or ''__stack_end__'', these symbols are not defined in the linker file. To resolve this, please replace
 
. = . + _Min_Stack_Size;
 
by
 
__stack_start__ = .;
 
. = . + _Min_Stack_Size;
 
__stack_end__ = .;
 
in the linker file.
 

Revision as of 08:25, 17 June 2021

This article describes how embOS may be used with STM32CubeMX.

For using the I-CUBE-embOS expansion for STM32CubeMX, please refer to Using I-CUBE-embOS with STM32CubeMX.

MadeForSTM32

MadeForSTM32 is a quality label delivered by ST and granted after an extended evaluation process. It helps engineers identify software solutions with the highest level of integration and quality for the STM32 microcontrollers' ecosystem.

embOS was one of the first solutions to receive the MadeForSTM32 (v1) label in an advanced collaboration of SEGGER and ST Microelectronics and has since been certified to MadeForSTM32 (v2) as well. As a result, SEGGER has published the official I-CUBE-embOS expansion for STM32CubeMX, which may be used to generate ready-to-go embOS projects for virtually all Cortex-M devices and various IDEs.

For more information on MadeForSTM32, please visit SEGGER.com.

Creating projects from scratch

To use embOS with STM32CubeMX, customers may either

  • use the I-CUBE-EMBOS expansion for STM32CubeMX and adapt it to their desired target hardware,
  • generate a project in STM32CubeMX and subsequently add all generated HAL files and further sources to the shipped embOS start project for their desired target hardware, or
  • generate a project in STM32CubeMX and subsequently add embOS to that generated project.

This article will walk readers through the latter approach.

Steps to perform in STM32CubeMX

Creating the basic project

Start STM32CubeMX and create a project for any specific target hardware. For this walk-through, we create a project for the 32F429IDISCOVERY board, but chosing any different evaluation board or device will work as well. After the project was initialized, feel free to add clock configurations, GPIO settings, third-party middleware compontents and further settings as needed. The result should look similar to the screenshot below:

CubeMX InitialProject.png

When done configuring the project, begin to adapt it for embOS along the guidelines given in the following sections.

Interrupt priorities for embOS

To prepare the project for use with embOS, care needs to be taken of the required interrupt handlers for using embOS with Cortex-M devices. To do so, navigate to System Core in the menu outline and select NVIC. In the editor window, select the NVIC tab and check the Enabled checkbox for both the Pendable request for system service and System tick timer as shown below:

CubeMX InterruptPriorities.png

Please also note the column Preemption Priority. With embOS for Cortex-M, specific rules for Interrupt prioritization apply:

  • embOS utilizes the Pendable request for system service to perform context switches; it must use the lowest priority in the entire system in all cases. Hence, it gets configured for a priority of 15 in this example.
  • embOS utilizes the System tick timer to generate a time base; it may use any valid priority for an embOS interrupt. Typically, however, using the second-to-lowest priority in the entire system is advised. In this example, it therefore gets configured for a priority of 14.
  • In case your application utilizes further interrupts (that shall use embOS API), please ensure these are configured for valid embOS interrupt priorities as well.

Interrupt handler generation for embOS

STM32CubeMX may generate handlers for specific interrupt sources.

  • Since embOS includes its own handler implementation for the Pendable request for system service, that handler may not be generated by STM32CubeMX. To disable its creation, switch to the Code generation tab and uncheck the Generate IRQ handler checbox for this specific handler.
  • While embOS includes a handler implementation for the System tick timer as well, a seperate handler should be generated by STM32CubeMX. It should call HAL API functions (enable via according checkbox), which we will later use to call embOS' own handler implementation as a callback.
  • In case your application utilizes further interrupts, appropiate handlers for these may be generated as required.

CubeMX ISRGeneration.png

Steps to perform in the IDE and project files

Integrating embOS

After generating the project, open its location in the file system:

CubeMX FileSystem.png

This folder structure may be extended as needed. For the integration of embOS, for example, you may want to add a folder embOS with subfolders Inc, Lib, SEGGER, and Setup.

Subsequently, copy all relevant files from your shipment of embOS (or, alternatively, from an embOS evaluation version) to the created subfolders:

  1. To the Inc folder, copy all files from {SHIPMENT_ROOT}\Start\Inc\:
    1. BSP.h (optional)
    2. BSP_UART.h (optional)
    3. Global.h
    4. JLINKMEM.h
    5. OS_Config.h
    6. RTOS.h
  2. To the Lib folder, copy one appropriate library from {SHIPMENT_ROOT}\Start\Lib\:
    • e.g. for GCC-based projects:
      • libosT7VHLDP.a (debug & profiling build of embOS for ARMv7-M little-endian devices with FPU using the hard floating-point ABI)
      • libosT7VLDP.a (debug & profiling build of embOS for ARMv7-M little-endian devices with FPU using the soft floating-point ABI)
      • libosT7BR.a (release build of embOS for ARMv7-M big-endian devices without FPU)
      • libosT6BDP.a (debug & profiling build of embOS for ARMv6-M big-endian devices)
    • e.g. for IAR-based projects:
      • os7m_tlv_dp.a (debug & profiling build of embOS for ARMv7-M little-endian devices with FPU)
      • os7m_tb__r.a (release build of embOS for ARMv7-M big-endian devices without FPU)
      • os6m_tb__dp.a (debug & profiling build of embOS for ARMv6-M big-endian devices)
    • e.g. for Keil-based projects:
      • osT7VLDP.lib (debug & profiling build of embOS for ARMv7-M little-endian devices with FPU)
      • osT7BR.lib (release build of embOS for ARMv7-M big-endian devices without FPU)
      • osT6BDP.lib (debug & profiling build of embOS for ARMv6-M big-endian devices)
  3. To the SEGGER folder, copy all files from an appropriate board support package, e.g. from {SHIPMENT_ROOT}\Start\BoardSupport\ST\STM32F429_STM32F429I_Discovery\SEGGER\:
    1. SEGGER.h
    2. SEGGER_RTT.c
    3. SEGGER_RTT.h
    4. SEGGER_RTT_ASM_ARMv7M.S (with ARMv7-M devices only)
    5. SEGGER_RTT_Conf.h
    6. SEGGER_RTT_printf.c (optional)
    7. SEGGER_RTT_Syscalls_GCC.c (optional; GCC-specific source file: different name with embOS for IAR and embOS for Keil MDK)
    8. SEGGER_SYSVIEW.c
    9. SEGGER_SYSVIEW.h
    10. SEGGER_SYSVIEW_Conf.h
    11. SEGGER_SYSVIEW_ConfDefaults.h
    12. SEGGER_SYSVIEW_Config_embOS.c
    13. SEGGER_SYSVIEW_embOS.c
    14. SEGGER_SYSVIEW_embOS.h
    15. SEGGER_SYSVIEW_Int.h
  4. To the Setup folder, copy the following *.c-files from an appropriate board support package, e.g. from {SHIPMENT_ROOT}\Start\BoardSupport\ST\STM32F429_STM32F429I_Discovery\Setup\:
    1. BSP.c (optional)
    2. BSP_SDRAM.c (optional)
    3. JLINKMEM_Process.c
    4. OS_Error.c
    5. OS_MallockLock.c (GCC-specific source file: different name with embOS for IAR and embOS for Keil MDK)
    6. OS_Syscalls.c (GCC-specific source file: different name with embOS for IAR and embOS for Keil MDK)
    7. RTOSInit_STM32F4xx.c

Open the project and add the folders and files to it. The result should resemble the given example below (which uses the Eclipse-based STM32CubeIDE):

CubeMX ProjectTree.png

In the next step, configure the include paths for embOS header files:

CubeMX Includes.png

Configure the linker settings for the embOS library (required with Eclipse-based IDEs, but not with e.g. IAR):

CubeMX Lib.png CubeMX LibPath.png

Configure the preprocessor options for your application (must match the chosen embOS library configuration):

CubeMX PreProc.png

After these configurations, embOS was fully integrated with the project.

Modifications to the linker file

embOS expects specific symbols in order to retrieve information about stack and heap in your project:

  • __heap_end__
  • __heap_start__
  • __stack_end__
  • __stack_start__

These symbols need to be added to the linker file, which is the generated *.ld-file in the project's root path, as shown below:

CubeMX Linker.png

Merging the embOS tick with the generated SysTick_Handler()

Since STM32CubeMX already initializes the hardware timer and the SysTick interrupt, some configurations inside RTOSInit_*.c must be removed.

Open RTOSInit_*.c and perform the following changes to OS_InitHW():

CubeMX RTOSInit InitHW.png

Furthermore, the SysTick_Handler() for embOS should now be used as a callback for the generated handler. To do so, apply the following modification to RTOSInit_*.c as well:

CubeMX RTOSInit SysTick.png

For the generated handler to actually call the callback function, add the following line to the generated SysTick_Handler() implementation, which can be found in stm32f*_it.c inside the Src folder of the generated project:

CubeMX SysTick Handler.png

Handle duplicate syscalls implementation

The files syscalls.c and sysmem.c should be excluded from build in the project, since their contents are already implemented in OS_Syscalls.c with embOS. The files may be found in the Src folder:

CubeMX Excluded Files.png

Add an embOS application

To use embOS in the project, main.c needs to be modified to include the following:

  1. Inclusion of RTOS.h
  2. Declaration of task control block and task stack
  3. A function which will be run as the task
  4. embOS kernel and task initialization:
    1. OS_Init()
    2. OS_InitHW()
    3. OS_TASK_CREATE(), with task control block, task name, priority, function name and task stack
    4. OS_Start()

The resulting modifications to main.c should therefore resemble the following example:

CubeMX Main embOS.png

Subsequently, the application may be compiled and executed in hardware. From here, feel free to modify the initial task, to add further tasks, OS objects and interrupt service routines to create your own embOS application.