What is the difference precisely between an Embedded System (like Tegra, Raspberry or similar) and a Microcontroller? I understand there is a difference but I'm finding it difficult to understand.

What does one intent when he says: "are you able to develop for microcontrollers"? Does it mean simply program in C/C++ for an embedded system or something more? What is the difference between programming in C/C++ for Embedded Systems and Microcontrollers? If I commonly program for ARM in C/C++, can I say that I can program microcontrollers or can I apply for such a job?

  • Unclear what help you need. Please clarify your specific problem or provide additional details to highlight exactly what you need. As it's currently written, it’s hard to tell what problem you are trying to solve or what aspect of your approach needs to be corrected or explained. See the How to Ask page for help clarifying this question.
    – gnat
    Apr 17 '14 at 12:22
  • 2
    The definitions may vary (hence, primarily opinion based). My take is that Embedded Systems is anything with custom hardware. Microcontrollers are a sub-set of that where you have no OS or only a very rudimentary OS. Apr 17 '14 at 12:24
  • One is a subset of the other. Microcontrollers are normally embedded, but embedded processors aren't necessarily microcontrollers - you can embed a standard x86 processor if you want.
    – Simon B
    Apr 17 '14 at 13:42

This is all my experience/opinion, gathered from working in the field pretty close to the metal:

"embedded systems" are usually situations where you have significant non-trivial memory or speed constraints as compared to desktop systems. Those embedded situations can include microcontrollers, but can also include x86 systems on a chip, and also systems like PC104 or other form factors. They can run a "common" OS like Linux or Windows CE, but not always. They usually have a lot less memory and speed than desktop/server applications, but usually not so little that you have to think long and hard about whether to use a 16 or 32 bit integer for something like you might have to with a microcontroller.

The raspberry pi for example runs at 700MHz and has 256 or 512 megabytes of ram. An Atmel ATMega32U4 microcontroller for example runs at up to only 16MHz, with only 2560 bytes of ram. Some of the STM32 devices, which utilize an ARM cores, run at up to 24MHz and have about 8 kB or so of ram. Quite a substantial difference in speed and memory between the two, even more dramatic than a desktop vs a raspberry pi.

Programming for microcontrollers is a subset of embedded systems with even more significant memory and speed constraints, but also closer intimacy with the hardware the microcontroller is wired to. You'll spend a lot more time thinking about falling or rising edge clock triggers, watchdog timers, external interrupt triggers, analog to digital conversion timing issues and a bunch of other stuff that is typically long abstracted away in desktop systems. You may even have to be mindful of how much power is being used in different operations, and have to write your software to meet power draw requirements.

Until you have programmed for microcontrollers, it is unwise to claim you can. Until the day comes that you have to use an oscilloscope to figure out why your SPI-bus peripherals aren't talking, you don't yet know the kinds of things that have so far been invisible to you.

  • I just finished up a project for school where I had to program both on an embedded system (Raspberry Pi), and micro controllers (2 PIC16F767s), and this is an excellent answer. Microcontroller = no (or very limited) OS. You get to handle all the nitty gritty details. An embedded system, you might get an OS to isolate you from the hardware.
    – CurtisHx
    Apr 17 '14 at 15:12

Not the answer you're looking for? Browse other questions tagged or ask your own question.