Udvikling af indlejret software: Stak, proces og omkostninger | Post Picture Crunch-IS
INDHOLD

To ingeniører, du stoler på, giver dig modsatte svar i det samme møde. Den ene vil have FreeRTOS på den eksisterende mikrocontroller og siger, at produktet vil blive leveret på den halve tid. Den anden vil have embedded Linux, argumenterer for, at forbindelsesplanen gør det uundgåeligt, og siger, at det vil koste mere at gøre det senere end at gøre det nu. Begge har ret i noget. Ingen i lokalet kan sætte tal på forskellen, og beslutningen udskydes til næste møde, hvor det ikke bliver lettere.

Den beslutning er den, der stille og roligt fastsætter omkostningerne, tidsplanen og vedligeholdelsesbyrden for hele produktet. Den træffes tidligt, på ufuldstændigt grundlag, af folk, som ikke bliver dem, der skal leve med den i år fire. At få den rigtig handler mindre om at kende mulighederne — de fleste teams kender dem — og mere om at vide, hvilke fire eller fem fakta om dit eget produkt der faktisk afgør den.

Denne artikel dækker området mellem idéen og shortlisten: hvad udvikling af indlejret software dækker, hvordan stakvalget træffes, hvordan leveringsprocessen ser ud trin for trin, hvor arbejdet går galt, og hvad der driver tallet på tilbuddet. Hvis du allerede ved, hvordan softwaren skal bygges, og er ved at finde ud af, hvem der skal bygge den, så de bedste virksomheder inden for udvikling af indlejret software sammenligner elleve firmaer op mod offentliggjort, verificerbar kapacitet.

Key Takeaways
  1. Beslutningen om bare metal, RTOS og embedded Linux drives af fire input — worst-case timing, hukommelses- og strømbudget, samtidighed og forbindelse samt bemanding til langsigtet vedligeholdelse — og bør dokumenteres med sin begrundelse, fordi det er dyrt at omgøre den senere.
  2. Firmware og indlejret software bruges i flæng på små produkter og holder op med at kunne bruges i flæng i det øjeblik, der er et operativsystem imellem.
  3. Hardwareparathed, ikke estimatkvalitet, er det, der rykker indlejrede tidsplaner; et first-spin-board med aktive errata ugyldiggør enhver plan, der er bygget oven på det.
  4. Test på målhardware er den bærende del af processen, fordi de defekter, der betyder noget, opstår under termisk, elektrisk og timingmæssig belastning, som simulering ikke gengiver.
  5. AI komprimerer reelt det omkringliggende arbejde — opbygning af drivere, udvidelse af test, dokumentation — og komprimerer ikke de dele, der kræver dømmekraft: arkitektur, timing-analyse og aflæsning af et oscilloskop-spor.
  6. Sikkerhed og opdateringsevne er gået fra valgfri til strukturel, og EU’s Cyber Resilience Act er årsagen til, at produktteams nu planlægger OTA og håndtering af sårbarheder fra starten.

Hvad er indlejret software?

Indlejret software er software, der kører på en enhed for at få den enhed til at udføre sit arbejde, snarere end på en almindelig computer for at køre, hvad end brugeren åbner. Den befinder sig på processoren inde i produktet — en mikrocontroller i en sensor, et system-on-chip i en køretøjs-hovedenhed, en lille applikationsprocessor i en industriel gateway — og den er skrevet til den specifikke hardware, med et fast hukommelsesbudget og som regel deadlines, som den skal overholde hver cyklus.

I praksis dækker begrebet et meget bredere spektrum af aktiviteter end “at skrive kode til en chip”. Et enkelt produkt kan involvere initialisering af hardware ved opstart, skrivning af drivere så processoren kan kommunikere med sine sensorer og radioer, integration eller konfiguration af et operativsystem, opbygning af applikationslogikken, implementering af en kommunikationsstak og konstruktion af en mekanisme til opdatering af det hele ude i marken flere år senere. Det er forskellige discipliner med forskellige specialister bag sig, hvilket er grunden til, at softwareteams for indlejrede systemer ser anderledes ud end applikationsteams.

Det, der gør det svært at skrive software til indlejrede systemer, er, at begrænsningerne er fysiske og ikke til forhandling. En applikationsserver under belastning kan tildeles mere hukommelse. Det kan en batteridrevet sensor ikke, og det kan en styringssløjfe, der har 200 mikrosekunder til at reagere, heller ikke. Hver designbeslutning i indlejret arbejde træffes op mod et loft, som en anden har fastsat, og de fleste af de interessante fejl er timingfejl, der kun viser sig, når hardwaren er varm, bussen er travl, eller batteriet er lavt.

Indlejret software vs firmware

Den skelnen, folk oftest spørger om, er indlejret software vs firmware, og det ærlige svar er, at det afhænger af, hvor stort produktet er.

Firmware er laget tættest på metallet: bootloaderen, den lavniveau-initialisering, der kører før noget som helst andet, og koden, der styrer perifere enheder direkte. Det ligger typisk i ikke-flygtig hukommelse på enheden og opdateres som et samlet image snarere end som separate komponenter.

Indlejret software er paraplybetegnelsen. Den omfatter firmware og alt derover, som stadig kører på enheden — et RTOS eller et indlejret Linux-system, middleware, applikationslogikken og enhver grænseflade, som brugeren berører.

På et lille mikrocontroller-produkt er der intet over firmware-laget, så de to ord beskriver det samme, og at diskutere dem spilder tid. Forskellen mellem firmware og indlejret software begynder at betyde noget, når et produkt har et operativsystem i midten, for så har du komponenter med separate udgivelsescyklusser, separate opdateringsmekanismer og separat ejerskab — og en samtale om at “opdatere firmwaren” bliver reelt tvetydig.

Indlejret softwareeksempler på tværs af brancher

De nyttige eksempler på indlejret software er dem, der viser, hvor forskelligt den samme disciplin opfører sig under forskellige begrænsninger:

  • Automotive. Engine and body control units running AUTOSAR-based software under functional safety requirements, alongside infotainment systems that are effectively Linux computers with a hard boot-time target.
  • Medicinsk udstyr. Infusionspumper, patientmonitorer og diagnostiske instrumenter, hvor selve softwarelivscyklussen er reguleret, og hvert krav skal kunne spores til en test.
  • Industriel. PLC’er, motorstyringer og maskinsikkerhedssystemer, hvor en overskredet deadline er en fysisk hændelse, ikke et tabt billede.
  • Energi og forsyning. Smarte målere og ladepunkter, hvor begrænsningen er et årti med feltlevetid på hardware, der skal forblive sikker og fjernopdaterbar.
  • Forbruger. Bærbare enheder, husholdningsapparater og lydenheder, hvor de bindende begrænsninger er enhedsomkostning, strømforbrug og produktionsvolumen.

Hvorfor Udvikling af Indlejret Software Er Sværere Nu

Two things changed at once, and they compound:Oversættelse til dansk:To ting ændrede sig på én gang, og de forstærker hinanden:

  1. Produktværdien er flyttet ind i softwaren. Hardwarekapaciteten er konvergeret på tværs af de fleste kategorier: sammenlignelig silicium er tilgængelig for alle, og forskellen mellem to konkurrerende enheder er i stigende grad, hvad softwaren gør med den, og hvor længe produktet fortsætter med at blive bedre efter købet. Det hæver loftet for, hvad indlejrede teams bliver bedt om at levere — forbindelse, fjerndiagnostik, intelligens på selve enheden, funktionsopdateringer til en installeret base — på de samme processorer og de samme strømbudgetter som før.
  2. Sikkerhed blev et krav for markedsadgang. Opdateringskapacitet og håndtering af sårbarheder plejede at være tekniske præferencer. Under EU’s Cyber Resilience Act er der salgsbetingelser: secure boot, image-signering, en fungerende over-the-air-vej og en sårbarhedsproces er nu defineret ved starten af et program frem for at blive eftermonteret af den, der har kapacitet i år to. De tre datoer, der fastsætter tidsplanen, og hvad hver forpligtelse gør ved en firmware-kodebase, er beskrevet i Cyber Resilience Act-kravene til firmware-teams. Det er muligt at eftermontere dem, og det er konsekvent blandt de dyreste opgaver, et hardware-team kan blive bedt om at udføre.

Den akkumulerende omkostning ved at stå stille er ligetil regning. Et produkt, der sendes ud uden en pålidelig opdateringssti, er en flåde, du ikke kan lappe, og hver enhed, der sælges, øger blot problemet. Det gør ikke en omskrivning til det rigtige svar — de fleste produkter har ikke brug for en — men det flytter opdateringsarkitektur fra “senere”-listen til “før første levering”-listen.

Bare Metal, RTOS eller Embedded Linux: De Tre Muligheder

Sorteret efter grad af ændring og omkostning:

  1. Bare metal. Intet operativsystem. Din kode kører i en hovedløkke med interrupt-handlere, og du styrer præcist, hvad der sker og hvornår. Mindst pladsforbrug, strammest timing-kontrol, laveste overhead og den højeste omkostning ved at tilføje samtidighed senere.
  2. Et RTOS — FreeRTOS, Zephyr, ThreadX og andre. En scheduler, opgaver og synkroniseringsprimitiver oven på en mikrocontroller. Du betaler en beskeden pris i hukommelse og kompleksitet og får struktureret samtidighed, hvilket er grunden til, at dette er standardvalget for forbundne produkter, hvor flere ting sker på én gang.
  3. Embedded Linux. Et komplet operativsystem med et filsystem, en netværksstak, pakkehåndtering og en grafikstak, bygget til dit board gennem en board support-pakke og som regel et Yocto- eller Buildroot-baseret image. Det kræver en applikationsprocessor og betydelig mængde RAM, og det tilbyder et stort område at konfigurere, sikre og vedligeholde — i bytte for funktioner, der ellers ville tage år at bygge. Softwareudvikling til Embedded Linux er også den mulighed med den længste opstartsperiode, fordi BSP’en skal eksistere, før arbejdet med applikationen kan begynde.

Rigtige produkter blander dem. Et instrumentbræt i et køretøj kan køre embedded Linux til displayet, mens en separat mikrocontroller kører sikkerhedsrelevante funktioner bare metal, med en defineret grænseflade mellem dem. En industriel gateway parrer almindeligvis en Linux-applikationsprocessor med en RTOS-baseret realtids-coprocessor. Opdelingen er en designbeslutning i sig selv, og det er ofte en bedre tilgang end at tvinge en enkelt stak til at udføre begge opgaver.

Sådan træffes valget i virkeligheden

Fire input afgør det, og ingen af dem er præference:

  • Worst-case-timing. Ikke gennemsnitlig latenstid — den deadline, du aldrig må overskride, og hvad der sker fysisk, hvis du gør.
  • Hukommelse og strømbudget. Hvor meget RAM og flash den valgte komponent har, og hvad energibudgettet tillader en inaktiv scheduler at forbruge.
  • Samtidighed og forbindelse. Hvor mange uafhængige ting sker på samme tid, og hvor omfattende netværks- og opdateringskravene er.
  • Hvem vedligeholder det. Et team på tre personer, der vedligeholder en bare-metal-kodebase på tværs af fire produktvarianter i år fem, er en reel omkostning, og det er den faktor, der oftest udelades i beslutningen.

Dokumentér svaret og begrundelsen sammen. Beslutningen er billig at træffe og dyr at genoverveje, og om tre år er det begrundelsen, der fortæller det næste team, om den begrænsning, der drev den, stadig holder.

Den Indlejrede Softwareudviklingsproces, Trin for Trin

Sekvensen nedenfor er, hvordan en velkørende udvikling af indlejret software proces ser ud. Hvert trin findes for at nedbringe en bestemt risiko, og at springe et over flytter den risiko længere frem, hvor den koster mere.

1. Vurdering af hardware og begrænsninger. Kortlæg processoren, sættet af perifere enheder, timingkravene, effektbudgettet og integrationsafhængighederne, før der skrives nogen kode. Det, dette giver, er, at begrænsninger dukker op i planlægningen frem for midt i opbygningen, hvor kursændringer betyder hardwareændringer.

2. Arkitektur- og stakbeslutning. Vælg bare metal, RTOS eller Linux ud fra de fire input ovenfor, definer grænserne for hardwareabstraktion, og træf beslutning om opdaterings- og sikkerhedsarkitekturen nu i stedet for efter, at applikationen virker. Gennemgået og dokumenteret er dette den artefakt, som hele opbygningen måles op imod.

3. Board bring-up og BSP. Få boardet til at boote, initialiser clock-træet og periferienheder, og fremstil en board support-pakke, som resten af softwaren kan bygges på. På et custom board i første omgang finder dette trin også hardware-errata, hvilket er præcis, hvad det er til for.

4. Driver- og firmwareudvikling. Perifere drivere, kommunikationsstakken og applikationslogikken, bygget op mod de abstraktionsgrænser, der blev fastlagt i trin to. På et automotive-menneske-maskine-grænsefladeprogram, som vi leverede i C++, QML og Qt over CAN, var det her, at flersproget support og en valet-mode-sikkerhedsfunktion blev bygget som adskillelige komponenter frem for som funktioner viklet ind i grænsefladen — hvilket er grunden til, at tilføjelsen af den næste forblev billig.

5. Verifikation på målhardware. Enhedstest, hardware-in-the-loop-validering og analyse af grænsebetingelser kører parallelt med udviklingen frem for som en fase til sidst. Dette er det trin, der afgør, om produktet fungerer uden for laboratoriet, og det er det, der oftest komprimeres, når en tidsplan skrider.

6. Produktionsovergang og feltunderstøttelse. Firmwarevarianter til produktion, konfiguration af enhedsprogrammering, testfikstureringer til fremstilling og et defineret overvågningsvindue efter implementering. Produkter møder deres reelle forhold, efter at de er afsendt, og planen skal kunne overleve det.

Embedded Software Development Services

Udfordringer værd at planlægge for i udvikling af software til indlejrede systemer

  1. Hardwareparathed. Forsinkede boards, first-spin-errata og delt prototypehardware ugyldiggør softwaretidsplaner uanset kvaliteten af estimaterne. Planlæg efter faseinddelt hardwaretilgængelighed, få emulering eller et udviklingsboard på plads tidligt, og angiv antagelsen eksplicit, så alle kan se, hvornår den brydes.
  2. Timingfejl, der kun opstår under belastning. Kapløbstilstande, prioritetsinversion og problemer med afbrydelseslatens er ofte usynlige under godartede forhold og kun reproducerbare, når printkortet er varmt, og bussen er travl. Hardware-in-the-loop-rigge og langvarige udmattelsestest er det, der finder dem; kodegennemgang alene gør det ikke.
  3. Værktøjskæde og reproducerbarhed af builds. Indlejrede builds afhænger af specifikke compilerversioner, linker-scripts og leverandør-SDK’er, og et build, der kun virker på én ingeniørs maskine, er en risiko, der dukker op i det værst tænkelige øjeblik. Fastlås værktøjskæden, læg den i CI, og behandl build-miljøet som en leverance.
  4. Certificeringsomfang opdaget for sent. Kravsporbarhed, dokumenteret verifikation og designhistorik er ikke papirarbejde, der tilføjes til sidst under IEC 62304 eller ISO 26262 — de ændrer, hvordan krav og tests håndteres fra dag ét. At opdage dette i femte måned er en af de dyreste opdagelser, der findes.
  5. Opdateringsstien som en eftertanke. Sikker opstart, billedsignering, tilbagerulningsadfærd og hvad der sker, når en trådløs opdatering fejler halvvejs, er arkitektur, ikke funktioner. At eftermontere dem i en udrullet flåde er muligt, og det er aldrig billigt.
  6. Viden der forsvinder med folk. Indlejrede kodebaser er tætte, hardware-specifikke og ofte underdokumenterede, og de oprindelige forfattere går videre. Dokumenterede abstraktionsgrænser og et overførbart byggemiljø er det, der holder produktet vedligeholdeligt, hvilket er grunden til, at de hører hjemme i arbejdsbeskrivelsen.

Værktøjer til udvikling af indlejret software og hvor AI hjælper

De værktøjskategorier er stabile, og de specifikke navne betyder mindre end at have hver kategori dækket:

  • Værktøjskæder og IDE’er — leverandør- og åbne værktøjskæder, krydskompilere og leverandørens SDK til den valgte siliciumfamilie.
  • Byggesystemer — Yocto eller Buildroot til Linux-images, CMake og afhængighedsstyring til firmware.
  • Fejlfinding og sporing — JTAG- og SWD-sonder, on-target-debuggere, logikanalysatorer og oscilloskoper. De sidste to er stadig der, hvor svære timingproblemer bliver løst.
  • RTOS og middleware — skemalæggeren og de kommunikations-, lagrings- og sikkerhedskomponenter, der ligger oven på den.
  • Testinfrastruktur — unit test-frameworks, hardware-in-the-loop-rigge, statisk analyse og CI-runnere med rigtige boards tilsluttet.
  • Sikkerhedsværktøjer — signeringsinfrastruktur, CVE-overvågning i forhold til dit sæt af afhængigheder og SBOM-generering.

AI er blevet reelt nyttigt på tværs af en del af denne liste. I vores egen AI-drevet ingeniørarbejde model genererer agenter driver- og perifer-boilerplate, udvider testdækning i forhold til grænsebetingelser og holder dokumentationen opdateret sammen med koden — arbejde, der er reelt, gentaget og tidligere tog uger. På en build til produktionsdrift leveret af en AI Pod producerede denne model et MVP 63 % hurtigere med et 56 % mindre leveringsteam end en traditionel build af samme omfang.

SAP‑Integrated Manufacturing App Built by an AI Pod
63% faster MVP delivery
56% smaller delivery team
See Our Work

Hvad det ikke komprimerer, er den del, der kræver dømmekraft. Arkitekturbeslutninger, analyse af worst-case-timing, aflæsning af en oscilloskopkurve for at finde ud af, hvorfor en bus giver glitches på et varmt kort, og beslutningen om, hvorvidt en fejltilstand er acceptabel, er stadig ingeniørarbejde, og outputtet fra en agent, der ikke er blevet gennemgået af nogen, der kan udføre disse ting, er plausibel firmware, hvilket er værre end åbenlyst forkert firmware. Det nyttige spørgsmål om AI i indlejret arbejde er ikke, om et team bruger det — det gør de fleste nu — men hvem der er ansvarlig for det, det producerer.

Sådan ser indlejret softwareudvikling ud i praksis

Indlejret arbejde bedømmes på, hvad der sker efter den første udgivelse, når den anden og tredje funktion ankommer, og de grænser, der blev trukket tidligt, enten holder eller begynder at opkræve leje.

En bilunderleverandør havde brug for at levere HMI-funktioner hurtigere, end deres udgivelsesplan tillod. Hybrid- og elbilsprogrammer blev ved med at tilføje grænsefladekrav — tekst-til-tale, parkeringstilstand, telefonprojektion, konfiguration ved båndets ende — og hvert enkelt landede som en ændring til en tæt koblet grænseflade, så hvert enkelt kostede mere end det forrige. Et team på fem ingeniører, der arbejdede i C++, QML, Qt og Python over CAN, Wayland og CommonAPI, ombyggede funktionerne som adskillelige komponenter mod rene grænser. Funktionsudrulning kørte 2x hurtigere, håndfri systembrug steg 30%, og grænsefladen blev leveret på 8 sprog.

Human‑machine integration project
2x faster feature deployment
30% increase in hands-free system usage
Read a case study

Sejren kom fra struktur snarere end snilde. Genopbygget som adskillelige komponenter mod rene grænseflader holdt funktionerne op med at konkurrere med hinanden, og udrulningshastigheden, brugstallene og lokaliseringen fulgte alle heraf. De grænser, der fastlægges tidligt, er dem, der afgør omkostningen ved hver ændring efter dem.

Hukommelsessikre sprog er på vej ind i produktionsfirmware. Rust er gået fra argument til leveret kode i bil- og industriarbejde, herunder migreringer af tidskritiske komponenter inden for eksisterende AUTOSAR-miljøer — udvikling af indlejret bilsoftware er der, hvor presset for hukommelsessikkerhed landede først, og hvor værktøjerne er modnet for at imødekomme det. Det erstatter ikke C, og modne C-kodebaser retfærdiggør sjældent en omskrivning — men for nye sikkerhedsrelevante komponenter har regnestykket ændret sig.

Intelligens flytter over på enheden. Inferens ved kanten er nu levedygtig på komponenter, der ikke ville have understøttet det for få år siden, hvilket flytter designproblemet fra modelnøjagtighed til strøm, hukommelse og termisk kapacitet. Begrænsningen er hardwaren, ikke modellen, og at afgrænse det som et IoT-udviklingsspørgsmål snarere end et datavidenskabeligt spørgsmål giver bedre svar.

Softwaredefinerede produkter trækker arkitekturen mod opdaterbarhed. At konsolidere funktioner på færre og mere kapable processorer, adskille sikkerhedskritiske arbejdsbelastninger fra funktionsbelastninger og designe til et årti med fjernopdateringer bliver standardantagelser snarere end avanceret praksis — drevet lige så meget af regulering som af produktstrategi.

Konklusion

De fleste indlejrede programmer afgøres af tre ting, der fastlægges tidligt: stakken, opdateringsarkitekturen, og hvorvidt verificering sker på rigtig hardware hele vejen igennem eller kun til sidst. Få dem rigtige, og resten af arbejdet er normal ingeniørkunst. Få dem forkerte, og ingen mængde af leveringsdisciplin kan redde tidsplanen.

Når tilgangen er fastlagt, er det tilbageværende spørgsmål, hvem der udfører arbejdet — og det er en anden sammenligning, der foretages ud fra offentliggjort kapacitet snarere end ud fra hensigt. Denne førende virksomheder inden for udvikling af indlejret software oversigt rangerer elleve virksomheder på tværs af de tre niveauer, der betjener dette marked, med kriterierne til at matche dem til din egen skala.

Still weighing bare metal, an RTOS, or embedded Linux for your product?
Talk to an AI Expert