I mentioned previously that I'm moving into a new career: embedded systems development. While I'm still uncertain on the timing of the move, I'm pushing forward as quickly as I can. I'm breaking this down into four general areas: C programming, Assembly programming, Linux, and electronics. As a fair warning, all Amazon links ahead are affiliate links.
C programming is almost a given, as it's been the best language for the job for many years. It's low level enough to get the performance necessary, high enough to build substantial software, and old enough to have a wealth of knowledge available. And I have a little knowledge of it. I'm relearning C by reading through the classic C Programming Language (2nd Edition) by Kernighan and Ritchie. This is the canonical C text that any C developer needs to read, and was the text for a class I took in college. To gain some experience, I'm first developing programs to solve various puzzles, such as sudoku, sum total/kakuro, and ken ken. I selected these due to numerics being involved and because I can solve them up to about a hard difficulty level.
Assembly is a very low level group of languages that are different for every processor. Knowing one helps a great deal in learning others. I'm going to focus on the ARM processor starting out (not sure which one), but want to learn Assembly for the ATmega168, for reasons explained below. Knowing Assembly will help me work at the lowest levels of programmable electronics and will make me a better C programmer in general.
Linux will be my operating system of choice, as there are embedded versions that are very useful for low level devices. I have three flavors of Linux (Debian, Arch Linux, and Parabola GNU/Linux) installed through a virtual machine setup on my desktop.
Working with embedded devices requires a knowledge of both hardware and software, though developers generally focus on one over the other. As I want to build devices that operate in the real world, I want to focus more on the hardware than a typical embedded software engineer and is why I want to identify myself as a embedded systems engineer. I have two systems helping my to learn this. The first is called (ironically) the NerdKits USB Microcontroller Electronics Starter Kit. This includes everything I need to build a development platform on a solderless breadboard with an ATmega168. The second is the Make: Electronics (Learning by Discovery) book. I picked up the first parts kit and tool kit for the exercises within. So far, I've focused on the NerdKit.
I have plans for further learning of each of these, including joining an open source software project, likely through GNU. I also will be acquiring the Raspberry Pi computer, which is the size of a credit card, but holds the power to run Arch Linux and display on an HDTV. I also own the four volume set of , which I will start to work through once I have experience in both C and Assembly. Finally, I have gotten back into math, thanks to courses from The Great Courses, which is a company I HIGHLY recommend buying from.
While slowly driving myself insane with all of this, I am still (slowly) working on my Japanese and generally trying to get in better shape. While I would love to drop both of these, I owe it to myself to live a healthier life and to see my guided self-study through to the end. I'll keep writing about my progress throughout all of this and will try to give you fair warning if my mind is about to crack.