Most embedded failures are not caused by a bad driver or a bug someone could have caught in isolation. They appear where disciplines intersect, such as when a hardware decision constrains the firmware, or at any other boundary between layers. By the time those issues become visible, redesign is often far more expensive than getting the original implementation right.
The fix is to treat the whole device as one system rather than a stack of separate layers. Hardware, firmware, connectivity, cloud, security, and compliance all influence one another. Therefore, a decision in one creates constraints in the rest, and the teams that ship cleanly are the ones that see those connections instead of working a layer at a time. That system-level view is what keeps small early decisions from turning into late, expensive redesigns.
Building that view means understanding each piece, which is what the rest of this guide covers: the architecture, the development process, the technologies, and the compliance requirements that decide whether a product reaches the market smoothly or runs into expensive integration challenges along the way.
|
Key takeaways
|
Embedded software vs embedded systems
An embedded system is the complete, purpose-built device: the hardware (a microcontroller or processor, the board, its sensors, and peripherals) together with the code that runs on it. A connected insulin pump and an engine control unit are both embedded systems.
Embedded software is the code layer inside that device. It runs directly on constrained hardware to perform one dedicated job, from firmware and drivers up to the application logic.
So embedded systems development covers the full product, hardware, and software engineered as one unit. Embedded software development is the discipline focused on the code that brings the hardware to life. The two overlap constantly in practice, which is why Yalantis engineers the device as one system rather than two handoffs, from PCB to cloud, so a choice in any layer accounts for the rest.
Embedded system architecture
An embedded system is made up of several layers, from the hardware at the bottom to the application logic at the top. Each layer serves a different purpose, but the product succeeds only when they work together as a single system.
In embedded systems development, the biggest challenges often emerge where those layers interact. A driver may interpret sensor data incorrectly, a connectivity stack may exceed the device’s memory budget, or a cloud update may introduce behavior the firmware was never designed to handle. Understanding those dependencies is just as important as designing the individual layers themselves.
The architecture below shows how the layers fit together and where integration risks tend to concentrate.
The hardware foundation
Every embedded system starts with physical hardware: the processor or microcontroller, the board, and the peripherals it drives. The choices made here, from the MCU to the power budget, set hard limits on everything the software can do above them. Because building the hardware is a discipline of its own, we cover it in our hardware development guide. For now, let’s focus on the software that lives inside those limits.
Firmware and board support
Directly above the hardware sits the firmware layer: the bootloader, device drivers, and board support package (BSP). Together, they provide the interface between the board and the software running above it, allowing higher layers to work without knowing the details of the underlying hardware.
Firmware is responsible for far more than hardware access. It controls how a device starts, recovers from failures, communicates with peripherals, and receives updates throughout its lifecycle. A flaw at this layer can be difficult to diagnose because symptoms often appear elsewhere in the system.
For a deeper look at firmware architecture, development practices, and update strategies, see our guide to firmware development for embedded IoT devices.
The runtime: RTOS, OS, or bare-metal
The runtime layer determines how software executes on a device. Some embedded systems run bare-metal, where the application interacts directly with the hardware for maximum control and minimal resource usage. Others rely on a real-time operating system (RTOS) such as FreeRTOS or Zephyr to coordinate multiple time-sensitive tasks, while more capable devices may use embedded Linux to support networking, user interfaces, and complex applications.
The key concern at this layer is predictability. A system that behaves correctly under light load can fail when competing tasks, interrupts, or communication events arrive at the same time. Choosing the right runtime is therefore less about features and more about ensuring the device can consistently meet its timing and performance requirements.
Middleware and connectivity
Middleware sits between the runtime and the application layer. It includes communication protocols, networking stacks, connectivity services, and the software components that move data between the device and the outside world.
This layer is where an embedded system becomes part of a larger ecosystem. Depending on the product, that may involve Bluetooth, Wi-Fi, cellular connectivity, Ethernet, or low-power technologies such as LoRaWAN. Each option introduces different tradeoffs in range, bandwidth, power consumption, latency, and security.
Many integration issues emerge here because communication has to work across multiple systems rather than within a single device. A product may perform flawlessly during local testing yet encounter reliability, performance, or interoperability problems once it begins exchanging data with gateways, cloud platforms, mobile applications, or other connected devices.
The application layer
The application layer contains the functionality users actually care about. In a medical device, it may calculate a dosage. In an industrial system, it may process sensor readings and trigger actions. While it sits at the top of the software stack, its reliability depends on everything beneath it, from the drivers interacting with the hardware to the connectivity services exchanging data with external systems.
The application layer is also where more embedded devices now perform local data processing and AI inference. Running compact models directly on the device can reduce latency, lower bandwidth usage, and keep sensitive data from leaving the edge, though it also introduces new demands on memory, processing power, and energy consumption.
|
💡 Pro tip Assign ownership not only to individual layers, but also to the boundaries between them. Many costly issues emerge where one component depends on assumptions made by another, such as firmware interacting with the runtime or connectivity services competing for limited memory. Clear ownership helps identify and resolve those risks before they reach production. |
The importance of each layer depends on the type of embedded system being built, which is what we’ll discuss next.
Building a product where the software has to behave across every layer?
Yalantis builds embedded software from the firmware up, engineered to hold together at the seams where most devices fail.
Types of embedded systems
Every embedded system uses the same building blocks, but not every system places the same demands on them. A motor controller lives and dies by timing. A connected sensor depends on reliable communication. A wearable device may be constrained primarily by battery life.
Most products combine several characteristics at once. A connected insulin pump, for example, is simultaneously real-time, networked, and battery-powered. Understanding which requirements matter most helps teams focus on the layers that carry the greatest technical and business risk.
The categories below provide a practical way to think about embedded systems and the engineering priorities that come with each type.
In practice, IoT device development combines two or three of these, and the combination decides how much discipline the build needs. A standalone kitchen timer and a networked, real-time medical device will have completely different development processes.
The embedded software development process and life cycle
The development process has to match the cost of failure. A defect in a consumer device may be inconvenient. A defect in a medical or industrial system can create safety, regulatory, and legal risks.
That is why embedded teams rarely rely on a single methodology. The V-model provides the traceability and verification required for safety-critical work, while agile helps teams iterate faster on software components that can change more easily. Most successful projects blend the two, balancing rigor where it is required with flexibility where it is possible.
The V-model and why regulated work depends on it
The V-model is the embedded systems development life cycle that pairs every design step on the way down with a matching test on the way up. Requirements go together with acceptance testing, architecture with system testing, module design with integration testing, and code with unit testing. The shape forces traceability. Every requirement has a test that proves it, and every test traces back to a requirement, which is exactly what an auditor for IEC 62304 or ISO 26262 asks you to show.
That is why verification is not a phase you reach at the end. Testing is planned on the way down and run on the way up, so a gap in the requirements shows up as a gap in the test plan long before it reaches a device. Building those checkpoints into every step, rather than saving them for a final gate, is the heart of Compliance-First Engineering, and it is the difference between a calm certification and a scramble.
Agile adaptations for the software layers
Not every part of an embedded system requires the same level of process rigor. Software components are generally faster and less expensive to change than hardware, making them a natural fit for iterative development. Firmware can be rebuilt and reflashed quickly, while application and cloud services often evolve through short release cycles and continuous feedback.
Hardware development follows a different rhythm. Board revisions take time, and certification activities introduce checkpoints that cannot be accelerated through shorter sprints. To keep hardware and software moving in parallel, teams need a stable interface between them. Clear definitions for registers, protocols, and data structures allow software development to continue without waiting for every hardware change.
|
💡 Pro tip Freeze the hardware-software interface before firmware sprints begin, and version every change to it. Parallel work only stays fast while that contract holds still, and a quietly shifting register map is what most often stalls a firmware team. |
How an AI-powered PDLC speeds up delivery
Many of the most expensive embedded problems originate long before implementation begins. Architecture assumptions, missing requirements, and overlooked edge cases often surface months later as integration issues. AI can help identify those risks earlier by analyzing requirements, validating proposed architectures, and assisting with documentation and test planning.
At Yalantis, AI supports the product development lifecycle while engineers retain ownership of every decision that reaches production. Learn more in our guide to AI in the product development lifecycle.
Programming languages and toolchains for embedded development
Embedded devices often have strict limits on memory, processing power, and energy consumption. Besides that, they also interact directly with hardware and, in some cases, safety-critical systems. Those requirements leave little room for abstraction or inefficiency, which is why embedded development relies on a relatively small set of languages. Today, C, C++, and Rust dominate most embedded software projects.
| Language |
Strengths |
Watch out for |
Where it fits |
| C |
Runs on virtually every MCU, minimal footprint, direct control of memory and registers |
Manual memory management makes memory-safety bugs easy to introduce |
Drivers, RTOS internals, bare-metal, tightly constrained devices |
|
C++ |
Adds structure to C through classes and RAII without giving up low-level control |
Larger footprint and added complexity can work against determinism |
Larger embedded applications that benefit from organization |
|
Rust |
Removes whole classes of memory bugs at compile time, with no garbage collector |
Smaller talent pool and newer to embedded than C |
Safety-critical and security-critical firmware |
C and C++
C is the default language of embedded work, and has been for decades. Every microcontroller ships with a C compiler, the footprint is minimal, and it gives you direct control over memory and registers. C++ adds structure on top, classes, and RAII, for larger applications that benefit from organization without giving up that low-level control.
Their shared weakness is also decades old. Both leave memory management to the developer, and a single mistake, a buffer that overruns, or a pointer used after it is freed, becomes the kind of defect that ships and then gets exploited in the field.
Rust for memory-safe embedded
Development with Rust changes that equation. It enforces memory safety at compile time through its ownership model, so the buffer overruns and use-after-free bugs that plague C and C++ are caught before the code ever runs. Moreover, Rust does this with no garbage collector and no runtime cost, which is what makes it viable on a device with 256KB of RAM. Memory safety has become a major industry concern: CISA and the NSA report that roughly 70% of serious security vulnerabilities trace back to memory-safety issues, and both now urge a move to memory-safe languages.
In practice, adopting Rust rarely means rewriting an entire codebase. Most teams introduce it gradually, replacing individual components while the rest of the firmware continues running in C or C++. A security-sensitive module, such as a communication stack, credential manager, or secure boot component, can be rewritten in Rust and integrated with the existing code. That approach allows teams to improve safety where the risk is highest without disrupting a stable product. We explain the process in more detail in our guide to migrating from C/C++ to Rust.
|
💡 Pro tip Start with a well-defined module rather than a full migration. Components such as telemetry handlers, communication stacks, or security services can often be rewritten and validated independently before being integrated back into the existing firmware. That approach delivers meaningful safety benefits while keeping migration risk low. |
For safety-critical projects, certified toolchains such as Ferrocene also help Rust satisfy the review and traceability requirements of standards, including IEC 62304 and ISO 26262.
Toolchains, debuggers, and emulators
Writing the code is only half the job, because embedded software does not run where you write it. You build it on a workstation and deploy it to a device with its own processor, memory constraints, and hardware interfaces, which makes the toolchain a core part of the engineering process.
Several categories of tools support that work. Cross-compilers generate code for the target architecture. On-chip debuggers connect through interfaces such as JTAG or SWD, allowing engineers to inspect memory and execution state directly on the device. Emulators such as QEMU and Renode make it possible to test firmware before physical hardware is available, helping hardware and software teams work in parallel. Vendor SDKs, including STM32Cube and similar frameworks, provide the drivers, libraries, and configuration tools needed for specific chip families.
Growing adoption of Edge AI makes that relationship even tighter. Running TinyML models directly on a device can reduce latency and bandwidth usage, but it also increases demands on memory, processing power, and energy consumption. Those tradeoffs illustrate a broader reality of embedded development: software capabilities are always shaped by hardware constraints.
Hardware and embedded software co-design
Hardware and software are often discussed as separate disciplines, but embedded systems development requires a design around both at the same time. Every hardware decision influences the software, and every software requirement places demands on the hardware. That relationship is a major source of integration risk, which is why hardware and software integration has to begin long before either side is considered complete.
Designing software against the hardware’s limits
Unlike traditional application development, embedded software design starts with fixed constraints. The processor, memory, power budget, and peripherals are already defined, and the software has to operate within those limits.
Memory is often the first constraint. A microcontroller may have only a few hundred kilobytes of RAM, forcing developers to carefully manage buffers, memory allocation, and resource usage. Power is another. On battery-powered devices, firmware plays a direct role in determining battery life by controlling when the processor sleeps and wakes.
Hardware choices also shape timing requirements and peripheral interactions. The sensors, radios, and interfaces available on the board influence everything from driver implementation to interrupt handling. In many real-time systems, meeting timing requirements becomes a core part of the architecture rather than a performance optimization.
The relationship works in both directions. Software requirements can just as easily influence hardware selection. A communication stack may require more memory than the chosen processor provides. Secure boot may require hardware security features that are not available on the selected chip. Identifying those dependencies early helps teams avoid costly redesigns later in the project.
From device to edge to cloud
Most connected products are part of a larger system that extends beyond the device itself. Data may be processed on the device, passed through an edge gateway, and ultimately stored or analyzed in the cloud. One of the most important architectural decisions is determining where each workload should run.
Processing data on the device can reduce latency, lower bandwidth usage, and keep sensitive information local. Moving workloads to the cloud provides greater computing capacity and simplifies updates and analytics. The balance between the two affects everything from processor selection and memory requirements to connectivity and power consumption.
Several capabilities should be planned from the beginning rather than added later. Over-the-air updates require a secure and reliable mechanism for delivering firmware to devices in the field. Device provisioning, monitoring, and fleet management also need to be considered early, since supporting thousands of deployed devices is an architectural requirement, not an operational detail.
Connectivity decisions follow the same principle. Whether a product relies on Bluetooth, Wi-Fi, cellular networks, Ethernet, or low-power technologies such as LoRaWAN depends on tradeoffs between range, bandwidth, latency, power consumption, and cost.
|
💡 Pro tip Decide what runs on the device and what runs in the cloud before selecting the hardware platform. That decision directly influences memory, processing, connectivity, and power requirements. Revisiting it after the hardware is chosen often leads to expensive compromises or a complete redesign. |
Every connection added to a device also expands its attack surface. Update mechanisms, wireless interfaces, and cloud integrations create new security risks that must be addressed as part of the architecture, which brings us to the next topic: securing embedded systems.
How to secure embedded systems
Securing an embedded device requires a different mindset than securing a server. Attackers may have direct physical access to the hardware, the firmware, and the communication interfaces. A weakness anywhere in the stack can undermine every protection built above it.
Microsoft’s Security Signals research found that 80% of organizations had a firmware attack within two years, and most security programs still spend their attention higher up the stack, where it is already too late.
Before you go deeper into our guide to preventing firmware vulnerabilities, let’s review four tips to secure embedded systems:
1. Establish a trusted boot process
Secure boot ensures that only authorized firmware can run on the device. Each stage of the startup sequence verifies the next before handing over control, creating a chain of trust anchored in hardware security features. Without that verification process, malicious or modified firmware can bypass every security mechanism that follows.
2. Protect secrets and device identities
Cryptographic keys should be stored in dedicated secure hardware rather than inside firmware images or source repositories. Protecting device credentials is essential for authentication, secure communication, and software update verification.
3. Secure data and communications
Sensitive data should be encrypted both while stored on the device and while moving across networks. Communication channels, APIs, and device-to-cloud connections all require authentication and encryption to prevent interception or tampering.
4. Build a secure update mechanism
Over-the-air (OTA) updates should be digitally signed and verified before installation. Devices also need a rollback mechanism so they can recover safely if an update fails or becomes corrupted.
No single control secures a product on its own. Effective security comes from combining these measures into a layered architecture that protects the device throughout its lifecycle.
How to build compliant embedded systems
Whether you can legally sell a connected product often comes down to compliance, and for embedded software, it is less a final test than an evidence trail the code carries from the first requirement. The V-model from earlier is how that trail gets built. This section is about what the standards actually demand of the software.
The requirements fall into a few families that cut across industries. Functional safety standards govern how the software prevents and contains dangerous failures, and security standards govern how it resists attack. A third group covers data and privacy. The specific names attach to specific industries, which the next section covers.
One requirement now applies to nearly every connected product sold in Europe. The EU Cyber Resilience Act mandates secure-by-design engineering, a software bill of materials, and security updates across a product’s supported lifetime. It entered into force in December 2024, with full obligations from December 2027 and fines reaching 15 million euros or 2.5% of global turnover, so the time to design lifecycle security support is now.
In practice, compliance shows up in the code as concrete artifacts: a traceability matrix linking each requirement to its test, static analysis against a coding standard such as MISRA C run as a gate, a generated SBOM, and documented test evidence that an auditor can follow. Build these as you go, and certification is a review. Retrofit them at the end, and it is a rebuild.
Facing certifications you have not run before?
Yalantis holds ISO 13485, ISO 27001, and ISO 27701, and our compliance specialists plan them into the build from the start.
Embedded systems development in key industries
Different industries put different pressure on embedded products. A medical wearable, a vehicle control unit, an industrial gateway, and a logistics tracker may all run firmware close to hardware, but they fail in different ways. One device can create patient safety risks. Another can stop a production line. Another can drain its battery before the shipment reaches its destination.
That is why software development for embedded systems has to start with the operating context, not with the codebase alone. Teams need to understand what the device controls, where it runs, how often it can be updated, which standards apply, and what happens when the software behaves incorrectly.
Healthcare and medical devices
Embedded systems development for medical devices is shaped by risk classification, traceability, and verification depth. Under IEC 62304, software is classified from Class A to Class C depending on the possible harm caused by failure. Class A covers software where no injury is possible, while Class C applies when a failure could lead to death or serious injury.
That classification changes the engineering work. A Class C product needs stronger architecture separation, clearer requirements, stricter testing, and more evidence that each requirement has been implemented and verified. The standard is not just a documentation burden. It forces teams to prove that safety-related behavior is designed, tested, and controlled across the whole development path.
Memory safety also matters more in healthcare because small defects can affect regulated product behavior. A memory fault in a consumer gadget may lead to a reboot. A memory fault in a connected medical device can compromise monitoring, data integrity, or therapy-related functions. For that reason, embedded systems development for healthcare often relies on stricter coding practices, static analysis, defensive design, and languages or tooling that reduce unsafe memory behavior.
The same logic applies to embedded systems development for wearable tech. Wearables have strict limits on battery life, memory, connectivity, and enclosure size, yet they often collect sensitive physiological data. A pulse oximeter, ECG monitor, insulin-related device, or rehabilitation sensor needs stable firmware, reliable data capture, secure transmission, and a clear update path. The device may be small, but the software responsibilities are not.
Automotive
Automotive embedded software development is driven by functional safety, real-time behavior, and system complexity. Modern vehicles contain many electronic control units that interact across braking, steering, battery management, infotainment, telematics, driver assistance, and body control systems. A defect in one component can affect other parts of the vehicle if the architecture does not isolate risks properly.
ISO 26262 addresses this problem through ASIL levels from A to D. The higher the risk, the stronger the safety requirements. In practice, that means clear separation between critical and non-critical components, predictable timing, controlled communication, and strong verification evidence.
Memory-safe engineering is also becoming more relevant in automotive systems. A single memory fault can break a safety goal, corrupt a control signal, or create behavior that is difficult to reproduce during testing. That is why suppliers increasingly evaluate safer language subsets, stricter C/C++ practices, runtime protections, and Rust-based components where they fit the architecture and certification path.
Industrial manufacturing
Industrial environments put embedded systems under physical, operational, and security pressure. Devices may run near vibration, dust, heat, electrical noise, or unstable connectivity. They also often control real equipment: motors, valves, conveyors, sensors, gateways, and safety-related automation components.
That makes embedded systems security development especially important in industrial and manufacturing systems. A firmware defect can stop production, but a security defect can give attackers access to operational technology networks. Secure boot, hardware roots of trust, signed firmware, device identity, encrypted communication, access control, and safe update mechanisms become core engineering requirements rather than optional add-ons.
Real-time behavior is another major constraint. A cloud application can usually tolerate a small delay. A controller on a factory floor often cannot. Embedded software has to process sensor input, trigger outputs, and keep timing guarantees while staying stable over long operating periods. For AI-enabled inspection or predictive maintenance systems, edge processing may also be required when latency, bandwidth, or data privacy makes cloud-only processing impractical.
Logistics and supply chain
Logistics devices usually face a different set of constraints. Trackers, cold-chain sensors, smart containers, and fleet devices must work for long periods with limited battery capacity and inconsistent connectivity. They may travel through areas with weak network coverage, harsh temperatures, and limited access for physical maintenance.
In this environment, embedded system software development focuses on low-power design, resilient connectivity, local data buffering, and dependable over-the-air updates. The device must keep collecting data when the network drops, store events safely, and sync them once the connection returns. Poor power management can make the hardware useless before the shipment arrives, while a weak update mechanism can leave thousands of devices exposed or outdated in the field.
Cold-chain logistics adds another layer of responsibility. Sensors need to record temperature, humidity, shock, or location reliably because that data may prove whether pharmaceuticals, food, or sensitive materials stayed within acceptable limits. The embedded system has to protect both the measurement process and the data trail.
Best practices for embedded software development
The disciplines that separate reliable embedded software from the rest are the ones that fight the cost-of-change curve, catching problems while they are still cheap to fix. Most of them are about visibility and repeatability on hardware that gives you neither for free.
- Test on real hardware, automatically. Emulators catch logic errors, but timing and peripheral bugs only show up on the target, so put hardware-in-the-loop tests in your pipeline rather than running them by hand at the end.
- Gate every merge on static analysis. A checker enforcing a coding standard, such as MISRA C, stops a whole class of defects before a human ever reviews the code.
- Make builds reproducible. Pin your toolchain and dependency versions so the image you certified is provably the image you shipped, which matters as much for audits as for debugging.
- Build in observability. A device with no screen can still tell you why it failed if you design structured logging and diagnostics early.
- Measure, never assume. Profile power draw and timing on the actual chip, because instincts carried over from desktop or server work are usually wrong on a microcontroller.
- Plan for recovery, not just updates. A device has to survive a power loss in the middle of an update, so design a fail-safe boot and a known-good fallback, not only the OTA path itself.
Knowing what good embedded engineering looks like is one thing. Building a team that can deliver it consistently is another challenge, which brings us to the choice of the right embedded software development partner.
How to choose an embedded software development partner
Choosing between building in-house and outsourcing depends on factors such as available expertise, delivery timelines, regulatory requirements, and investment in hardware labs and testing equipment. Let’s focus on what separates a capable embedded software development partner from a general software vendor.
Look for a team that demonstrates expertise across the entire embedded stack rather than in firmware alone:
- C, C++, and Rust expertise. A strong partner understands when each language is the right choice instead of applying the same technology to every project.
- Experience with bare-metal and RTOS development. Runtime selection should follow the product’s requirements, not the team’s existing preferences.
- Security is built into the engineering process. Secure boot, key management, encrypted communication, and signed OTA updates should be standard engineering practices rather than optional services.
- Proven experience in regulated industries. Look for evidence of traceable development processes, V-model delivery where appropriate, and familiarity with standards such as IEC 62304, ISO 26262, or IEC 62443.
- Knowledge of your hardware ecosystem. Experience with the MCU families, connectivity protocols, and development tools your product depends on reduces integration risk from the start.
- End-to-end delivery capabilities. Hardware, firmware, cloud infrastructure, connectivity, and device management should work together as one engineering effort. Keeping those responsibilities within a single team reduces handoffs, improves accountability, and helps integration issues surface earlier.
Yalantis delivers embedded systems end-to-end, combining firmware development in C, C++, and Rust with hardware engineering, cloud integration, security, and compliance. Our engineers support projects from prototype through production, helping companies build connected devices that meet demanding reliability and regulatory requirements.
Looking for an embedded partner who owns the whole stack?
From firmware to cloud, with compliance engineered in from day one.
FAQ
What is firmware in an embedded system?
Firmware is the low-level software that runs directly on the device’s hardware and controls it, sitting between the silicon and the application. It includes the bootloader that brings the device up, the drivers for its sensors and radios, and the board support package that adapts the runtime to that specific board. Because the rest of the system cannot function until firmware has set up the hardware correctly, it belongs on the critical path rather than being treated as a finishing touch.
What are the main stages of the embedded software development life cycle?
Most embedded projects move through requirements, architecture and design, implementation, integration, verification and validation, and then deployment with ongoing maintenance. In regulated work these stages follow a V-model, where each design stage is matched to a test that proves it, so verification is planned from the start rather than added at the end.
What standards apply to embedded software development?
It depends on the market, but a few recur. IEC 62304 governs medical device software and pairs with ISO 13485 for the quality system. ISO 26262 covers automotive functional safety, while IEC 62443 addresses industrial control security. ISO 27001 and ISO 27701 cover information security and privacy, and the EU Cyber Resilience Act now sets secure-by-design and update obligations for almost any connected product sold in Europe.
What is the role of embedded systems in IoT?
The embedded system is the thing in the Internet of Things. It is the device itself, the sensor, controller, or gateway, running the firmware that reads the physical world and connects it to the network. IoT adds the cloud and fleet management on top, but every connected product still rests on an embedded system at the edge, whose memory and power limits shape what the wider system can do.
What is HMI in an embedded system?
HMI stands for human-machine interface: the part of an embedded device a person interacts with, from a simple set of buttons and LEDs to a full touchscreen. In embedded work the HMI has to run within the same tight memory and power limits as the rest of the device, which is why embedded interfaces favor lightweight graphics libraries over the heavy frameworks used on phones and the web.