Embedded

What Is Embedded Programming? A Plain-English Introduction

Walk through a normal day. You wake up to an alarm on a smartwatch. The coffee machine brews on a timer. The car unlocks when your phone gets close, then warms the cabin, logs tyre pressure, and quietly adjusts fuel injection sixty times a second. Your office building knows how many people are in the lift. Your laptop charger negotiates voltage with the laptop before delivering power.

Every one of those is a computer. None of them look like a computer. That gap — between what we think of as "software" and where software actually runs — is the world of embedded programming.

A working definition

An embedded system is a computer built into a larger product, where the computer is not the point of the product. The point of a washing machine is to wash clothes. The microcontroller inside it is a means to that end. Contrast that with a laptop: the computer is the product.

That framing matters because it shapes every design decision that follows. Embedded hardware is usually cheap, usually small, usually low-power, and usually built around exactly the capabilities the product needs and nothing more. A microcontroller in a toaster does not need a GPU. A sensor node on a cow's ear does not need a full Linux kernel.

The corollary: embedded programmers spend a lot of time working close to the hardware, counting bytes, chasing timing bugs with an oscilloscope, and writing code that will run unchanged for ten years in a field somewhere with no ability to push an update.

flowchart LR MCU[[Microcontroller
CPU · Flash · RAM]] Sensor[Sensors
Temp · Motion · Light] Actuator[Actuators
Motor · Relay · LED] Comms[Connectivity
BLE · Wi-Fi · CAN] Power[Power
Battery · Regulator] UI[Interface
Display · Buttons] Sensor -->|ADC · I2C · SPI| MCU MCU -->|PWM · GPIO| Actuator MCU <-->|UART · SPI| Comms Power -->|3.3V / 5V| MCU MCU <-->|SPI · I2C| UI

A typical embedded system: the microcontroller at the centre, peripherals attached through standard buses.

How it differs from regular programming

If you have written Python, JavaScript, or a typical backend service, a few things will feel different on day one of an embedded project.

Resources are brutal

A cheap microcontroller might have 32 KB of flash memory for your code and 8 KB of RAM for everything that happens at runtime. That is not a typo. Your JavaScript single-page app ships more bytes of JSON per page load than an entire thermostat firmware.

This changes your instincts. You do not casually reach for a linked list when a fixed-size array will do. You do not allocate memory dynamically in a hot loop. You do not pull in a library because it has a nice API — every kilobyte is accounted for on the linker map.

Real-time means what it says

In a web app, a 50 ms delay is invisible. In an anti-lock braking system, a 50 ms delay kills people. Embedded systems routinely have hard real-time requirements: the code must respond within a guaranteed window, every time, or the product fails. This is not the same as "fast". A slow but predictable system beats a fast but occasionally stuttering one.

You often have no operating system

A lot of embedded code runs bare metal: no OS, no scheduler, no file system, no dynamic loader. Your program is the only thing alive on the chip. When the processor boots, it literally jumps to the first instruction of your code.

Other embedded systems run a real-time operating system (RTOS) like FreeRTOS or Zephyr, which gives you tasks and priorities but is still orders of magnitude smaller than Linux. A handful of embedded devices — routers, smart TVs, industrial gateways — run embedded Linux, which is much closer to what a backend developer is used to. But those are the exception, not the rule.

Hardware is not abstract

In a web app, "the database" is something that exists. In an embedded project, if you want to read a temperature, you configure specific pins, set up a specific peripheral, handle the interrupt it fires, and translate a raw 12-bit ADC reading into degrees Celsius using a calibration curve. The abstractions are thin and leaky on purpose, because every layer of indirection costs time and bytes.

What the hardware actually looks like

The chip at the centre of an embedded system is usually one of three things:

8-bit microcontrollers

The old guard. The AVR family (made famous by Arduino) and the 8051 architecture still ship in enormous volumes because they are dirt cheap, extremely well understood, and more than enough for a washing machine controller or a remote control. You will see these in cost-sensitive consumer goods.

32-bit ARM Cortex-M

The workhorse of modern embedded. Cortex-M0 at the bottom, Cortex-M4 and M7 higher up. These are the chips inside your fitness tracker, your drone's flight controller, your EV charger. STMicroelectronics, Nordic, Microchip, NXP, and Raspberry Pi Pico (RP2040) all ship Cortex-M parts. If you are starting today, this is where you should focus.

Wi-Fi / Bluetooth SoCs

The ESP32 from Espressif deserves its own category. It costs a few dollars, comes with Wi-Fi and Bluetooth built in, has enough horsepower to run non-trivial applications, and has a huge community around it. For any hobby or prototype project that needs connectivity, it is the default starting point.

Above these sit single-board computers (Raspberry Pi, BeagleBone) and industrial processors running embedded Linux. These blur into general-purpose computing, so whether you call them "embedded" depends on who you ask.

The languages you will actually write

C is still the lingua franca. Every chip vendor ships a C toolchain. Every serious RTOS is written in C. Every reference manual assumes C. If you read only one embedded language deeply, read C.

C++ is increasingly common on 32-bit parts. The zero-cost abstractions (templates, constexpr, strong typing) are a genuine improvement over C when used carefully. The Arduino framework is C++ under the hood, even though it looks friendly. We cover the tradeoffs in C vs C++ for Embedded Systems.

Rust is the emerging third option. The embedded Rust ecosystem is real and growing, particularly on Cortex-M. Memory safety without a garbage collector is a genuinely attractive pitch for firmware, which is historically the most bug-prone code a company ships.

Assembly you will write occasionally: the reset handler, a critical interrupt routine, a bootloader. Nowhere near as much as people imagine. Modern compilers are better than most humans at this.

MicroPython and CircuitPython exist and are wonderful for prototyping, but they are not what shipping products are written in. Save them for teaching and quick hacks.

Where to start if you are curious

The tempting answer is to buy the cheapest Arduino kit and start blinking LEDs. Do that if you have never touched a microcontroller — the satisfaction of making a physical thing respond to your code is the same hook it has always been.

Once the novelty of blinking LEDs wears off, graduate to an ESP32 or an STM32 Nucleo board. Both cost under $20, both have serious industry use, and both force you to engage with real peripherals (SPI, I2C, UART, timers, DMA) rather than Arduino's friendlier wrappers.

Read Making Embedded Systems by Elecia White and Patterns for Time-Triggered Embedded Systems by Michael Pont. The first is the best modern introduction. The second will change how you think about scheduling.

Then build something real. A temperature logger that writes to an SD card. A wireless sensor that reports to an MQTT broker. A motor controller. The distance from "I can blink an LED" to "I can ship a product" is long, but it is walkable.

Frequently Asked Questions

Is embedded programming harder than regular software development?

Harder in some ways, easier in others. The debugging is harder because you often cannot just print and read the output — you might be staring at an oscilloscope trace trying to work out why a signal is drifting. The design space is smaller because the hardware constrains you, which some people find restful after years of infinite-choice frontend work.

Do I need an electrical engineering degree?

No, but you will need to learn enough electronics to read a schematic, understand voltages and currents, and reason about what happens when a signal has noise. A weekend with a multimeter and a breadboard covers more ground than people expect. The deep EE stuff (PCB layout, signal integrity, EMC) is a specialisation you pick up if you need it.

What is the starting salary for embedded engineers?

Generally lower than web development at the junior level, and roughly equivalent to a senior backend engineer once you specialise. The field rewards depth — a senior firmware engineer with ten years of experience on real products is genuinely scarce and paid accordingly, particularly in automotive, medical, and aerospace.

Is embedded dying because of cloud and AI?

The opposite. Every IoT device, every robot, every EV, every drone, every smart appliance is an embedded system with new requirements. AI is increasingly running on the edge (TinyML, neural network inference on microcontrollers) which is an entire new frontier inside embedded. The field has never been busier.

Share your thoughts

Worked with this in production and have a story to share, or disagree with a tradeoff? Email us at support@mybytenest.com — we read everything.