In-circuit emulering

In-circuit emulation ( ICE ) är användningen av en hårdvaruenhet eller in-circuit emulator som används för att felsöka programvaran i ett inbäddat system . Den fungerar genom att använda en processor med ytterligare förmåga att stödja felsökningsoperationer, såväl som att utföra systemets huvudfunktion. Särskilt för äldre system, med begränsade processorer, innebar detta vanligtvis att processorn tillfälligt ersattes med en hårdvaruemulator: en kraftfullare men dyrare version. Det var historiskt sett i form av bond-out-processor som har många interna signaler som tagits fram i syfte att felsöka. Dessa signaler ger information om processorns tillstånd.

På senare tid omfattar termen även JTAG -baserade hårdvarufelsökningar som ger likvärdig åtkomst med hjälp av on-chip-felsökningshårdvara med standardproduktionschips. Att använda standardchips istället för anpassade bond-out-versioner gör tekniken allmänt förekommande och låg kostnad, och eliminerar de flesta skillnaderna mellan utvecklings- och körtidsmiljöer. I detta vanliga fall för in-circuit emulator en felaktig benämning , ibland förvirrande, eftersom emulering inte längre är involverad.

Inbyggda system ger speciella problem för programmerare eftersom de vanligtvis saknar tangentbord , bildskärmar , diskenheter och andra användargränssnitt som finns på datorer. Dessa brister gör felsökningsverktyg i kretsar väsentliga för många vanliga utvecklingsuppgifter.

Fungera

En in-circuit emulator (ICE) ger ett fönster in i det inbäddade systemet. Programmeraren använder emulatorn för att ladda program i det inbäddade systemet, köra dem, gå igenom dem långsamt och visa och ändra data som används av systemets programvara.

En emulator har fått sitt namn eftersom den emulerar (imiterar) den centrala processorenheten (CPU) på det inbäddade systemets dator. Traditionellt hade den en plugg som sätts in i uttaget där CPU:n integrerade kretschip normalt skulle placeras. De flesta moderna system använder målsystemets CPU direkt, med speciell JTAG-baserad felsökningsåtkomst. Emulering av processorn, eller direkt JTAG-åtkomst till den, låter ICE göra allt som processorn kan göra, men under kontroll av en mjukvaruutvecklare.

ICEs ansluter en datorterminal eller persondator (PC) till det inbyggda systemet. Terminalen eller PC:n tillhandahåller ett interaktivt användargränssnitt för programmeraren för att undersöka och kontrollera det inbyggda systemet. Till exempel är det rutin att ha en källkodsnivåfelsökning med ett grafiskt fönstergränssnitt som kommunicerar via en JTAG-adapter (emulator) till ett inbäddat målsystem som inte har något grafiskt användargränssnitt .

Särskilt när deras program misslyckas blir de flesta inbyggda system helt enkelt blockerade . Inbyggda system saknar ofta grundläggande funktioner för att upptäcka tecken på programvarufel , till exempel en minneshanteringsenhet (MMU) för att fånga upp minnesåtkomstfel. Utan en ICE kan utvecklingen av inbyggda system vara extremt svår, eftersom det vanligtvis inte finns något sätt att säga vad som gick fel. Med en ICE kan programmeraren vanligtvis testa kodbitar, sedan isolera felet till en viss kodsektion och sedan inspektera den felaktiga koden och skriva om den för att lösa problemet.

Vid användning förser en ICE programmeraren med exekveringsbrytpunkter , minnesvisning och övervakning samt in-/utgångskontroll. Utöver detta kan ICE programmeras för att leta efter alla matchningskriterier att pausa vid, i ett försök att identifiera orsaken till ett fel.

De flesta moderna mikrokontroller använder resurser som tillhandahålls på den tillverkade versionen av mikrokontrollern för enhetsprogrammering, emulering och felsökningsfunktioner, istället för att behöva en annan speciell emuleringsversion (det vill säga bond-out) av målmikrokontrollern. Även om det är en kostnadseffektiv metod, eftersom ICE-enheten bara hanterar emuleringen istället för att faktiskt emulera målmikrokontrollern, måste avvägningar göras för att hålla priserna låga vid tillverkningstillfället, men ändå ge tillräckligt med emuleringsfunktioner för de (relativt få) ) emuleringsapplikationer.

Fördelar

Praktiskt taget alla inbyggda system har ett hårdvaruelement och ett mjukvaruelement, som är separata men starkt beroende av varandra. ICE tillåter att mjukvaruelementet körs och testas på hårdvaran som det ska köras på, men tillåter fortfarande programmeringsbekvämligheter att hjälpa till att isolera felaktig kod, såsom felsökning på källnivå (som visar ett program som det ursprungligen skrevs ) och single-stepping (som låter programmerare köra program steg-för-steg för att hitta fel).

De flesta ICE består av en adapterenhet som sitter mellan ICE-värddatorn och systemet som ska testas. Ett stifthuvud och en kabelenhet ansluter adaptern till ett uttag där själva centralprocessorn (CPU) eller mikrokontroller monteras i det inbyggda systemet. Nya ICE:er gör det möjligt för programmerare att komma åt felsökningskretsen på kretsen som är integrerad i CPU:n via JTAG eller (Background Debug Mode Interface) för att felsöka programvaran i ett inbyggt system. Dessa system använder ofta en standardversion av CPU-chippet och kan helt enkelt anslutas till en felsökningsport på ett produktionssystem. De kallas ibland för in-circuit debuggers eller ICD, för att särskilja det faktum att de inte replikerar processorns funktionalitet, utan istället styr en redan existerande standard-CPU. Eftersom CPU:n inte behöver bytas ut kan de fungera på produktionsenheter där CPU:n är inlödd och inte kan bytas ut. På x86 Pentiums används ett speciellt "probläge" av ICE:er för att hjälpa till med felsökning.

I samband med inbyggda system emulerar ICE inte hårdvara. Snarare ger det direkt felsökningsåtkomst till den faktiska CPU:n. Systemet som testas är under full kontroll, vilket gör att utvecklaren kan ladda, felsöka och testa kod direkt.

De flesta värdsystem är vanliga kommersiella datorer som inte är relaterade till den CPU som används för utveckling. Till exempel kan en Linux- dator användas för att utveckla programvara för ett system som använder ett Freescale 68HC11- chip, en processor som inte kan köra Linux.

Programmeraren redigerar och kompilerar vanligtvis också det inbäddade systemets kod på värdsystemet. Värdsystemet kommer att ha speciella kompilatorer som producerar körbar kod för det inbäddade systemet, så kallade korskompilatorer eller korsmontörer .

On-chip felsökning

On-chip-felsökning är ett alternativ till in-circuit emulering. Den använder ett annat tillvägagångssätt för att nå ett liknande mål.

On-chip-felsökning, ofta löst kallad Joint Test Action Group (JTAG), använder tillhandahållandet av ett extra felsökningsgränssnitt till den aktiva hårdvaran i produktionssystemet. Det ger samma funktioner som felsökning i kretsar, såsom inspektion av internt tillstånd eller variabler och kan ha möjlighet att ställa in kontrollpunkter, brytpunkter och vaktpunkter. Skillnaden är att detta tillhandahålls av ytterligare kisel i produktionsprocessorn, snarare än att byta ut processorn mot en extern felsökningsemulator. Av denna anledning ändras vissa av funktionerna hos ICE av processorns specifikationer. Ett ytterligare JTAG-gränssnitt läggs till styrkortet, och detta krävs på varje produktionssystem, men eftersom detta bara kräver några få signalstift är extrakostnaden minimal. JTAG-gränssnitt utvecklades ursprungligen för, och är fortfarande användbara för testning av produktionsslut.

Intel

För att stödja felsökning av in-circuit emulator (ICE) på Intel 286 fanns ytterligare fem stift tillgängliga på processorn: ett ingångsstift för att externt tvinga fram en ICE-brytpunkt, ( ICEBP# ) och två alternativa par utgångsstift för att välja operationer via ICE -bus istället för användarminne. På 80286 finns två instruktioner ( 0F 04 , 0F 05 ) för att dumpa/återställa hela CPU-tillståndet till minnesoffset 0x800, tillsammans med ett enkelbyte-överstyrningsprefix ( F1 ) för att aktivera ICE-läge för att komma åt användarminne.

Se även

externa länkar