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
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
Related Q & A:
- What are the secrets of being a successful person?Best solution by Yahoo! Answers
- What basic skills are needed to be a successful ATC?Best solution by Yahoo! Answers
- What are the skills needed to run a small business successfully?Best solution by Yahoo! Answers
- What are the steps to making a successful website?Best solution by Yahoo! Answers
- What qualifications are needed to become a paramedic?Best solution by eHow old
Just Added Q & A:
- How many active mobile subscribers are there in China?Best solution by Quora
- How to find the right vacation?Best solution by bookit.com
- How To Make Your Own Primer?Best solution by thekrazycouponlady.com
- How do you get the domain & range?Best solution by ChaCha
- How do you open pop up blockers?Best solution by Yahoo! Answers
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.