cancel
Showing results for 
Search instead for 
Did you mean: 

Transitioning to Embedded Systems Development

choco4321
Associate

Hi everyone,

I’ve been working in IT for a while, focusing mainly on cloud computing and Linux environments. However, I’ve recently become really interested in embedded systems and the potential for integrating hardware and software solutions.

I came across some resources and training focused on Linux, which I think might give me a good foundation for the embedded systems world. But now I’m a bit stuck. I’m not sure how to apply that knowledge in a more hardware-specific domain.

I’m curious about how others here have transitioned to embedded systems development. Were there any specific tools, frameworks, or projects that helped you get started? Also, if you have any advice on combining Linux knowledge with real-time operating systems or hardware-level programming, I’d love to hear it.

Thanks in advance for your guidance!

5 REPLIES 5
SofLit
ST Employee

Hello @choco4321 and welcome to the community,

Not clear.

You need to find a specific ST MCU product where especially you can use embedded Linux? or you need to learn the embedded development in general?

Just to focus on ST products: 

- If you need to use embedded LINUX I suggest STM32MPx products (microprocessor products). See the wiki.

- If you need to start from scratch I suggest to use STM32 MCU (microcontroller products). I may suggest STM32F4. You can purchase a board like STM32F4 Discovery. ST offers many tools for developers: STM32CubeMx: as code generator tool. STM32CubeIDE as compiler/debugger.

To give better visibility on the answered topics, please click on "Accept as Solution" on the reply which solved your issue or answered your question.

That rather depends on what you mean by, "embedded systems" here - it is a very wide field!

You've posted in the MCU (micro-controllers) section, but you're talking about Linux.

So are you looking to get into embedded Linux, or are you looking to get into embedded microcontrollers?

https://wiki.st.com/stm32mcu  

For embedded Linux, you should be in the MPU (micro-processors) section ...

https://wiki.st.com/stm32mpu

 

"Embedded Systems" is really a very imprecise term. It means often: "to deal with very hardware centric components, like MCU and board features, how to connect, initialize and use HW extensions (such as sensors) and Firmware (FW)".

An embedded system can run different types (or none) of Operating Systems:

  • "bare metal": it does not have any OS, running as native code controlling the HW directly with all as "user code"
  • "RTOS": using a RealTime OS (such as FreeRTOS or nowadays AzureRTOS, or others, e.g. VxWorks):
    often not separating user and "kernel" code, more to have parallel threads ("cooperative" or "preemptive" multitasking)
  • "embedded Linux" is there are also some boards (and SW systems) implementing a Linux-like OS, often called "microC-Linux" (not full-blown Linux, e.g. no MMU, no virtualization)
  • some boards (larger and more complex MCUs) can also run a full Linux (e.g. Raspberry Pi, PYNQ (FPGA) board)

What is important to know for you (when you want to start with "Embedded Systems"):

  • you might know what a "BSP" is (Board Support Package, in order to "map" a specific HW into your OS)
  • HAL_Drivers: Hardware Abstraction Layer drivers in order to deal with real HW (and abstract the use of HW)
  • the architecture and system of your MCU (you want to use): how to initialize a device (peripheral), how to use it, how to deal with real HW interrupts, execution modes (e.g. TrustZone, secure vs. non-secure)

"Embedded Systems" require a pretty deep understanding of HW, of the MCU chip, the board you want to use. It can end up in tiny details like:

  • how to enable a clocks, a device (peripheral)
  • how to deal with an RTOS (creating threads)
  • how to deal with real HW interrupts (on a low level basis), DMA (programming DMA engines, being aware of "memory layout" (buffers, regions))
  • how to write a FW code which can boot the device (startup code), using LIBs, e.g. for USB stacks, network stacks (LwIP) etc. (these comes often with the decision which RTOS to use)

When you come from Linux system development: BSP might be a very helpful experience. But forget all high-level Linux application development (not applicable on "Embedded Systems"). The highest level you could expect is "MicroPython" - Python environments on MCUs (e.g. PYNQ), but not full blown Python (with all the LIBs possible, still hardware-centric).

On an embedded system you have to bring up all higher layer features "yourself", e.g. a mass storage (such as SD Cards, external SPI/QSPI flash memories, external SRAM), add stacks like a File System (fatFS), network support (lwIP)...
And all requires deep understanding of the MCU, the HW, the board (e.g. configuring clocks, power and pins) and the libraries to use (RTOS, fatFS, lwIP, USB stack, ...).

You might have a good understanding about kernel and user space (often not really available on embedded systems), BSP, HAL, processes (tasks and threads) but you have to learn everything again for a different, very HW centric environment (what is an RTOS task compared to a Linux user process - completely different "beasts" - in principle the same approach, in details just very different "how", often you have just a MPU (not a MMU)).

My suggestion:

  • grab any MCU board (STM, NXP, Renesas, even Raspberry Pi: there is full-blown Linux with RPi 5, smaller as RPi Zero and very small as RPi Pico)
  • be ready to learn a lot about HW, the MCU, the MCU architecture, the boards (schematics), the chips used as external components...
  • decide also with which processor architecture you want to go with (e.g. X86 vs. ARM, ARM is very popular)
  • also to decide which ARM architecture: often the Cortex-M is used, but there are also application processors (Cortex-A), multi-core systems (e.g. QualCom, STM MPUs, processors used in smartphones, with Android):
    those processors cover a wide range: from very simple "bare-metal" MCUs to high-level Android/Linux systems

At the end it is "just" to study manuals, data sheets, application notes, reference manuals, programming manuals and to get familiar with the IDE you want to use. C/C++ knowledge is very helpful (you should have) but with a stronger focus on HW (e.g. why and when is a volatile needed, what is a LinkerScript, what is a memory image, how to flash code and data into memories (e.g. internal ROM flash, external SPI/QSPI flash), how to initialize devices (e.g. SDCard, external RAM controller).

Not magic, just "back to the roots" (and dealing with stuff on a very low level basis).

Start with a "simple" MCU, e.g. single core, as ARM CM0, CM4 or CM7. There are also dual-core MCUs out there up to multi-core application processors (MPUs, ARM A). The "obstacle" for you might be to get familiar "how to deal with HW and MCU features?".

Good luck! 


@tjaekel wrote:
  • some boards (larger and more complex MCUs) can also run a full Linux (e.g. Raspberry Pi, PYNQ (FPGA) board)

They would not (generally) be called MCUs but, rather, MPUs - or "Application processors"

Cortex-M = Microcontrollers;

Cortex-A = Application processors:

AndrewNeil_0-1735985076350.png

https://www.arm.com/architecture/cpu?utm_source=google&utm_medium=cpc&utm_content=text_txt_na_process-architecture&utm_campaign=mk30_brand-paid_architecture_2023_awareness_keyword_na&utm_term=processor%20architecture&gad_source=1&gclid=CjwKCAiA1eO7BhATEiwAm0Ee-A7jO4wB0lyNM6ygOueZdQ_GRR7RsdQz5CWGsu2J...

 


@tjaekel wrote:
  • even Raspberry Pi: there is full-blown Linux with RPi 5, smaller as RPi Zero and very small as RPi Pico 

RPi Pico is a microcontroller (Cortex-M0+) - the other RPis are Cortex-A

https://www.raspberrypi.com/products/raspberry-pi-pico/

Pavel A.
Evangelist III

Hi!

 But now I’m a bit stuck. I’m not sure how to apply that knowledge in a more hardware-specific domain.

General software development culture and background will be very welcome and helpful: Unix/Linux scripting, version control, CI, editors and various tools. Experience with C and make - wonderful. Experience in unit testing - wonderful. Linux kernel, modules, device tree - brilliant.

Otherwise, IT, Linux, cloud and system admin experience is not directly applicable.

I’m curious about how others here have transitioned to embedded systems development.

Most of these stories are ancient and not useful anymore. This is like you want to see the Cats on the Broadway, but it's no more.

IMHO the best way to get there is to get involved (hired) into a multidisciplinary project with embedded parts, as a Linux, devops, tooling person - then gradually move to the embedded direction. Another variant: join a "consulting" type company that takes various kinds of projects; help co-workers that do embedded projects (that is the only viable path for 40+ folks).