Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. It's 100% free.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I'm entering my last few semesters of a CS degree and looking to start a career in Embedded Systems. From talking to a lot of people it seems like I might have been better off with a Computer Engineering degree but it is a bit late now.

I am wondering what I can do to make myself employable in an embedded systems job in about a years time. I have taken a good number of computer architecture type courses as part of my degree and am hoping to tailor my electives towards embedded systems but it may not be feasible.

What sorts of solo projects could I work on to get my chops up? I have an Arduino Uno but from what people have told me working with that doesn't really count. Can I access it at a lower level somehow?

Are there books out there I can self study to learn more about embedded systems and the core knowledge I'll need to know?

Is there some other cheap hardware kit I can buy to hack on that will be better than Arduino?

Basically, how do I guarantee myself being an employable Jr. Level Embedded Systems Engineer in about a years time so I don't get stuck having to take a boring Java or Web App job?

share|improve this question

closed as off-topic by durron597, TZHX, GlenH7, MichaelT, Snowman May 23 '15 at 4:22

This question appears to be off-topic. The users who voted to close gave this specific reason:

  • "Questions seeking career or education advice are off topic on Programmers. They are only meaningful to the asker and do not generate lasting value for the broader programming community. Furthermore, in most cases, any answer is going to be a subjective opinion that may not take into account all the nuances of a (your) particular circumstance." – durron597, TZHX, GlenH7, MichaelT
If this question can be reworded to fit the rules in the help center, please edit the question.

Not to be a kill-joy but embedded development is probably to poorest paid area of computing from what I can see. Please keep your mind open. – James May 28 '12 at 19:32
Arduino is about hardware, not software. The programming samples I've seen for Arduino project s often have ghastly style. Why not just go into mobile development? It's a lot hotter, and a lot easier to get started with. – Steven Burnap May 28 '12 at 20:28
@James if you do something you are interested in and passionate about, you'll do better, be happier, and probably end up more successful and earning more than if you do something you don't enjoy. – Kirk Broadhurst May 29 '12 at 2:01
@KirkBroadhurst I'd like to belive that, however someone with 10 years experience can expect to earn the same as a CS grad working in finance, even though the skills required for embedded development are probably higher. – James May 29 '12 at 11:20
@James I disagree about firmware being the poorest paid area of computing -- in 2012 the average salary for a firmware engineer in the US is $100,000, and I have seen salaries as high as $145,000 posted on This compares favorable with salaries posted for financial software (for example) on the same site. – tcrosley May 29 '12 at 15:39
up vote 7 down vote accepted

Embedded systems means different things to different people, anywhere from 8-bit micros that cost less than a dollar and have only a few KB of Flash and a couple of hundred bytes of RAM, to ARM-based boards with a GB of Flash and MBs of RAM running a platform like Android. Since you already have an Arduino, I assume you are talking about smaller systems.

In order to be successful in the embedded systems field, it is very useful to have some background in electronics. You will often be writing code to interface with the various peripherals (serial busses like UART, SPI, I2C or USB), 8 and 16-bit timers, clock generators, and ADCs and DACs. Although I have not programmed on one, my understanding is the Arduino platform isolates you from most of this by providing canned routines to access the various peripherals on the board. In the real world, you probably won't have this luxury.

"Datasheets" for microcontrollers often run into the hundreds of pages as they describe every bit of every register. If you haven't done so already, you should download the datasheet for the ATmega32 microcontroller in your Arduino Uno.

It also helps to be able to read a schematic so you can probe a board with an oscilloscope or logic analyzer. If you have no background in electronics, but are still interested in getting "down to the metal", then I highly suggest taking some introductory courses in electronics. It is also essential that you know C, as most microcontroller firmware is programmed in that language. You already have a head start there, as the Arduinos provide a simplified version of C/C++ functions.

It would also be a good idea to work with a 32-bit microcontroller, as the embedded market is quickly moving to these as their price has come down to where the 8-bitters used to be. I happen to like the PIC32 series from Microchip. You can get a complete development board from SparkFun for $40. You don't need to buy anything else to start with, since there is a bootloader built-in. You can also use one of Microchip's programmers like the PICKit 3.

enter image description here

This board uses the PIC32MX795, which has 512K flash and 128K of RAM, which is a lot more than you are used to on the Arduino. There are tons of free libraries to make programming the peripherals easier, but you will still need to read the PIC32 datasheet to understand how to use them.

Microchip has a free IDE and compiler that runs on Windows, Linux, and Macs. (They also have a paid version, but all that gives you is optimizations to produce smaller code. You don't need that for hobbyist use.)

share|improve this answer
All I can add to this answer is in an interview I am looking for a general "common sense" type person. I need to know that you understand what an intterupt is, how to code one, and the kind of things that might go wrong. need you to be able to explain a stackframe to me. I expect you to tell me instantly (in the rough order of magnitude - "none, not much, lots") how much memory a price of code uses, how many processor cycles it will need to run etc. A bonus point goes to candidates that can describe the workings of an H bridge or a crowbar and what can go wrong with them. – mattnz May 29 '12 at 5:22

Find two or three actual jobs that you think you would want. Look at the job requirements first and do some research about the companies themselves. When you are done with that, try to make an appointment with someone technical at each company and do an exploratory interview (that is, you are interviewing them about their needs and requirements, not actually trying to get a job). That should give you enough to work on for the next year.

share|improve this answer

Arudino doesn't count

Well, that somewhat depends on what you do with it. Getting some LEDs to blink is pretty simple. All you need is some basic knowledge of C and the arduino and it's IDE takes care of the rest. You get into actual embedded work when you try to generate 3 pulse width modulated signals out of an arduino. For a musical tone generator, or a complex LED dimmer, or generating discreet signals for a wireless fencing system, or you know whatever. Sure, there's the pre-canned tone() function, but it will only output one PWM at a time. Once you dig past the pre-made functions, see what others have done, and look at the datasheet for the ATMega328, you learn that there are three clocks which the pwm pins share. One of which is 16-bit while the other two are 8-bit. Each can be set up with various arguments and settings for different sorts of PWM behaviour, and after 3 hours of mucking about you'll have 4 lines of code and call it a good day.

The arduino platform is fantastic for artist, non-programmers, and programmers from other fields that want a small cheap processor to prototype on. Or for one-shot throw-away projects. Most of the time it saves you from the horrible mess that is embedded development. A lot of the old-school electrical engineers sneer at it because it's "too easy". But you can still use it to learn how to be an embedded engineer.

If you want an exercise, get 4 different PWM signals out of an arduino. (And then mail me how you did it!)

share|improve this answer

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