I would say learning embedded systems is a never ending process. Once you enter this field the learning has to be continuous or else you won’t be able to survive. This is also quite different from the regular programming area in which you take for granted the memory requirements and resources of computing.Welcome to the world where 128k of RAM is still considered “HUGE”.

Frankly speaking, a good Embedded Systems engineer is expected to know a lot of low-level details regarding programming along with the underlying hardware and processor architecture. The information shared here is more relevant to people who are more interested in Firmware engineering but would apply to most other branches of embedded systems.

Here are 5 easy steps to climb:

Learn C programming “Ok, I know a little bit of C. I have done hello world programs in it, made use of loops, Fibonacci series and what not. Is that sufficient?” The approach of learning the C language should be different from what taught to us in the basic programming class. Apart from the application point of view, you should emphasize more on the low-level details such as compiling process, memory map, etc. You need to ask few questions:

“What happens when I compile my program?”, “What happens to the variables that I have declared?”, “How are my functions linked together?”, “How do the global variables get stored?” etc.

Use vi/vim or emacs whatever you like as the editor and GCC toolchain for C programming. Learn to debug the code and executable using GDB debugger. Suggested books: The C programming Language (Brian W. Kernighan and Dennis M. Ritchie), C in Depth by S.K Srivastava, Programming Embedded Systems: With C and GNU Development Tools, 2nd Edition by Michael Barr, Practical C Programming by Steve Qualline Note: All these books follow different standards of C language. Do not confuse and always refer to the standard reference manual of C language if in any doubt. Learn Basic analog and digital electronics

Without basic knowledge of the above mentioned, you cannot even think of starting a project. Be well versed in these as they will help you to understand the interfacing of hardware to processor or controller. In short following terms should not be a jargon to you:

(Number System(binary, hexadecimal), digital logic, TTL, CMOS logic, Semiconductor memory, pull-up and pull-down resistors, push-pull configuration, clock and counters, rising edge, falling edge, level triggered, edge-triggered digital logic,

basic power supply design, transmission lines characteristics etc.)

You can either see online tutorials or pick up a basic electronics book for it. Learn about a Microcontroller

Pick up a microcontroller of your choice and understand its programming and architecture details. I would recommend you to start from AVR series of microcontrollers and then jump to Cortex-M once comfortable with AVR.

Purchase a development board based on AVR and blink a led……..continue further.

For AVR, I would suggest reading the book “AVR Microcontroller and Embedded Systems using assembly by M.A.Mazidi”

Once done with above move to Cortex-M3 series. I recommend you to go forLPC1769 LPCXpresso Board by Embedded artists. It supports arm-GCC, has an on-chip debugger for your easy debugging. “The Definitive Guide to ARM Cortex-M3 and Cortex-M4 Third Edition by Joseph Yiu” is by far the best book for cortex series microcontrollers that I have ever read.

Install a good IDE and toolchain that is supported by your microcontroller. I would recommend you to go for either Keil or Eclipse based NXP’s LPCXpresso.

Be familiar with the datasheets of the microcontroller and the board that you have purchased and start doing small experiments and be familiar with low-level programming. Learn about timers, interrupts, peripherals, protocols etc. Learn about debugging techniques (believe me, you will be mostly validating and debugging the software, that you or somebody else wrote, in the industry). Mini Project

Using the above-acquired knowledge, build a small project which covers the different topics you covered in the above experiments. Try to consolidate whatever you learned in the above points. Try to use at least 2 protocols(USART, SPI, I2C etc.) and build something that is close to a real world system. Try to use at least 2 sensors.

After this project, you will become well familiar with the firmware and bare metal coding. This is what is basically required for a kick-start in embedded systems design.

When done with this you will know that once you start increasing the complexity of the embedded system program and design, the normal programming techniques are not effective. Start learning Operating System concepts

Learning about complex firmware and embedded software would be incomplete without the proper use of Operating System techniques. Start learning taking Linux as the base and then start learning Linux System level programming. Once done with application level programming start learning Linux Kernel Development. Once gaining comfort with basic kernel development, go for device driver studies.

The books I recommend are:

“Operating System Concepts by. Abraham Silberschatz, Peter Baer Galvin, and Greg Gagne .”

“Linux Kernel Development, 3rd edition by Robert Love”

“Linux Device Drivers, 3rd edition”

So that’s it for starters, I will go into details of the above mentioned points next time. Till then Take care 🙂