Virtually all processor vendors are now focusing on high-performance, multicore processors, which deliver true multiprocessing on a single chip. Problem is, most embedded engineers are only familiar with single-processor programming and need guidance on designing software for multiprocessor architectures. This paper addresses the problem by exploring proven strategies and techniques for distributing software tasks across multiple CPU cores. Topics include IPC techniques for loosely coupled multiprocessing; strategies for partitioning applications and utilizing shared resources with asymmetric multiprocessing; and tools for troubleshooting multicore systems.