**Innebygd programvare** er dataprogramvare, skrevet for å kontrollere maskiner eller enheter som vanligvis ikke er tenkt på som datamaskiner, ofte kjent som innebygde systemer. Den er vanligvis spesialisert for den spesielle maskinvaren den kjører på og har tids- og minnebegrensninger. Dette begrepet brukes noen ganger om hverandre med fastvare.

En presis og stabil karakteristisk egenskap er at ingen eller ikke alle funksjoner til innebygd programvare initieres/kontrolleres via et menneskelig grensesnitt, men gjennom maskingrensesnitt i stedet.

Produsenter bygger innebygd programvare inn i elektronikken til biler, telefoner, modemer, roboter, apparater, leker, sikkerhetssystemer, pacemakere, TV-er og set-top-bokser, og digitale klokker, for eksempel. Denne programvaren kan være veldig enkel, for eksempel lyskontroller som kjører på en 8-bits mikrokontroller med noen få kilobyte minne med passende nivå av prosesseringskompleksitet bestemt med et Probably Approximately Correct Computation-rammeverk (en metodikk basert på randomiserte algoritmer). Imidlertid kan innebygd programvare bli svært sofistikert i applikasjoner som rutere, optiske nettverkselementer, fly, missiler og prosesskontrollsystemer.[6]

Operativsystemer
----------------

I motsetning til standard datamaskiner som vanligvis bruker operativsystemer som macOS, Windows eller Linux, kan innebygd programvare ikke bruke noe operativsystem. Når de bruker en, kan et bredt utvalg av operativsystemer velges fra, vanligvis et sanntidsoperativsystem. Kode for innebygd programvare er vanligvis skrevet i C eller C++, men ulike programmeringsspråk på høyt nivå, som Java, Python og JavaScript, er nå også i vanlig bruk for å målrette mot mikrokontrollere og innebygde systemer.[7] Assembly-språk brukes også ofte, spesielt ved oppstart og avbruddshåndtering. Ada brukes i noen militære og luftfartsprosjekter.

Forskjeller fra applikasjonsprogramvare
---------------------------------------

De fleste forbrukere er kjent med applikasjonsprogramvare som gir funksjonalitet på en datamaskin. Imidlertid er innebygd programvare ofte mindre synlig, men ikke mindre komplisert. I motsetning til applikasjonsprogramvare har innebygd programvare faste maskinvarekrav og muligheter, og tillegg av tredjeparts maskinvare eller programvare er strengt kontrollert.

Innebygd programvare må inkludere alle nødvendige enhetsdrivere på produksjonstidspunktet, og enhetsdriverne er skrevet for de forskjellige maskinvareenhetene. Disse enhetsdriverne, kalt BSP (Board support package), danner laget av programvare som inneholder maskinvarespesifikke drivere og andre rutiner som lar et bestemt operativsystem (tradisjonelt et sanntidsoperativsystem, eller RTOS) fungere i et bestemt maskinvaremiljø (en datamaskin eller CPU-kort), integrert med selve RTOS. Programvaren er svært avhengig av CPU og spesifikke brikker som er valgt. De fleste innebygde programvareingeniører har minst en bestått kunnskap om å lese skjemaer og lese datablader for komponenter for å bestemme bruken av registre og kommunikasjonssystem. Konvertering mellom desimal, heksadesimal og binær er nyttig i tillegg til å bruke bitmanipulasjon.[8]

Webapplikasjoner brukes ofte til å administrere maskinvare, selv om XML-filer og andre utdata kan sendes til en datamaskin for visning. Filsystemer med mapper brukes vanligvis, men SQL-databaser er ofte fraværende.

Programvareutvikling krever bruk av en krysskompilator, som kjører på en datamaskin, men produserer kjørbar kode for målenheten. Feilsøking krever bruk av en in-circuit emulator, og feilsøking maskinvare som JTAG eller SWD debuggers. Programvareutviklere har ofte tilgang til hele kjernekoden (OS).

Størrelsen på lagringsminnet og RAM kan variere betydelig. Noen systemer kjører i 16 KB Flash og 4 KB RAM med en CPU som opererer på 8 MHz, andre systemer kan konkurrere med moderne datamaskiner.[9] Disse plasskravene fører til at mer arbeid blir gjort i C eller innebygd C++, i stedet for C++. Tolkede språk som BASIC (mens f.eks. Parallax Propeller kan bruke kompilert BASIC) og Java (Java ME Embedded 8.3[10] er tilgjengelig for f.eks. ARM Cortex-M4, Cortex-M7 mikrokontrollere og eldre ARM11 brukt i Raspberry Pi og Intel Galileo Gen. 2 ) er ikke ofte brukt; mens en implementering av det tolkede Python 3-språket – MicroPython – er imidlertid tilgjengelig eksplisitt for mikrokontrollerbruk, f.eks. 32-biters ARM-baserte (som BBC micro:bit) og 16-biters PIC-mikrokontrollere.

Kommunikasjonsprotokoller
-------------------------

Kommunikasjon mellom prosessorer og mellom én prosessor og andre komponenter er avgjørende. I tillegg til direkte minneadressering inkluderer vanlige protokoller på maskinvarenivå I²C, SPI, serielle porter, 1-ledninger, Ethernet og USB.

Kommunikasjonsprotokoller designet for bruk i innebygde systemer er tilgjengelig som lukket kilde fra selskaper inkludert InterNiche Technologies og CMX Systems. Åpen kildekode-protokoller stammer fra uIP, lwip og andre.

Referanser
----------

1. ↑  Emilio, Maurizio Di Paolo (2014). *Embedded systems design for high-speed data acquisition and control*. Cham. ISBN 978-3-319-06865-7. OCLC 890646530.
2. ↑  Alippi, Cesare (2014). *Intelligence for embedded systems : a methodological approach*. Berlin. ISBN 978-3-319-05278-6. OCLC 878424116.

Litteratur
----------

* Edward A. Lee, "Embedded Software", *Advances in Computers* (M. Zelkowitz, editor) **56**, Academic Press, London, 2002.