C++ Academy · Oppitunti

Sulautettujen järjestelmien rajoitteet: ei RTTI:tä eikä poikkeuksia

Työskentele tyypillisten sulautettujen järjestelmien alijoukoissa, joissa RTTI ja poikkeukset on poistettu käytöstä.

Oppitunti 1/414 vaihetta

Sulautettujen järjestelmien rajoitteet: ei RTTI:tä eikä poikkeuksia on ilmainen C++ Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu C++ Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Sulautettu C++

Sulautetuissa järjestelmissä on rajoitteita: vähän RAM-muistia, ei MMU:ta ja reaaliaikaisia määräaikoja. C++:n "freestanding"-alijoukko poistaa kielestä osia, jotka ovat liian raskaita.

Miksi ei RTTI:tä?

RTTI (Run-Time Type Information) tukee toimintoja dynamic_cast ja typeid. Jokainen polymorfinen luokka sisältää ylimääräisen osoittimen, ja RTTI-taulukot kasvattavat koodin kokoa. Poistakaa RTTI käytöstä valitsimella -fno-rtti.

Miksi ei poikkeuksia?

Poikkeukset tarvitsevat pinojen purkutaulukoita ja ajonaikaista tukea, mikä kasvattaa koodia ja tekee ajoituksesta ennakoimatonta. Monissa sulautettujen järjestelmien koodikannoissa käytetään valitsinta -fno-exceptions.

g++ -fno-rtti -fno-exceptions main.cpp

Virheenkäsittely ilman poikkeuksia

Käyttäkää seuraavia:

  • Paluuarvokoodeja (std::expected, std::optional ja virheen enumeraatiot)
  • Out-parametreja tuloksille
  • std::error_code-järjestelmää järjestelmävirheille

Tulostyypit

C++23:n std::expected<T, E> edustaa joko arvoa tai virhettä — samaan tapaan kuin Rustin Result. Monet sulautettujen järjestelmien projektit käyttävät jo mukautettua Result-tyyppiä.

std::expected<int, ErrorCode> parse(const char* s);

if (auto r = parse("42"); r) use(*r);
else                       log_error(r.error());

Dynaamisen varauksen välttäminen

Keon pirstoutuminen on reaaliaikajärjestelmille haitallista. Sulautettujen järjestelmien koodissa new-operaattorin käyttö käynnistyksen jälkeen kielletään usein. Käyttäkää seuraavia:

  • Pinovaraus
  • Staattiset taulukot
  • Muistipoolit
  • Sulautettuihin järjestelmiin sopivat varaimet

Staattisen muistin mallit

Varaa muistia käännös- tai käynnistysaikana.

template <typename T, size_t N>
class StaticVector {
    alignas(T) char storage_[sizeof(T) * N];
    size_t size_ = 0;
public:
    void push_back(const T& v);
    // ...
};

Käännösaikainen polymorfismi

Korvatkaa virtuaalifunktiot mahdollisuuksien mukaan malleilla tai CRTP:llä — tällöin ei tarvita vtablea eikä epäsuoria kutsuja.

template <typename Derived>
class Base {
public:
    void process() { static_cast<Derived*>(this)->process_impl(); }
};

class Concrete : public Base<Concrete> {
public:
    void process_impl() { /* ... */ }
};

Freestanding-standardikirjasto

freestanding-C++-alijoukko ei sisällä suurinta osaa <iostream>-kirjastosta, säikeistystä eikä dynaamista muistinvarausta. Standardi määrittelee tarkasti, mitä ominaisuuksia on saatavilla.

etl: Embedded Template Library

Embedded Template Library (ETL) tarjoaa STL:n kaltaisia säiliöitä, joiden koko on deterministinen ja jotka eivät käytä dynaamista muistinvarausta.

Koodin kokoon liittyvät huolenaiheet

Käyttäkää koon optimointiin valitsinta -Os, linkityksenaikaiseen optimointiin valitsinta -flto ja käyttämättömän koodin poistamiseen valitsimia -ffunction-sections -fdata-sections -Wl,--gc-sections.

Käytännössä: Mars-mönkijät ja autot

C++:aa käytetään laajasti turvallisuuskriittisissä sulautetuissa järjestelmissä, kuten autoalalla (AUTOSAR), ilmailussa (MISRA) ja lääkinnällisissä laitteissa (IEC 62304). Koodausstandardit rajoittavat kieltä entisestään.

Pikatarkistus

Mikä kääntäjän valitsin poistaa C++:n poikkeustuen käytöstä binäärin koon pienentämiseksi?

Kertaus

Sulautetussa C++:ssa RTTI ja poikkeukset poistetaan käytöstä koodin koon ja ennakoitavuuden vuoksi. Korvatkaa kekomuisti staattisella muistilla, käyttäkää virheisiin tulostyyppejä ja polymorfismiin CRTP:tä. MISRAn kaltaiset koodausstandardit rajoittavat kieltä entisestään.

Aloita maksutta

Opi C++ tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”Sulautettujen järjestelmien rajoitteet: ei RTTI:tä eikä poikkeuksia” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa C++ Academy-oppimispolun 3 oppituntia, myös oppitunnin “Sulautettujen järjestelmien rajoitteet: ei RTTI:tä eikä poikkeuksia”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Sulautettujen järjestelmien rajoitteet: ei RTTI:tä eikä poikkeuksia”?

Työskentele tyypillisten sulautettujen järjestelmien alijoukoissa, joissa RTTI ja poikkeukset on poistettu käytöstä. Harjoittelet C++ Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C++ Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C++ Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Sulautettujen järjestelmien rajoitteet: ei RTTI:tä eikä poikkeuksia”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C++ Academy-oppitunnilla?

Kyllä. Jokainen C++ Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Sulautettujen järjestelmien rajoitteet: ei RTTI:tä eikä poikkeuksia
  2. Muistikartoitettu I/O ja volatile
  3. Reaaliaikaisuuden näkökohdat ja viive
  4. Ristikkäiskäännös ARM-kohteille
← Takaisin: C++ Academy