Not a resource recommendation, but a few words of advice from someone who has been in your shoes:
In my opinion, one of the biggest obstacle blocks that people used to developing software for a PC have when attempting to design for an embedded controller is comprehending and dealing with the low level tasks that the operating system took care of for you that you must implement yourself on an embedded controller.
For example, in an embedded application, there is generally no standard input (keyboad) or standard output (video display) device at your disposal. Instead, it is often necessary to write 'drivers' to deal with the raw IO and frequently these drivers involve handling of interrupts, which are software routines that get called (semi) automatically in response to hardware events, such as a change in status of an input pin. This means that functions like printf() and scanf() may be complex to implement as opposed to being basic functions you build from.
Another area that tends to be quite different from PC programming is the hands on use of the linker. In all of the PC applications I have worked on, the linker was simply a program that ran when the application was built. In microcontroller applications, it is usually necessary to create a custom linker command file (similar to your make file) but this file spells out exactly what sections of the system are ROM and RAM and what is allowed to go into each section.
One area of similiarity between the two is that standard library functions, are frequently provided by the runtime library, such as memcpy(), malloc(), and the math functions. You will need to become familiar with the compiler manual to see what functions are provided as it may not be as many as you are used to.
I would sugest that you start slow, and if the tool set you are using has a simple demo program that you can get to run: start there, even if it is something as simple as declaring a couple of variables and adding them. Once you are comfortable with that, you can start to experiement with the functions provided by the run time library and working with the low level IO by doing something such as making an IO pin toggle and watching it on a scope. Also look at the .map file and search it for your variables and function names. This will help you get comfortable with the idea of where things are going in memory and the linker operation. Lastly, examine the compiler output by generating and looking at a listing file. This will help you to become better aquainted with how the compiler translates the C code into the assembly language of the processor you are dealing with (which also is a must learn).
In the end, you will probably be surprised at how quickly you become comfortable with the microcontroller application and how much similarity there is to PC development.