Autoalalla työskentelevä tuntee leimat jokaisessa vaatimusmäärittelyssä: QM, ASIL-A, ASIL-B, ASIL-C, ASIL-D. Lyhenne tarkoittaa « Automotive Safety Integrity Level » ja tulee ISO 26262 -standardista — tieliikenneajoneuvojen toiminnallisen turvallisuuden standardista. QM:n ja ASIL-D:n välille mahtuu universumi prosessityötä, dokumentaation laajuutta ja kehityskustannuksia.

Käytännössä ASIL-B on yleisin taso sarjatuotannon ohjainlaitteissa. Moottorinohjaimet, jarruelektroniikka, kameran esikäsittely, akkuhallinta — suuri osa näistä on ASIL-B. Ja juuri tässä kohdassa asia muuttuu konkreettiseksi C-kehittäjälle.

Tämä artikkeli kertoo, mitä ASIL-B on todella tarkoittanut projekteissa, joihin olen osallistunut — standardin sitaattien ulkopuolella. Ei teoriaa, vaan kompastuskivet ja se, mikä auditoinnissa ratkaisee.

Mitä standardi vaatii ASIL-B-tasolla

ISO 26262-6 (Product Development at the Software Level) määrittelee taulukot, joissa jokainen toiminto ja ASIL-taso on merkitty sanoilla « highly recommended », « recommended » tai « no recommendation ». ASIL-B tarkoittaa lyhyesti:

Ja — tärkeää — jokainen työkalu, jonka lopputulos vaikuttaa koodiin (kääntäjä, koodigeneraattori, testikehys), on kvalifioitava tai luokiteltava ISO 26262-8:n mukaan. Tähän palataan myöhemmin.

MISRA-C: aliarvostettu portinvartija

MISRA-C ei ole C-kehittäjän vihollinen — vaikka MISRA-C:2012:n noin 170 sääntöä ja direktiiviä tuntuvatkin aluksi ylivoimaisilta. Useimmat säännöt ovat yksinkertaisesti järkeviä: ei implisiittisiä konversioita, ei taaksepäin hyppääviä gotoja, ei muuttujien nimien varjostusta, ei dynaamista muistia.

Mikä tekee asiasta vaikean käytännössä, on jotain muuta: MISRA erottelee Required, Advisory ja Mandatory. Ja jokainen poikkeama vaatii muodollisen deviationin — kirjallisesti perustellun, katselmoidun ja turvallisuusvastuullisen allekirjoittaman yksittäistapauksen.

« Yhdessä projektissa meillä oli loppuvaiheessa noin 400 deviationia. Jokainen vaati perustelun, turvallisuusvaikutusten analyysin ja vastatodistuksen. Se ei ole paperityötä — se on oikeaa työtä. »

Tyypillisiä sudenkuoppia:

Käytännön suositus

Kun ASIL-B-koodi suunnitellaan alusta alkaen, MISRA on otettava huomioon heti alusta. Olemassa olevan koodikannan MISRA-yhteensopivaksi tekeminen jälkikäteen maksaa kolmesta viiteen kertaa enemmän kuin oikein alusta asti. Polyspacen, LDRA:n tai Helix QAC:n kaltaiset työkalut tarkastavat automaattisesti — mutta mikään sääntö ei ole 100 % automaattisesti tarkistettavissa. Jotkin säännöt vaativat ihmisen arviointia.

Staattinen analyysi on enemmän kuin vihreä merkki

Standardi vaatii staattista analyysiä — tämä ymmärretään usein väärin « aja MISRA-checkeri ». Todellisuudessa ISO 26262 tarkoittaa huomattavasti enemmän:

Polyspace Code Proverin kaltaiset työkalut tekevät ensimmäisistä kolmesta kohdasta muodollisesti todistettavia — ei vain heuristisia. Työkalu käy läpi kaikki mahdolliset suorituspolut ja värjää jokaisen operaattorin vihreäksi (turvallinen), punaiseksi (virhe) tai oranssiksi (ei voitu päättää). Oranssi on vihollinen: jokainen kohta on analysoitava manuaalisesti.

Käytännöstä

Polyspace-ajo keskikokoiselle moottorinohjainkomponentille voi helposti kestää useita tunteja. Analyysi tunnistaa tyypillisesti 50–200 oranssia kohtaa 10 000 koodirivillä. Jokainen on arvioitava: onko kyseessä todellinen virhe, vai puuttuuko työkalulta vain kontekstia?

Yleensä useimmat oranssit ovat vääriä positiivisia. Mutta jokaisella ajolla löytyy myös 2 tai 3 todellista virhettä, joita yksikään koodikatselmointi tai yksikkötesti ei olisi löytänyt.

Testikattavuus: lausekkeiden kattavuus ei riitä

ASIL-B vaatii ISO 26262-6 taulukon 12 mukaan vähintään haarojen kattavuuden yksikkötasolla. ASIL-C:lle ja ASIL-D:lle tulee lisäksi MC/DC-kattavuus (Modified Condition/Decision Coverage).

Ero on tärkeä:

KattavuustyyppiMitä tarkastetaanASIL-taso
Statement CoverageJokainen lause suoritetaan vähintään kerranQM, A
Branch CoverageJokainen haara (if/else) käydään molempiin suuntiinB
MC/DCJokainen ehto yhdistelmässä vaikuttaa tulokseen itsenäisestiC, D

Pieni esimerkki havainnollistamaan:

if (anturi_ok && (rpm > 1000)) {
    laukaise_toiminto();
}

Lausekkeiden kattavuutta varten riittää yksi testitapaus, jossa molemmat ehdot ovat tosia ja laukaise_toiminto() kutsutaan.

Haarojen kattavuutta varten tarvitaan lisäksi testitapaus, jossa kokonaisehto on epätosi — riippumatta siitä, kumpi osa ratkaisee.

MC/DC:tä varten on osoitettava, että molemmat osatekijät vaikuttavat tulokseen itsenäisesti. Tässä tapauksessa tarvitaan kolme testitapausta. Yhdistelmissä, joissa on viisi tai kuusi osatekijää, testitapausten määrä räjähtää.

Käytännön seuraus

ASIL-B-yksikkötestit ovat laajat mutta hallittavat. Cantatan, VectorCASTin tai TestWell CTC++:n kaltaiset työkalut instrumentoivat koodin ja mittaavat kattavuutta objektikoodin tasolla. Tarvitaan tyypillisesti 3–5 testitapausta funktiota kohti.

ASIL-D:hen (kaistavahti, turvatyynyn laukaisu) siirtyminen on kivuliasta: 8–20 testitapausta funktiota kohti, monet luovilla syötteillä MC/DC-aukkojen sulkemiseksi.

Puolustava ohjelmointi: mitä se tarkoittaa käytännössä?

ISO 26262 vaatii puolustavaa ohjelmointia sanomatta tarkasti, mitä se on. Autoalan käytännössä on vakiintunut useita malleja:

Syöteparametrien tarkistus

void aseta_rpm(uint16_t rpm)
{
    if (rpm > MAX_RPM) {
        rpm = MAX_RPM;   /* rajoita sen sijaan että epaonnistuisi */
        /* Valinnainen: vikamuistimerkintä */
    }
    /* ... */
}

Älä laukaise assertion-virhettä — se pysäyttää ajoneuvon. ASIL-B-koodissa virheellinen syöte yleensä maskataan ja valinnaisesti kirjataan.

Uskottavuustarkistukset suoritusaikana

uint32_t lue_lampoanturi(void)
{
    uint32_t t_raw = adc_read(TEMP_KANAVA);

    if ((t_raw < TEMP_MIN_RAW) || (t_raw > TEMP_MAX_RAW)) {
        aseta_vika(VIKA_LAMPOANTURI);
        return TEMP_DEFAULT;   /* varavierssin */
    }
    return t_raw;
}

Ei loputtomia silmukoita

Jokainen while(1)-silmukka (paitsi päätehtävän ajastimessa) tarvitsee timeout-laskurin. Jokainen do..while puhtaan poistumisen.

Watchdog ei vain alussa ja lopussa

Tyypillinen aloittelijan virhe: watchdog-trigger ennen ja jälkeen päätehtävän. Parempi: pitkien operaatioiden sisällä useilla triggeripisteillä, jotta jumiutunut tehtävä havaitaan.

Työkalukvalifikaatio: usein unohdettu työpanos

Jokainen työkalu, jonka lopputulos menee tuotteeseen, on arvioitava ISO 26262-8:n mukaan. Tämä koskee:

Luokittelu tapahtuu TCL:n (Tool Confidence Level) 1, 2 tai 3 kautta. Kääntäjä saavuttaa tyypillisesti TCL3:n — korkeimman tason — ja sen on oltava joko kvalifioitu (valmistajalta, safety manualin kanssa) tai varmistettu kompensoivilla toimenpiteillä (disassembly-vertailu, käänteinen kääntäminen).

Kustannusajuri numero yksi

Työkalukvalifikaation aliarvioiminen on yleisin kustannusajuri ASIL-projekteissa. Kesken kehityksen löytäminen, että valitulla kääntäjällä ei ole kvalifioitua buildia, pakottaa joko vaihtamaan (miljoonakustannus) tai ottamaan käyttöön massiivisia kompensoivia toimenpiteitä.

Käytännön suositus: ennen ensimmäistä koodiriviä listataan työkaluketju ja pyydetään valmistajilta kvalifikaatiodokumentaatio. Se ei ole muodollisuus — se on projektille kriittistä.

Oikeasta projektista

Muistan mekaanisesti suuntautuneen auto-osatoimittajan, joka perinteisesti toimittaa mekaanisia komponentteja ja oli päättänyt kehittää itse pysäköintijarrun aktuaattorin ohjausohjelman. Ohjelmistotiimi oli Detroitissa, Yhdysvalloissa. Kehitys eteni aikataulussa kuukausia — kunnes juuri ennen eurooppalaisen loppuasiakkaan etapin toimitusta nousi yllättäen esiin kysymys kääntäjän safety manualista.

Vastaus: Detroitissa käytetty C-kääntäjä ei ollut kvalifioitu ISO 26262:lle. Ei TCL-luokitusta valmistajalta, ei safety manualia, ei dokumentoitua listaa turvallisuusvaatimuksiin liittyvistä kääntäjän ongelmista. Paniikki oli valtava. Pysäköintijarru ei ole toissijainen toiminto — se on turvallisuuskriittinen, koska tahaton vapautuminen ajoneuvon seisoessa mäessä voi johtaa hallitsemattomaan liikkumiseen.

Lopulta tehtiin klassinen kompensoivien toimenpiteiden paketti: valittujen avainfunktioiden disassembly-vertailu, lisäintegraatiotestit tehostetulla vikainjektiolla, dokumentoitu työkalun käyttöanalyysi. Kaikki siksi, että projektin alussa kukaan ei ollut esittänyt yksinkertaista kysymystä: « Onko kääntäjämme todella kvalifioitu sille ASIL-tasolle, joka meidän on toimitettava? »

Opetus: jos olette mekaniikkatalo, joka tekee ohjelmistoja ensimmäistä kertaa, älkää kohdelko työkalukvalifikaatiota yksityiskohtana. Ja jos jaatte kehityksen useille maantieteellisille sijainneille, varmistakaa, että loppuasiakkaan prosessivaatimukset tunnetaan ja toteutetaan jokaisessa paikassa.

Mikä konkreettisesti erottaa ASIL-B:n QM:stä

Moni aloittelija kysyy: « Mitä eroa on QM-koodin ja ASIL-B-koodin välillä? Sama C-koodi tekee saman asian. » Teknisesti se pitää paikkansa. Organisatorisesti kuin yö ja päivä:

ToimintoQMASIL-B
Vaatimusten jäljitettävyyssuosituspakollinen (työkalutuella)
Koodikatselmointisuosituspakollinen, dokumentoitu, määritelty tarkastajan pätevyys
MISRA-C-yhteensopivuusnice-to-havepakollinen, muodolliset deviationit
Yksikkötestien kattavuusstatementbranch
Työkalukvalifikaatioei vaadittupakollinen
Vikainjektio HW-tasollaeisuositus
Dokumentaatio per LOC5–10×

Viimeisen rivin kerroin ei ole liioittelua: ASIL-B-projektin koodin ympärille tuotettava dokumentaatio ylittää varsinaisen koodin moninkertaisesti. Safety Plan, Safety Case, HAZOP-analyysi, FMEA, validointisuunnitelma, verifiointisuunnitelma, integraatiosuunnitelma, testiraportit — jokainen näistä dokumenteista ei ole lomake vaan itsenäinen työ.

Mitä neuvoisin aloittelijalle

  1. Lue standardi. Ei kokonaan, mutta ISO 26262-6 (Software Development) ja -8 (Supporting Processes) kuuluvat perusvarustukseen. Se, joka lukee vain vaatimusmäärittelyn, ei ymmärrä, miksi vaatimusmäärittely on sellainen kuin se on.
  2. Ota MISRA-C käyttöön aikaisin. Projektin ensimmäisenä päivänä, ei ensimmäisen integraatiotestin jälkeen.
  3. Kiinnitä työkaluketju projektin alussa. Kääntäjän versio, buildpalvelin, staattinen analyysityökalu — päätöksiä, joita on myöhemmin lähes mahdotonta peruuttaa.
  4. Testit ovat pakollisia, eivät valinnaisia. Se, joka säästää testauksen « projektin loppuun », ei toimita projektia. Testit kirjoitetaan yhdessä koodin kanssa.
  5. Katselmointikulttuurin vakiinnuttaminen. Katselmoinnit eivät ole muodollisuuksia. Turvallisuusauditoija tarkastaa katselmointipöytäkirjat tarkasti: esitettiinkö oikeita kysymyksiä, vai laitettiinko vain ruksit?
  6. Vaatimukset ovat ankkuri. Ilman puhtaita, linkitettäviä vaatimuksia ei ole Safety Casea. DOORS tai Polarion ovat täällä standardi.

Yhteenveto

ASIL-B ei ole vaikea — se on työläs. Se, joka ei näe lisäarvoa, kokee prosessin kiusantekona. Se, joka on kerran nähnyt staattisen analyysin löytävän todellisen kilpailutilanteen, joka olisi aiheuttanut onnettomuuden kentällä, ymmärtää, miksi standardi on niin yksityiskohtainen.

35 vuodessa autoalalla olen oppinut: laatu ei tule testaamalla lopuksi, vaan prosessin, työkalujen ja kurinalaisuuden kautta koko kehityksen ajan. ISO 26262 on vähemmän este kuin tarkistuslista asioista, joita odottaisin hyvälle autokoodin myös ilman standardia.

Suurin loikka aloittelijalle ei ole koodi — vaan ymmärtää, että ASIL-B on laatua, ja laadulla on hintansa: tunneissa, dokumentaatiossa ja jokaisen vaiheen sitoutumisessa. Vastineeksi saa koodia, johon voi luottaa. Ja autoalalla se on hintansa arvoinen.