A quick search on Amazon shows some which could be relevant:
- Programming Embedded Systems: With C and GNU Development Tools by Michael Barr and Anthony Massa
- An Embedded Software Primer by David E. Simon
- Embedded C by Michael J Pont
- Embedded Software Development with C by Kai Qian, David Den Haring and Li Cao
I was thinking of writing a book myself on the subject. But it would mostly haven been a collection of data one can find on the internet with some detective work. Subjects to include would be:
- Introduction to C, since embedded systems are programmed in C. Period....
I like K&R, but you can choose any book that suits the bill.
- Good coding practices in C, for example MISRA C rules.
Read some example of MISRA C-rules here, here and here.
- RTOS basics, since this is what is used on most embedded systems.
Read chapter 1 in the User & reference manual of rt:kernel from rt:labs for a good introduction. But personally I prefer the "run-to-completion" type of tasks which don't wait for external events for predictability.
- Interrupts, stacks, and memory handling - ISR, RAM, NVRAM, ROM, Flash and every other acronym you can think of...
- Development environments, and compilers for embedded development
My experience is that this is pretty much decided by the OS you are using. I have experienced very mysterious bugs just by not having the correct compiler version, so I can' imagine what could happen when having a compiler from a different vendor... IAR graciously provides all of their manuals free of charge and their IDE and compilers on 30-day on a 30-day free trial.
- Various hardware on a typical embedded controller - Details on how to access hardware with code examples.
You can see examples of typical hardware devices in the Freescale MC9S12XS256 Reference Manual, a typical automotive processor, especially chapter 10-19. Mind you that this manual is 738 pages long, so it's pedagogical value is limited.
- Debugging - Too much to cover for this blog post. This is the real dark arts...
- Architecture of embedded systems
Almost all embedded systems are layered, but why? And how do you know which layers to have in your system? And how do you identify the tasks you should have when schedule the system?