What does a firmware engineer do?

What are skills needed to be a successful firmware engineer?

  • I am looking for both technical and general skills. I am an electrical engineer and interested in embedded system design. What programming languages should I be proficient in? What computer science concepts should I be familiar with? I think I should be good at OS, algorithms and data structures, but from embedded systems' perspective. Could you suggest good resources which teach these computer science concepts in a firmware engineer's perspective?

  • Answer:

    The essential skill is in event-driven multi-threaded programming with careful resource utilization. The analogy I like to use is between driving a bus (Desktop) vs flying a fighter jet (Embedded).  Things happen a lot faster in the jet, there's a whole lot more simultaneous things happening (including ones that can get you killed). A good way to get used to an embedded environment is to practice writing a multi-threaded event-driven desktop GUI program first (a game?) with a toolchain that gets you close to the metal. The other essential skill is DOMAIN competence. You need to understand closed-loop feedback control, signal transformation, measurement, etc.  Try getting your hands on a copy of Matlab/Mathmatica and get an intuitive feel of happens to a set of outputs given a set of inputs and a transformation.  The control and signal-processing toolboxes have good tutorials on real-world problems you can solve that will engage your imagination.

Peter Kerrigan at Quora Visit the source

Was this solution helpful to you?

Other answers

What programming languages should I be proficient in ? C mostly, and also C++ You should also be familiar with a higher level scripting language because test suites and automation happens in higher level languages like Python, Perl, Ruby etc. What computer science concepts should I be familiar with ? You have already mentioned OS, algorithms and data-structures which is good. Apart from  this it would be helpful if you brush up your skills on digital logic, micro-processors, computer architecture. Since you would be working with hardware teams, it might also be helpful to look into these concepts. Chip layouts, serial/parallel busses, RTL, Verilog

Anonymous

If you are looking for a decent beginner's book in embedded systems, I would recommend http://www.amazon.com/Making-Embedded-Systems-Patterns-Software/dp/1449302149. To be technically successful as a firmware engineer, it's important to have good understanding of hardware as well as software that you are working on. Hardware: As you are an electrical engineer, hardware might come more natural to you but it is important to understand how various components in a board work. For example you have a circuit that triggers an edge on a pin, which causes an interrupt to fire. Most firmware engineers who work on bringing up boards and debugging need to be very comfortable with using scopes, logic analyzer, circuit probing etc. Software: I will start from very low-level to higher level concepts. 1. Computer Architecture:  First and foremost, understand how a computer works. A good grasp of computer architecture is important. After all you are working with a computer so you need to understand assembly instructions that your micro uses, how many cycles does an instruction take to execute, how many stages are there in the pipeline, is there separate data and instruction bus, etc. I remember watching video by Dan Garcia back when I learned computer architecture. He's a great teacher and makes the class fun. 2. Understanding peripherals, reference manuals, datasheets: This is the next level of abstraction in my opinion. While the core of computer architecture applies to all micro controllers, various manufacturers and micros will have various peripherals, and instructions on how to access them. What I mean by peripherals is your GPIOs, Timers, ADC, UART, I2C, DMA, CAN etc. To be an expert you want to understand how these things work from both from a hardware as well as a programmer's perspective. What kind of errors are introduced with ADC readings? The programming manual will have insights on how to use the peripheral properly, such as the sequence you should use to modify the PLL clock frequency used by the micro. Programming manuals for micros are hundreds of pages long, so if you haven't done much embedded programming, pick an Arduino and go through the reference manual for the atmel micro. 3. Learn various architectures: Simple main loops, Interrupts with foreground/background, RTOS using tasks/threads. Most real-time embedded systems are written in C/C++. Things to know are interrupt overhead, implication of context switching, thread-safety. I would suggest learning at least one RTOS such as FreeRTOS if you don't know much about Operating System. It has great documentation and the code is freely available. 4. Protocols, networking and moving data: Most embedded devices talk to other devices, essentially they are moving information around. Protocols are everywhere in computers. So learn how various protocols are implemented, both in hardware and software. How is data delivery guaranteed, encryption, compression etc.  5. Language and structure: Master the C/C++ language. May be someday we will see the Go programming language take over, but that hasn't happened yet. My favorite books are the classic K&R, Expert C Programming, C++ Primer, and of course C++ Programming language by Stroustrup. There is still more, such as algorithms, DSP, data structures, control systems, numerical calculations, multi-core and parallelism, FPGA, hardware design language. Even then each of these topics have lots of books written about them but don't panic if you don't know much yet. As long as you have a desire to learn in due time you can become a Master. Success, on the other hand is a matter of perspective :)

Rupesh Gajurel

One thing others haven't mentioned is hardware/mechanical knowledge in the domain you work in. For example, as a firmware engineer at GE writing code for digital positioners, I have to know basic valve theory, valve mechanics, and control engineering (PID). To be a valuable firmware engineer (or "senior/principal" FE) that can contribute code to all areas of the codebase requires a deep understanding of impacts to the mechanical world.Similarly, if you're a firmware engineer at Fitbit, you probably know a lot about the wearables space and how to work with accelerometers/LCDs/LEDs/gyros. And if you're a firmware guy for Bosch/Tesla working on automotive controls, you have to know about car mechanics, PID/engine controls, etc.For me, I love learning about the mechanical systems and this is why I think firmware is much more enjoyable than pure software. Whatever industry your firmware team is in, becoming knowledgeable in that field will not only help your understanding of the code but also set you apart among other engineers and management will appreciate that.

Joe Pak

I can tell you about bare-metal systems(which run without any OS). For designing and developing firmware for these applications in addition to data structures and C programming,  good understanding of computer architecture especially of memory organization and interrupt controller is required. It's also required to have good understanding of low level communication protols like SPI , I2C , UART etc. It might also be required to have understanding of DSP concepts and DSP architecture if you want to work on some processing intensive applications. In addition to these, some domain experience  of the domain for which you are going to design the product like Industrial , Automotive  etc. will also be helpful.

Abhishek Mathur

By firmware I am assuming either writing code for micro-controllers or device drivers. Often while writing at this level you'll have to look at assembly code. Hence it would be very handy if you  learn the architecture of a MCU like ARM and write and see simple 'C' programs, dis-assemble them and see how 'C' constructs are converted to assembly Also an intuition for how code/data is fetched from memory, decoded and executed would help in solid understanding. I think microcontrollers as apt for this because computer programming will put a lot of abstraction on top which would make things complicated.

Sandeep Patil

As most answers mentioned, you need to know the architecture of the processor you are going to use. When you want to get the most out of the system you need to know the specific architecture. There can be many differences between vendors as they provide specific instructions sets to get things done. You'd also need to learn about the memory architecture, for example if you are dealing with a processor with a Harvard architecture you'll have program and data memory separately and you need to know how to utilize these two efficiently (for example you can access both memory to fetch two in one clock cycle vs. taking two clocks fetch two from one memory). These are architecture specific you need to pay close attention to the manual

Chan Liyanage

- Good C Programming Skill                 - Ability to understand the Memory Map                 - Read/Write registers in Controllers                 - Understanding the Controller Data Sheet                 - Interrupt Handling Skill                 - Timing calculations.                 - DMA knowledge for latest High speed controllers

Balajee Seshadri

Just Added Q & A:

Find solution

For every problem there is a solution! Proved by Solucija.

  • Got an issue and looking for advice?

  • Ask Solucija to search every corner of the Web for help.

  • Get workable solutions and helpful tips in a moment.

Just ask Solucija about an issue you face and immediately get a list of ready solutions, answers and tips from other Internet users. We always provide the most suitable and complete answer to your question at the top, along with a few good alternatives below.