Embedded programming software is used to program special-purpose computer systems that are designed to perform one or several dedicated functions. In addition to a core operating system (OS), many embedded systems have upper-layer software components such as networking protocol stacks and storage capabilities. Networking protocol stacks include controller area network (CAN), transmission control protocol/Internet protocol (TCP/IP), file transfer protocol (FTP), hypertext transfer protocol (HTTP), and hypertext transfer protocol secure (HTTPS). File allocation table (FAT) and Flash are common storage or memory management systems. For embedded devices with audio and video capabilities, embedded programming software includes drivers and codecs. With a real-time operating system (RTOS), additional software components are available. There are several types of embedded programming software. Choices include simple control loop, interrupt controlled system, cooperative multitasking, and preemptive multitasking. Simple control loop software has a loop that calls subroutines, each of which manages a part of the hardware or embedded programming software. Interrupt controlled systems have a main loop and a secondary loop. Tasks are triggered by events such as interrupts. Cooperative multitasking or non-preemptive multitasking systems are similar to simple control loops, but the loop is located within an application programming interface (API). Preemptive multitasking or multi-threading techniques feature task-switching and synchronization strategies such as message queues. Typically, embedded programming software with preemptive multitasking is used with an RTOS. Embedded programming software includes microkernels, exokernels, and monolithic kernels, as well as specialized products. With microkernels, the OS kernel allocates memory and switches the central processing unit (CPU) between tasks. Exokernels feature normal subroutine calls as well as extensible software and hardware. Monolithic kernels provide developers with an environment similar to a desktop OS. Examples of embedded monolithic kernels include Embedded Linux and Windows CE. Linux is a registered trademark of Linus Torvalds. Microsoft and Windows are registered trademarks of Microsoft Corporation. Although monolithic kernels are more expensive than other types of embedded programming software, advantages include common ports and the re-use of publicly available code. Specialized embedded programming software may require a custom operating system and architecture. Sometimes, the embedded system is partitioned into two controllers with a communication mechanism that transmits data between.