Embedded Development - Taking the Next Step
So from the previously linked answer,
  I think the most
  interesting/beneficial things for me
  would be the bullet about learning the
  tools (compiler and linker), and
  learning different styles of software
  architecture (going from interrupt
  based control loops to schedulers and
  RTOSes)


Porting a small operating system to a new device could help you to understand schedulers and RTOSs. FreeRTOS is popular and well documented. eCos is another.

Writing a bootloader is a good way to get to grips with a linker as you'll want to divide up memory and flash into regions.

Another tip is to pick a completely new architecture or chip and build yourself a development board. Forcing yourself to start right from the beginning and look everything up in the datasheet is a good way to learn.

Explore Protothreads. Try writing the same programs in both a threaded and state machine style. Once you're done with Protothreads, write a real thread scheduler.