This course focuses on the design and implementation of software for programmable embedded systems. Embedded computing systems hidden inside everyday electronic devices such as hand-phones, digital cameras etc. are becoming more and more prevalent. However, the heterogeneous nature of the underlying hardware as well as tight constraints on size, cost, power, and timing pose significant challenges to embedded software development. This course presents techniques that address these distinctive characteristics of embedded software implementation. Topics include embedded software development for programmable processors and reconfigurable hardware, component-based design, optimizations for performance, power, code size, operating system issues, and case studies of available systems.