Embedded systems software is designed to support a special-purpose computer system. It has a single dedicated function or a small number of dedicated functions, often with real-time performance constraints. Because embedded systems software is designed for one or more specific tasks, it may not be able to stand alone. Such embedded programs consist of small computerized parts where the instructions are referred to as firmware. In terms of applications, embedded systems software is used with telecommunications systems, consumer electronics, transportation systems, and medical equipment. Products may also be used with data loggers in chemical processing facilities that use an operating system such as Linux (R) (Linus Torvalds). Embedded systems use several different software architectures. Choices include round-robin, round-robin with interrupts, function-queue scheduling, and real-time operating system (OS). In addition to Linux, real-time operating systems for embedded systems software include eCos, Fusion RTOS, Integrity, LynxOS, Neutrino, RTEMS, ThreadX, VxWorks, and Windows CE. When selecting embedded software for a real-time OS, considerations may include task and task states, tasks and data, and semaphores and shared data. Message queues, mailboxes, and pipes; timer functions, events, and memory management; and interrupt routines in an RTOS environment are other important operating system services. Selected embedded systems software requires a basic understanding of application design, embedded software development tools, and debugging techniques. With a real-time OS, design considerations include semaphores and queues, real-time scheduling, memory, and power. Typically, embedded software development tools use a host machine and target machine, as well as linkers and locators for embedded systems software. Application developers must get embedded software into the target system, and test the application on a host machine. Because embedded systems software is "built-in" to process control systems and other devices, embedded developers must achieve hardware and software compatibility. For embedded software engineers, hardware considerations include gates, timing, and memory. Microprocessors, buses, direct access memory (DMA), and interrupts are also important to consider. Microprocessor chips (MPU) are silicon devices that serve as the central processing unit (CPU) in computers. Buses transfer data between the components inside a computer or hardware device, or between separate computers and hardware devices.