their specialized testing issues, and combined with much lower volume custom mainboards with application-specific external peripherals. Prominent examples of this approach include Arduino and Raspberry Pi. ASIC and FPGA SoC solutions A system on a chip (SoC) contains a complete system - consisting of multiple processors, multipliers, caches, even different types of memory and commonly various peripherals like interfaces for wired or wireless communication on a single chip. Often graphics processing units (GPU) and DSPs are included such chips. SoCs can be implemented as an application-specific integrated circuit (ASIC) or using a field-programmable gate array (FPGA) which typically can be reconfigured. ASIC implementations are common for very-high-volume embedded systems like mobile phones and smartphones. ASIC or FPGA implementations may be used for not-so-high-volume embedded systems with special needs in kind of signal processing performance, interfaces and reliability, like in avionics. Peripherals Embedded systems talk with the outside world via peripherals, such as: Serial communication interfaces (SCI): RS-232, RS-422, RS-485, etc. Synchronous Serial Interface: I2C, SPI, SSC and ESSI (Enhanced Synchronous Serial Interface) Universal Serial Bus (USB) Media cards (SD cards, CompactFlash, etc.) Network interface controller: Ethernet, WiFi, etc. Fieldbuses: CAN bus, LIN-Bus, PROFIBUS, etc. Timers: Phase-locked loops, programmable interval timers General Purpose Input/Output (GPIO) Analog-to-digital and digital-to-analog converters Debugging: JTAG, In-system programming, background debug mode interface port, BITP, and DB9 ports. Tools As with other software, embedded system designers use compilers, assemblers, and debuggers to develop embedded system software. However, they may also use more specific tools: In circuit debuggers or emulators (see next section). Utilities to add a checksum or CRC to a program, so the embedded system can check if the program is valid. For systems using digital signal processing, developers may use a computational notebook to simulate the mathematics. System-level modeling and simulation tools help designers to construct simulation models of a system with hardware components such as processors, memories, DMA, interfaces, buses and software behavior flow as a state diagram or flow diagram using configurable library blocks. Simulation is conducted to select the right components by performing power vs. performance trade-offs, reliability analysis and bottleneck analysis. Typical reports that help a designer to make architecture decisions include application latency, device throughput, device utilization, power consumption of the full system as well as device-level power consumption. A model-based development tool creates and simulates graphical data flow and UML state chart diagrams of components like digital filters, motor