ProgrammingEmbeddedSystemswithCandGNUDevelopmentTools2ndEdition
This book gives an excellent overview of programming embedded systems. It provides numerous examples of real-world hands-on embedded programming. I'd recommend that you have experience in C. Experience with operating systems concepts (such as interrupt service routines) would also be helpful.