Re: Lepší C++ pro AVR i do Microchip studia
Pavel Hudeček
edizon na seznam.cz
Sobota Leden 4 02:23:01 CET 2025
Zajímavé ale je, že se mi u všech řádků, kde se test(něco) používá,
objevuje "error" required from here, ale překlad proběhne a program funguje.
Naopak třeba snaha použít try selhala,
> template <class ...C> void test(C ... args) {
> try {
> uint8_t siz = sizeof...(C);
> if (siz>7) throw(1);
> uint8_t res[siz]={args...};
>
> for (uint8_t n=0; n<7; n++) {
> if (res[n]>=cLedValsCnt) throw(2);
> if (n>=siz) ledky[n] = 0;
> else ledky[n] = ledVals[res[n]];
> }
> } catch (int e) {
> pip(50, e);
> }
> }
napřed že prej musím povolit přes -fexception, pak to vypadalo OK. Jenže
pokud vznikla situace, že by exception měl nastat, hromada errorů ve stylu:
> Severity Code Description Project File Line
> Error C:\Users\edison\Documents\Atmel
> Studio\DDM\vyrobky\bargraf-814-hand\testGcc2\Debug/.././mainGcc2.cpp:43:(.text._Z4testIJiiiiiiiiEEvDpT_[_Z4testIJiiiiiiiiEEvDpT_]+0x30):
> undefined reference to `__gxx_personality_sj0' testGcc2 1
(jen jednou, 43 je řádek deklarace funkce)
> Severity Code Description Project File Line
> Error C:\Users\edison\Documents\Atmel
> Studio\DDM\vyrobky\bargraf-814-hand\testGcc2\Debug/.././mainGcc2.cpp:46:(.text._Z4testIJiiiiiiiiEEvDpT_[_Z4testIJiiiiiiiiEEvDpT_]+0x64):
> undefined reference to `__cxa_allocate_exception' testGcc2 1
(a tohle hodněkrát pro řádky 46 a/nebo 50, tedy ty s throw)
> Severity Code Description Project File Line
> Error undefined reference to `typeinfo for int' testGcc2
> C:\Users\edison\Documents\Atmel
> Studio\DDM\vyrobky\bargraf-814-hand\testGcc2\Debug\mainGcc2.cpp 1
(tohle je 3x na konci výpisu chyb, všechno na řádek 1)
Zrovna exceptiony by se mi líbily.
PH
Dne 03.01.2025 v 22:14 Pavel Hudeček napsal(a):
> Dobrý den všem,
>
> tak jsem 10 sekund gůglil a:
> https://github.com/ZakKemble/avr-gcc-build/releases/tag/v14.1.0-1
>
> Rozbaleno do Program files
> V MCh studiu nastaveno jako další flavour a ejhle najednou chodí C++
> konstrukce co dřív nechodily
>
> Např. taková testovací blbůstka, ovládat část LEDek dle počtu argumentů:
>
> template <typename T> void ledSet1(uint8_t idx, T arg) {
> if (idx<4) {
> if (arg==0) LED_03port.OUTCLR = 1<<(LED_0bp+idx);
> else LED_03port.OUTSET = 1<<(LED_0bp+idx);
> } else {
> if (arg==0) LED_46port.OUTCLR = 1<<(LED_4bp-(idx-4));
> else LED_46port.OUTSET = 1<<(LED_4bp-(idx-4));
> }
> }
> template <class ...C> void test(C ... args) {
> uint8_t siz = sizeof...(C);
> uint8_t res[siz]={args...};
>
> if (siz>7) { pip(100}; return; }
> for (uint8_t n=0; n<7; n++) {
> if (n>=siz) ledSet1(n, 0);
> else ledSet1(n, res[n]);
> }
> }
> Červený místa po ... zůstaly, ale přeložit jde a funguje.
> Tohle otestováno na vzorovém, ručně kresleném blikopípátku s ATtiny814
> na kroužek, ale chodí i jiné věci třeba pro AVR64DD32.
>
> Vždycky jsem si myslel, že na ty nový AVR má Microchip nějakej novej
> překladač, ale nikoliv.
> Jen jsem teda nezjistil jak to jinak než editací PRJ přepínat u
> existujícího projektu, musí se ten flavour vytvořit a nastavit v
> globálních settings jako default pro nový.
Další informace o konferenci Hw-list