The classic. The bible. It's the SICP of imperative languages. It's pretty much the only thing all that software engineers can collectively agree is an essential and awesome read. And believe me, getting programmers to agree on something is no simple feat. If you've ever wanted to see a real-life internet argument, get a couple programmers in the room and ask them what's the best way to compute the Fibonacci sequence, get some popcorn, and get ready for fireworks.
In a mere 270 pages, this book will dive into imperative programming, the Unix environment, and even a bit of computer science. It's a vital introduction to C, and also a great book for learning imperative programming in general. Despite what embedded C++ advocates tell you, or what the technologists over at Rust and D and Go all promise, C *is* the language of embedded software, and as such you must be well-versed in her intricacies.
"But muh assembly" you cry, like a rotund child begging for another donut, as his gut slowly protrudes its way beyond the vesicles of his striped polo. Look. There is a time and place for everything, including going down into the assembly level. We've all been there, and it's not pretty. Machine code is a cold, ugly beast that is best left in its slumbers, disturbed only by the ding of a compiler, execrating the object code that it may interpret henceforth.
It's like going to hell and back. Everything is beautiful inside of x86. It's almost adorable how effortless a printf flawlessly sends out a sequence of characters to your terminal; how freely they flutter their golden trimmed %-formatted tips leeward to your screen. There's little pthreads playing "ring around the semaphore" in the fields of virtual memory, and hearty mallocs over by the red-black tree forests, harvesting the fruits of process' labor, into cozy, petite heaps. Unistd is always a grump, but nobody messes with him too much these days.
But the world of embedded control is a strange, hellish world. It's a world where there's no such thing as mallocs, and a printf is nothing more than a stream of data judiciously churning out of an rs-232 transducer, like a tarpit churning out sludge, except the tarpit has a higher baud rate. Thankfully, even in hell there can be a savior. Given how simple libc is, you might expect implementing the C library to be a simple and annoying chore. And in truth, provided you're working with an architecture that was Godless enough to give you absolutely no libc whatsoever, this isn't too bad. But there's a question of doing it right, and understanding the intricacies of the lib. Why assert is a macro. Why NULL isn't just 0, but 0 cast as a void pointer. Why fflush should be used sparingly at best. This book is here to answer those intricacies, and ultimately, help you build or extend your C library as need be. When was the last time you actually received decent documentation for your embedded C environment?
Well that's what I call this book. "The fish book." I'm not exactly sure what a fish has to do with being an expert C programmer, and I'm pretty sure the author doesn't either. Perhaps it's a grand metaphor for programming in C in general. You are a fish weaving through all of the potential errors that could arise that the compiler won't catch. Daintly programming the trickiest of the tricky buffer to struct castings, throwing up alignment macros like thugs throw up gang signs, firing off float to int bit hacks left and right without a second thought. Ah yes, the C programmer. He swims like a fish and... splashes like a fish, I suppose. Hashtag deep bro.
The book assumes you've already had quite a bit of C programming under your belt, and is here to answer all of those strange questions you might have had during exploration with the language. It's full of little teasers and puzzles specifically designed to help you think better with regards to writing C programs and gain a deeper appreciation of the language in general. It's definitely a read I'd recommend for anybody, but an essential for C programmers. Also, I guess it's better than my undergrad CS 101 book, which was a picture of the side of the author's payroll office.
Okay, I know what a capacitor is. I've done my fair share of circuits, electricity, and magnetism, but I really only have a cursory knowledge of hardware, this book helped a lot in introducing to me the hardware aspect of embedded control without getting too crazy. It explains things in a way that's easy to understand from a conceptual point of view, with the obvious intent of being able to ask an EE a question without sounding completely retarded.
This book gives you a lot of basic code for interfacing with common devices, such as analogue sensors and motors, UARTs, ethernet, USB, CAN, etc. Highly recommend read, and great reference for developing BSPs and drivers. Also, just look at it. It's a fucking circuit board flying through space. How awesome is that?