Forum: Compiler & IDEs avr-libstdcpp - Atmel Studio 7 - std::throw bad alloc()


von Veit D. (devil-elec)


Angehängte Dateien:

Lesenswert?

Hallo,

hat schon jemand diese Lib mit AS7 zum laufen gebracht?
https://github.com/modm-io/avr-libstdcpp

Verwendet wird eine Toolchain mit avr-gcc 11.2.0 mit C++20 Einstellung.

Zuerst hatte ich undefinierte Referenzen auf delete und new. Das konnte 
ich beheben durch verschieben der .cpp Dateien aus den example 
Verzeichnis in ein gemeinsam erreichbares common Verzeichnis. Jetzt 
erhalte ich noch eine undefinierte Referenz auf std::throw bad alloc()
Das kann laut meines Wissens alles mögliche sein.
Der Lib Ersteller macht nur unter Linux rum und kann mir nicht helfen.

Mein Testcode.
1
#include <avr/io.h>
2
3
//#include <cxxabi.cpp>   // ohne Wirkung
4
#include <new.cpp>
5
6
#include <vector>
7
#include <algorithm>
8
   
9
int main(void)
10
{
11
    std::vector<int> v1 {1, 2, 3, 4};
12
    while (1)
13
    {
14
    }
15
}

Hat irgendwer Ideen zur Fehlerbehebung?

: Bearbeitet durch User
von Klaus W. (mfgkw)


Lesenswert?

Wie sieht die Meldung genau aus? Mit zwei Leerzeichen im Namen?
Nicht zufällig Tiefstriche? std::bad_alloc()?

Soll die cpp-lib Ausnahmen werfen im Fehlerfall?


Und welche Compileroptionen nimmst du genau?

von g457 (Gast)


Lesenswert?

> Nicht zufällig Tiefstriche? std::bad_alloc()?

noch besser: std::__throw_bad_alloc().

@FO bist du sicher dass du den C++-Linker benutzt und nicht den von C? 
Falls ja dann zeig doch bitte die ∗exakten∗ Compiler/Linkeraufrufe nebst 
Ausgaben.

von Oliver S. (oliverso)


Lesenswert?

__throw_bad_alloc() steht in src/functexept.cc.

Das ganze src-Verzeichnis musst du zu deinem Projekt hinzufügen. Die 
Dateien da drin müssen mit compiliert und gelinkt werden.

Oliver

: Bearbeitet durch User
von Bewunderer der Programmierkünste (Gast)


Lesenswert?

Ich wundere mich, dass dir #include <new.cpp> nicht um die Ohren gehauen 
wird. Sei es vom Studio und den Leuten hier.

von Oliver S. (oliverso)


Lesenswert?

Autsch. Das hatte ich gar nicht gesehen.

In dem Fall empfiehlt es sich, doch erst einmal einen Grundkurs C7C++ zu 
machen, und die fortgeschrittenen Experimente auf später zu verschieben.

Oliver

von Veit D. (devil-elec)


Angehängte Dateien:

Lesenswert?

Hallo,

die gesamte Ausgabe.

von Veit D. (devil-elec)


Angehängte Dateien:

Lesenswert?

Hallo,

include von new.cpp entfernt, war "nur" ein letzter verzweifelter 
Versuch gewesen, der dessen Fehler scheinbar behoben hatte. src 
inkludiert, kompiliert. :-)  vector demzufolge erstmal okay.

Aber sort erzeugt leider erneut einen Error
undefined reference to `operator new(unsigned int)'  avrLibStdCpp 
<artificial>  1
1
#include <avr/io.h>
2
#include <vector>
3
#include <memory>
4
#include <algorithm>
5
using namespace std;
6
   
7
int main(void)
8
{
9
    vector<int> v1 {1, 2, 3, 4};
10
    v1.size();
11
    int zahlen[9] = {3, 8, 1, 9, 5, 6, 4, 2, 7};
12
    sort(zahlen, zahlen + 9);
13
    
14
    while (1)
15
    {
16
    }
17
}

: Bearbeitet durch User
von Oliver S. (oliverso)


Lesenswert?

Veit D. schrieb:
> Aber sort erzeugt leider erneut einen Error
> undefined reference to `operator new(unsigned int)'

Veit D. schrieb:
> Zuerst hatte ich undefinierte Referenzen auf delete und new. Das konnte
> ich beheben durch verschieben der .cpp Dateien aus den example
> Verzeichnis in ein gemeinsam erreichbares common Verzeichnis.

Ja, was den nun? Wenn die Datei "new" aus dem common-Verzeichnis Teil 
deines Projektes ist, sollte das nicht passieren.

Oliver

von MitLeserin (Gast)


Lesenswert?

In /avr-libstdcpp/examples/vector/ findet sich ein Beispiel.

In AS7 ein neues c++ Project erstellen,

in SolutionExplorer ¦ Project ¦ rechtsklick ¦ Properties ¦ Advanced ¦ 
eine Toolchain für c++17 wählen,

in SolutionExplorer ¦ Project ¦ rechtsklick ¦ add existing item ¦ die 
Dateien *.cpp aus Verzeichnis ../examples/common/ in das Project 
einbinden

in SolutionExplorer ¦ Project ¦ rechtsklick ¦ add existing item ¦ die 
Dateien *.cc aus Verzeichnis ../src/ in das Project einbinden.

Source aus ../examples/vector/main.cpp in AS7 main.cpp kopieren.

Rebuild Solution sollte ohne Fehler kompilieren.

Das MAKEFILE des Beispiels zeigt den Weg.

von MitLeserin (Gast)


Angehängte Dateien:

Lesenswert?

Screenshot

von Veit D. (devil-elec)


Lesenswert?

Hallo,

Danke liebe Mitleserin. Soweit kompiliert das alles erstmal fehlerfrei.
Ich habe jedoch aktuell das Problem das meine Usart nichts ausgibt und 
eine Heartbeat Led in while nicht mehr blinkt. Das Teil scheint 
einzufrieren. Trotz das es fehlerfrei kompiliert. Verwende ich eine 
minimal ältere Toolchain, fliegt mir alles um die Ohren. Declare 
conflicts mit math.h und cmath.
Bevor ich darauf aber eingehe, weil das viel zu viel zum erklären wäre, 
muss ich erstmal paar Schritte zurück und selbst versuchen was jetzt los 
ist.
Ich danke allen Helfern und melde mich wenn ich soweit bin.
Danke fürs Verständnis.

von MitLeserin (Gast)


Lesenswert?

Die oben beschriebenen Versuche habe ich mit einer älteren Version von 
avr-libstdcpp durchgeführt.

Quelle:
https://github.com/modm-io/avr-libstdcpp/tree/2030cc27f3238419f792ac4558877f9bf571af2a

Diese Version wird in der Bibliothek
https://github.com/KonstantinChizhov/Mcucpp/tree/master/3rdparty
verwendet

Die aktuelle Version
https://github.com/modm-io/avr-libstdcpp

compiliert aber ebenfalls ohne Fehler für avr-gcc-8/9/10/11

Für avr-gcc-10/11 die bekannte Warnung:
'volatile'-qualified left operand is deprecated

*****************
Die Parameter des Beispiels ../examples/vector/main.cpp gemäss MAKEFILE

Device ATmega328p

F_CPU=16000000

-std=c++17


avr-gcc-11.1.0-x64-windows(*) avr-size:  3308       42       38     3388 
d3c  libstdcpp_test.elf

avr-gcc-10.1.0_x64-mingw(*) avr-size:    3352       42       38     3432 
d68  libstdcpp_test.elf

avr-gcc-9.3.0-mingw64-selfmade avr-size:  3312       42       38 
3392      d40  libstdcpp_test.elf

avr-gcc-8.3.0-x64-mingw avr-size:   3340       42       38     3420 
d5c  libstdcpp_test.elf

(*) compound assignment with 'volatile'-qualified left operand is 
deprecated [-Wvolatile]  libstdcpp_test 
Y:\0_CPP\0_Test\libstdcpp_test\libstdcpp_test\uart.cpp  52

von MitLeserin (Gast)


Lesenswert?

Korrektur: avr-gcc-10/11: Dei Warnung 'volatile'-qualified left operand 
is deprecated nur mit -std=c++2a ¦ -std=c++20

von Veit D. (devil-elec)


Angehängte Dateien:

Lesenswert?

Hallo,

das gestern mit der usart nichts mehr ging war mal wieder der Klassiker. 
Ich hatte sei() vergessen. Jetzt habe ich mit der avrLibStdCpp alles 
nochmal gemacht und es funktioniert. Für mich und die Nachwelt nochmal 
dokumentiert. Vielen Dank an Mitleserin.

Nebeninfo. Das mir gestern mit einer älteren Toolchain alles um die 
Ohren flog mit cmath/math.h lag daran, dass meine Toolchains die 
aktuelle avrlibc verwenden und die avr-libstdcpp auf eine ältere 
aufbaut. In meine aktuelle Toolchain hatte ich eine ältere Version von 
math.h kopieren/überschreiben. Die avr-libstdcpp macht daraus vieles 
wieder undefiniert. Meine älteren Toolchains sind unverbogen.

Jetzt hätte ich noch eine Frage. Was ist der Unterschied ob ich die .cpp 
und .cc Dateien in den Projektordner kopiere bzw. ob ich dem Projekt die 
Verzeichnisse mittels Directories Pfadangabe bekannt mache? Warum werden 
diese Dateien mit letzterem nicht gefunden?
1
/*
2
 * avrLibStdCpp.cpp
3
 * Created: 10.03.2022 10:25:31
4
 * Author : Devil Elec
5
 * 
6
   AVR128DB48 Curiosity Nano Board
7
              | default |   used    | PortMux |  
8
   USART.0.Tx |   PA0 (16MHz Quarz) |   PA4   |  
9
   USART.0.Rx |   PA1 (16MHz Quarz) |   PA5   | 
10
   USART.1.Tx |   PC0               |   PC4   | 
11
   USART.1.Rx |   PC1               |   PC5   | 
12
   USART.2.Tx |   PF0  (RTC Quarz)  |   PF4   | 
13
   USART.2.Rx |   PF1  (RTC Quarz)  |   PF5   |
14
   USART.3.Tx |   PB0  (Debug)      |   PB4   | 
15
   USART.3.Rx |   PB1  (Debug)      |   PB5   | 
16
   USART.4.Tx |   PE0               |   ---   | 
17
   USART.4.Rx |   PE1               |   ---   |   */
18
19
#include <avr/io.h>
20
#include <util/delay.h>
21
22
#include <vector>
23
#include <memory>
24
#include <array>
25
#include <algorithm>
26
27
#include <AVRxDB_Pin.h>
28
#include <ClockLib.h>
29
#include <AVRxDB48_Usart.h>
30
Usart <1> usart1;
31
OutputPin <BOARDLED> onboardLed;
32
33
using namespace std;
34
vector<int> v1 {5, 7, 4, 2, 8, 6, 1, 9, 0, 3};
35
array<int, 10> arrV1 = {7, 5, 8, 2, 4, 6, 9, 1, 0, 3};
36
37
template<class T>
38
void printContainer(T container)
39
{
40
    for (auto elem : container) {
41
        usart1.print(elem);
42
        usart1.putString_P(", ");
43
    }
44
};
45
                          
46
int main(void)
47
{
48
    initOnboard16MHzQuarz(); 
49
    usart1.init(250000);
50
    onboardLed.init();
51
    onboardLed.enableInvertIO();
52
    sei();
53
    usart1.putString_P("\nuC Reset ### ###\n");
54
    
55
    usart1.putString_P("\nVECTOR");
56
    usart1.putString_P("\nAnzahl Elemente: ");
57
    usart1.println(v1.size() );
58
  
59
    usart1.putString_P("\nvector unsortiert\n");
60
    printContainer(v1);
61
    
62
    usart1.putString_P("\nsort default\n");
63
    sort( begin(v1), end(v1) );  
64
    printContainer(v1); 
65
    
66
    usart1.putString_P("\nsort absteigend\n");
67
    sort( begin(v1), end(v1), greater<int>() );  
68
    printContainer(v1);  
69
    
70
    usart1.putString_P("\nARRAY");
71
    usart1.putString_P("\nAnzahl Elemente: ");
72
    usart1.println(arrV1.size() );
73
74
    usart1.putString_P("\narray unsortiert\n");
75
    printContainer(arrV1);
76
77
    usart1.putString_P("\nsort default\n");
78
    sort( begin(arrV1), end(arrV1) );
79
    printContainer(arrV1);
80
81
    usart1.putString_P("\nsort absteigend\n");
82
    sort( begin(arrV1), end(arrV1), greater<int>() );
83
    printContainer(arrV1);    
84
     
85
    usart1.putString_P("\nExample vector\n");
86
    vector<uint8_t> test{10, 1, 2, 42, 3};
87
    test.push_back(4);
88
    test.erase(test.begin());
89
90
    if(auto it = find(test.begin(), test.end(), 42); it != test.end()) {
91
        test.erase(it);
92
    }
93
   printContainer(test); 
94
     
95
    while (1)
96
    {
97
        onboardLed.setOn();
98
        _delay_ms(75);
99
        onboardLed.setOff();
100
        _delay_ms(925);
101
    }
102
}

von MitLeserin (Gast)


Lesenswert?

Die eingefügten Include-Verzeichnisse erlauben das Einbinden der dort 
enthaltenen Header-Dateien mit
1
#include<datei>
Für Source-Dateien genügt das nicht. Der Compiler compiliert jede 
Source-Datei einzeln. Jede Source-Datei muss explizit als source.cxx 
bekannt sein.

Der Link zur Datei genügt.

in SolutionExplorer ¦ Project ¦ rechtsklick ¦ add existing item ¦ ADD as 
Link ¦ den LINK zu den Dateien *.cxx aus Verzeichnis ../xyz/ in das 
Project einbinden.

In Output ist der Build-Prozess für jede Source-Datei dokumentiert:

Building file: 
../../0_avr-libstd-cpp/avr-libst-cpp-2022/examples/common/cxxabi.cpp

../../avr-gcc-11.1.0-x64-windows\bin\avr-g++.exe" ... mit allen flags 
...

Finished building: 
../0_avr-libstd-cpp/avr-libst-cpp-2022/examples/common/cxxabi.cpp

von Veit D. (devil-elec)


Lesenswert?

Hallo,

Danke, jetzt ist mir das klarer.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.