# Contiki

Contiki és un sistema operatiu reduït, de codi obert publicat sota la llicència BSD, per a sistemes amb memòria escassa, com ara els sistemes encastats, sistemes en xarxa, etc. A més, és molt portable i està construït entorn a un kernel d'esdeveniments. Proporciona multitasca que pot ser utilitzada a nivell de processos individuals. Consumeix 2 KB de memòria RAM i 40 KB de memòria ROM.
Recentment s'ha creat una nova branca actualitzada: Contiki-NG.

## Informació general

Contiki va ser creat per Adam Dunkels en 2002 i ha estat desenvolupat per un equip mundial de desenvolupadors com ara Texas Instruments, Atmel, Cisco, ETH Zurich, Redwire, RWTH Aachen University, la Universitat d'Oxford, Sensinode, Institut Suec de Ciències de la Computació, STMicroelectrinics, Zolertia Arxivat 2019-07-29 a Wayback Machine. i molts altres. Contiki ofereix multitasca i un predefinit de protocols d'Internet com ara TCP/IP. És un sistema complet que inclou una interfície gràfica d'usuari.

## Característiques

Contiki dona suport opcional multi fil preventiva, per procés de comunicació entre processos mitjançant el pas de missatges a través d'esdeveniments, ja sigui amb suport gràfic directa dels terminals connectats localment o pantalla virtual en xarxa amb Virtual Network Compiting (VNC).
Una instal·lació completa de Contiki inclou les següents característiques:
* Nucli multi tasca
* Opcional per aplicació multi fil preventiva
* Proto fils o ProtoThreads
* Protocols d'Internet (TCP/IP) de xarxa, incloent IPv6
* Sistemes de finestra i la interfície gràfica d'usuari
* Pantalla remota en xarxa utilitzant Virtual Network Compiting
* Un navegador web (reclamades per ser més petit del món)
* Servidor web personal
* Telnet Client

## Maquinari i arquitectura

Contiki està dissenyat per executar-se en dispositius de maquinari que es troben limitades en la memòria, potència, capacitat de processament i comunicació d'ample de banda.
Un sistema típic de Contiki té memòria en l'ordre de Kilobytes, un balanç de potència de l'ordre de mil-liwatts, la velocitat de processament es mesura en MHz i l'ample de banda de comunicació de l'ordre de centenars de kilobits / segon. Tals sistemes incloent molts tipus de sistemes incrustats.
Pel que fa a l'Arquitectura, Contiki segueix una arquitectura modular. A nivell de kernel segueix el model per esdeveniments, però proporciona opcions d'execució a processos individuals. El kernel del Contiki està comprès per un programador de tasques lleuger, on aquest llança els esdeveniments als processos en execució. L'execució de processos és activada per esdeveniments enviats pel kernel o per un mecanisme de sondeig.
El mecanisme de sondeig és utilitzat per evitar condicions de competició de recursos entre els processos. Contiki suporta dos tipus d'esdeveniments: esdeveniments asíncrons i esdeveniments síncrons. La diferència entre els dos tipus d'esdeveniments és que els esdeveniments síncrons són enviats directament al procés i són 16 programats en la taula d'execució. En canvi els esdeveniments asíncrons són crides diferides que són ficades a una cua i enviades quan hi ha recursos lliures.
El mecanisme de sondeig utilitzat en el Contiki, pot ser vist com un mecanisme en què els esdeveniments prioritaris són planificats entre els esdeveniments asíncrons. Totes les facilitats que proveeix el sistema operatiu com el control de dades o la comunicació, són proporcionades com a serveis. Cada servei té la seva interfície i la seva implementació. Aplicacions que utilitzant un particular servei, necessiten saber la interfície del servei en qüestió. Una aplicació no es preocupa de la implementació del servei.

## Model de programació

Contiki dona suport a la programació multi fil. La programació multi fil està implementada com una llibreria sobre el model de kernel basat en esdeveniments. Aquesta llibreria pot ser utilitzada per aplicacions que requereixin programació multi fil. La llibreria de programació multi fil de Contiki està dividida en dues parts: una plataforma independent i una plataforma
específica.
Les interfícies independents de la plataforma es troben a la part del kernel basat en esdeveniments i la part específica de la plataforma de la biblioteca implementa la pila de primitives de commutació i de preferència. Com que la preferència és suportada, aquesta s'utilitza mitjançant un temporitzador d'interrupcions i l'estat del fil d'execució és emmagatzemat a la pila.
Per l'execució multi fil, Contiki utilitza protothreads. Les principals característiques dels protothreads són: utilitzen molt poca memòria, no és necessària una pila extra i són molt portables (escrits en C). Els esdeveniments s'executen fins que acaben.

## Planificador i compartiment de recursos

Contiki és un sistema operatiu basat en esdeveniments, per tant no utilitza cap planificació sofisticada. Els esdeveniments són executats per l'aplicació tan aviat com arriben. En el cas de que es produeixi una interrupció aquesta s'executa amb més prioritat.
Pel que fa al compartiment de recursos, els esdeveniments s'executen fins que s'acaben i Contiki no proporciona gestió d'interrupcions pels nous esdeveniments, Contiki proporciona accés serialitzat a tots els recursos. Per tant, els nous esdeveniments podran accedir d'un en un als recursos que s'alliberen quan s'acaba un esdeveniment en execució.

## Gestió de memòria i protecció

Contiki suporta una gestió de la memòria dinàmica. A més a més, també suporta enllaços dinàmics entre els programes. Per protegir-se de la fragmentació de memòria, Contiki utilitza un sistema de gestió de memòria.
La principal responsabilitat d'aquest gestor és evitar la fragmentació de memòria de la memòria lliure compactant-ne els blocs. Per tant, un programa utilitzant el gestor de memòria no pot estar segur que la memòria estigui assignada al mateix espai.
Per a la gestió dinàmica de la memòria, Contiki proveeix una llibreria de gestió dels blocs de memòria. Aquesta llibreria proporciona unes funcions simples que a la vegada són molt potents. Contiki també és capaç de gestionar blocs de memòria de mida fixa.

## Xarxes

Contiki suporta una gran varietat de protocols de comunicació. Concretament, una aplicació pot utilitzar les dues capçaleres IP: Ipv4 i Ipv6. A més, proporciona una implementació de uIP(microIP). És una pila de protocol TCP/IP per microcontroladors de 8 bits, no requereix que les seves parelles de nodes tinguin una pila completa, però es pot comunicar amb parelles de nodes executant una pila lleugera que sigui similar. La pila uIP té les característiques mínimes que són necessàries per establir comunicació amb la pila TCP/IP. uIP està escrit en llenguatge C, només pot suportar una interfície de xarxa i suporta TCP, UDP, ICMP i IP.
També proporciona un altre protocol lleuger de comunicacions anomenat Rime. Rime proporciona comunicacions unicast d'un salt, comunicacions broadcast d'un salt i suport a comunicacions multisalt. Rime suporta comunicacions sense QoS, és a dir, comunicacions best effort i transmissions on s'assegura l'entrega dels paquets. En comunicacions multisalt, Rime permet a les aplicacions executar els seus protocols d'encaminament propi. Les aplicacions tenen permès implementar protocols que no estan inclosos a la pila de Rime.
Contiki no dona suport a multicast. Per tant, Contiki no proporciona cap implementació de gestió de protocols en grup, com Internet Group Management Protocol (IGMP).
Com que la memòria és escassa en sistemes incrustats, uIP utilitza una gestió de memòria eficient gràcies als seus mecanismes de control. La pila uIP no utilitza assignació dinàmica de memòria sinó que utilitza un buffer global on guarda tots els paquets d'entrada. Quan un paquet arriba, Contiki fica aquest paquet al buffer i notifica a la pila TCP/IP. Si és un paquet de dades, TCP/IP avisa a l'aplicació apropiada. L'aplicació necessita copiar les dades al buffer secundari o processar immediatament les dades. Un cop l'aplicació ha acabat de tractar les dades, Contiki sobreescriu el buffer global amb l'arribada de nous paquets de dades.

## ContikiMAC

De tots els components d'un node, la ràdio és un dels que gasta més energia, per tant la ràdio s'ha d'apagar completament per estalviar energia. Es necessita un cicle de treball per gestionar el consum energètic del sensor en termes de transmissió i recepció de dades, en aquest cas està definit per ContikiMAC.
ContikiMAC té un mecanisme de despertar els nodes que fa que es millori el consum d'energia, això s'aconsegueix mitjançant uns temporitzadors precisos i un conjunt de normes que regeixen aquests temporitzadors. A més, utilitza una optimització anomenada fast sleep, que permet als receptors detectar falsos positius d'enviament de dades ràpidament i, per tant, poder apagar la ràdio.
ContikiMAC és un protocol de cicle de treball que utilitza un mètode per despertar els sensors periòdicament i d'aquesta manera poder escoltar el canal i detectar si hi ha transmissions dels nodes veïns. Si una transmissió es descobreix quan es desperta el node, el receptor es manté encès per ser capaç de rebre el paquet sencer. Quan el paquet es rep correctament, s'envia un acknowledgement packet (ACK) per confirmar la seva recepció. El transmissor per assegurar-se que el paquet arriba al receptor, envia el paquet repetidament fins que rep un ACK del receptor indicant que ha rebut el paquet. Els paquets que són enviats com a broadcast no necessiten confirmació d'ACK.

## Contiki en altres camps

El sistema operatiu Contiki ha estat o està sent portat als següents sistemes:
Microcontroladors
* Atmel - ARM, AVR
* NXP Semiconductors - LPC1768, LPC2103, MC13224
* Microxip - dsPIC, PIC32 (PIC32MX795F512L)
* Texas Instruments - MSP430, CC2430, CC2538, CC2630, CC2650, CC2538: RE-mote, Firefly Arxivat 2020-07-28 a Wayback Machine., Zoul Arxivat 2020-07-28 a Wayback Machine. (conté CC2538 i CC1200 en un únic mòdul)
* STMicroelectronics - STM32 W
Ordinadors
* Apple- sèrie II
* Atari - 8 bits, ST, Cartera
* Casio - Pocket Viewer
* Intel, AMD, VIA, molts altres - x86 -basat Unix-com sistemes, a sobre de GTK +, o més directament a través d'un sistema de finestres
Consoles de videojocs
* Atari - Jaguar Game Park - GP32
* Nintendo - Game Boy, Game Boy Advance, Entertainment System (NES)

## Curiositats

El nom Contiki prové de Thor Heyerdahl famós per l'expedició Kon-tiki que amb una petita barca, feta de materials no artificials, pretenia travessar l'oceà Pacífic.
També fa referència a un nom antic Viracocha traduït com Kon-tiki que és la gran deïtat creadora Inca al Andes, regió d'Amèrica del Sud.

## Enllaços externs

* Contiki - Lloc web oficial