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ä.
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.cppVirheenkäsittely ilman poikkeuksia
Käyttäkää seuraavia:
- Paluuarvokoodeja (
std::expected,std::optionalja 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.
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
- Sulautettujen järjestelmien rajoitteet: ei RTTI:tä eikä poikkeuksia
- Muistikartoitettu I/O ja volatile
- Reaaliaikaisuuden näkökohdat ja viive
- Ristikkäiskäännös ARM-kohteille