Electronic – Embedded Development – Taking the Next Step

developmentembedded

I'm going to start by telling you what I know. Then I'm going to tell you that I want to get to this magical land of knowing everything about embedded systems development. Then I'm going to ask you what my next steps should be to get there. This answer is rather informative, but I'm trying to get a little more detailed:

What I Know

Let's see, I'm fair with C and C++. Obviously, I want to get better with those languages but I think at this point the best way for me to improve is to just keep using them and continually try to improve my code as I write it. I don't think it would be very beneficial to dedicate any learning exercises to just learning C anymore.

I'm fairly comfortable with designing simple circuits. I see a chip with an open collector output and I know I need a pull up etc. I'm fairly confident that given an IC and its datasheet, I can either figure out how to interface with it or at least ask the right questions to figure out how to interface it.

I'm very good at math and logical thinking. There are few algorithms/design concepts that throw me for a loop. This is definitely my strongest area.

What I've Done

Until now, all of my experience has been with 8-bit microcontrollers. My college course utilized a Motorola HC08, an Intel 8051, and a Zilog EZ8. My professor had built a little dev board for all three of them with a 7-seg display and some other stuff. We programmed them in assembly so I'm somewhat familiar with assembly and I took a basic computer architecture course so I have a decent idea about the hardware. However, we worked on a windows environment and all 3 MCUs had their own IDE and tool chain already setup so I never really learned how my code went from assembly to running on the MCU.

My next step was learning on my own. I got very familiar with the Arduino environment by interfacing with sensors/memories/displays that both had pre-written libraries and some that did not. Next I built my own Arduino board with an ICSP on it and connections to another MCU so that I could flash the bootloader onto bare ATmega328s. Again, however, the IDE and tool-chain was already setup and I never got an understanding of how I went from C/Arduino to code actually running on the MCU.

What I Want to Know

So from the previously linked answer, I think the most interesting/beneficial things for me would be the bullet about learning the tools (compiler and linker), and learning different styles of software architecture (going from interrupt based control loops to schedulers and RTOSes). That is my opinion on what would be most useful… but since I don't know it yet it's hard to say whether that's correct or not so feel free to suggest other bullet points from that answer if you think they would be better and please provide an explanation as to why you think that.


So taking my current knowledge as a starting point and the above description of what I want to know as a goal, I'm looking for very specific suggestions on where to go next. I'm looking for exact project suggestions, websites/blog entries to read, chapters in books, etc.

Also, are there any other holes in my knowledge base that you think I should fill before moving on to the above mentioned topics?

Best Answer

So from the previously linked answer, I think the most interesting/beneficial things for me would be the bullet about learning the tools (compiler and linker), and learning different styles of software architecture (going from interrupt based control loops to schedulers and RTOSes)

Porting a small operating system to a new device could help you to understand schedulers and RTOSs. FreeRTOS is popular and well documented. eCos is another.

Writing a bootloader is a good way to get to grips with a linker as you'll want to divide up memory and flash into regions.

Another tip is to pick a completely new architecture or chip and build yourself a development board. Forcing yourself to start right from the beginning and look everything up in the datasheet is a good way to learn.

Explore Protothreads. Try writing the same programs in both a threaded and state machine style. Once you're done with Protothreads, write a real thread scheduler.

Related Topic