(reasons you might be advised to NOT buy this book)

It is not really a beginner’s book on C programming
This book is not a book on general C programming. For that you should find a starting book that introduces programming. This book covers specific computer hardware and emphasizes the I/O aspects of the C language. While all the fundamental constructs of C are covered, functions such as printf() and trig functions are barely mentioned and are not used even though they are supported with full-featured compilers.

It doesn’t focus on Assembly Language
Assembly language is no longer a focus. Although a few assembly language examples appear (including the smaller RTOS), in the chapter where I discuss all the assembly instructions there are very few program examples. In my opinion, for today’s development process you need assembly language only to understand how the computer works, how complex operations are built up from basic instructions, and how your C compiler has decided to carry out your instructions. You should use C for all but your smallest, most code-critical projects. If you program for a living, saving your time and reducing chances for human error outweigh any potential code efficiencies. With the class of compilers now available, an assembly language programmer would have to be quite skilled to even match the size and run time speed of code produced by a knowledgeable C programmer.

It is not a library of Code Pieces
While there are many program examples, this book is not a set of magic program code pieces that you can blindly copy to solve all your problems. The examples are not the same as the set of library functions. Unless you understand the principles and make them your own, you will be like a person walking in the dark along a narrow path with swamp on either side—if you were to get off the path, you would have no idea how to get back.

It has relatively few Networking Code Examples
There is relatively little programming for the advanced networking protocols. While I have written a few I2C examples and included one simple CAN example, the coverage of USB has no examples–the complexity and lack of host-programming tools or knowledge on my part makes slave-programming only a mental exercise. Instead the networking chapters focus on explaining the protocols themselves, assuming most of the programming will deal with configuring specialized “peripherals”.

You may need to know some Electronics if you want to use the circuits
This book is not a beginning electronics book. You do not have to invent circuit designs, but if you intend to use the circuit examples, you need some knowledge of both digital and analog electronics. You’ll find many specific circuit examples along with advice on how to modify the circuits, but you need enough electronics background to understand the circuits after they have been described.

I use a very informal Writing Style
As you will notice, I have chosen not to write in a technical style. While the material may seem less “professional” this way, I hope it will be more interesting to read. As I write, I like to imagine I am a teacher sharing ideas with one student in my office rather than a researcher presenting a ground-breaking paper to a prestigious conference.

I am a Broad-brush Person (imperfect)
Be aware that I am, unfortunately, not a detail person. Despite my best efforts to finalize things, you may well find errors in program examples. A wide variety of peripherals and applications are discussed, and not all of them have been fully debugged. If you will feel cheated or angry when you find something less than technical perfection, this is not the book for you. If, instead, you can overlook the flaws and grasp the ideas, this book should be of great value.