eigene int main in Arduino IDE

OP #7329886
Lesenswert?

hallo; wenn man ganz "normal" die Arduino IDE benutzt mit void setup und void loop wird ja die int main(void) aus der main.cpp aufgerufen, die dann setup() und loop() aufruft. Jetzt kann man ja statt void setup und void loop selber eine int main() eingeben in die Arduino IDE. Frage: wie wird denn das gesteuert dass dann die eigene int main aufgerufen wird und nicht die aus der main.cpp ?

Gast #7329915
Lesenswert?

Von mir aus... Dennoch ist es der Builder, welcher prüft, ob du eine eigene main() gebaut hast und dementsprechend agiert.

Wenn du wissen möchtest wie er das genau tut, müsstest du wohl in seinen Quellcode schauen. Auch der liegt öffentlich aus.

OP #7329921
Lesenswert?

weiss jemand wo genau der Code des Builders abgespeichert ist ?

Also der Builder prüft ob der eigene Sketch eine int main() hat und verwendet diese, ansonsten verwendet er die int main() aus der main.cpp und hängt den Code des eigenen Sketches hintendran ? Die main.cpp kann man ja ganz leicht selber abändern. Wo ist denn der Code des Builders gespeichert ? den müßte man ja ebenfalls leicht ändern können oder ?

#7329940
Lesenswert?

Michael S. schrieb:

Wo ist denn der Code des Builders gespeichert ? den müßte man ja ebenfalls leicht ändern können oder ?

Du musst nichts ändern, wenn die main-Funktion in dem c++ Unterbau als weak definiert wurde.

Alternativ nennst du deine main-Funktion eben my_main() und rufst die einfach im setup() selber auf. Oder eben im loop()... Funktioniert, weil deine my_main() hoffentlich auch nie zurückkehrt ;) mfg mf

Gast #7329956
Lesenswert?

Achim M. schrieb:

wenn die main-Funktion in dem c++ Unterbau als weak definiert wurde.

Das scheint mir nicht der Fall zu sein. Zumindest finde ich es nicht im Core https://github.com/arduino/ArduinoCore-avr/blob/9f8d27f09f3bbd1da1374b5549a82bda55d45d44/cores/arduino/main.cpp

Da ist einiges als weak deklariert, auch im weiteren Umfeld (den anderen Dateien). Aber main(), sehe ich nicht

Beitrag #7330029 wurde von einem Moderator gelöscht.
Gast #7330033
Lesenswert?

J. S. schrieb:

bau doch erstmal ein int main() in ein .ino oder .cpp ein und gucke was der Builder so meldet.

Getestet, soweit erstmal möglich: So wie es aussieht wird die originale main.cpp auch kompiliert, wenn man eine eigene main() baut.

Es kann also gut sein, dass dich weder beim Preprocessor, noch beim Builder irgendwas davon findet. Und doch stört den Linker das kein bisschen.

Diese Indizien sprechen für "weak" (in welcher Form auch immer) Und dagegen, dass der Builder da irgendwas steuert.

Gast #7330039
Lesenswert?

Michael S. schrieb:

Ich möchte gar nicht rumsuchen oder vermuten oder Vermutungen anderer nachspüren sondern frage einfach ob es einer ganz genau weiss und mir sagen kann.

Du meine Güte, ist das denn so schwer?


1
 x1.cpp
2
#include <iostream>
3
int __attribute__((weak)) main(void) {
4
    std::cout << "weak";
5
    return 0;
6
}

1
 x2.cpp
2
#include <iostream>
3
int main(void) {
4
    std::cout << "strong";
5
    return 0;
6
}

1
g++ -Wall -Wextra -pedantic  -o "x" x1.cpp x2.cpp

Was erscheint beim Aufruf: strong. Wenn man im x2.cpp die main umbenennt und erneut kompiliert: Was erscheint beim Aufruf: weak.

Gast #7330041
Lesenswert?

Michael S. schrieb:

Frage: wie wird denn das gesteuert dass dann die eigene int main aufgerufen wird und nicht die aus der main.cpp ?

Michael S. schrieb:

weiss jemand wo genau der Code des Builders abgespeichert ist ?

Michael S. schrieb:

Ich möchte einfach nur ganz genau die Stelle sehen

Michael S. schrieb:

Kann jemand den Source-Code finden und posten

Michael S. schrieb:

hat jemand Lust die Stelle zu finden

Michael S. schrieb:

vielleicht findet sich ja einer der genau weiss wo die Abfrage zu finden ist...

Michael S. schrieb:

Ich möchte gar nicht rumsuchen oder vermuten oder Vermutungen anderer nachspüren sondern frage einfach ob es einer ganz genau weiss und mir sagen kann.

Sag mal, merkst du nichts mehr? Bewege deinen faulen Hintern selbst!

OP #7330046
Lesenswert?

Also wird die eigene int main kompiliert und die main.cpp wird hintendrangehängt und mitkompiliert ? und die main.cpp ist "weak" und kann deshalb überschrieben werden ? das scheint mir jetzt mal ein Ansatz zu sein. aber hier ist meine main.cpp, da ist doch nichts "weak" an der int main oder ?

1
#include <Arduino.h>
2

3
// Declared weak in Arduino.h to allow user redefinitions.
4
int atexit(void (* /*func*/ )()) { return 0; }
5

6
// Weak empty variant initialization function.
7
// May be redefined by variant files.
8
void initVariant() __attribute__((weak));
9
void initVariant() { }
10

11
void setupUSB() __attribute__((weak));
12
void setupUSB() { }
13

14
int main(void)
15
{
16
  init();
17

18
  initVariant();
19

20
#if defined(USBCON)
21
  USBDevice.attach();
22
#endif
23
  
24
  setup3();
25
    
26
  for (;;) {
27
    loop();
28
    if (serialEventRun) serialEventRun();
29
  }
30
        
31
  return 0;
32
}
OP #7330053
Lesenswert?

danke Norbert, du bist der einzige der meine Frage wirklich beantworten kann. Jetzt aber noch: wieso ist die interne automatisch weak ? wo ist das vermerkt ?

hängt das mit dieser Zeile zusammen ?

1
// Declared weak in Arduino.h to allow user redefinitions.
2
int atexit(void (* /*func*/ )()) { return 0; }
Gast #7330063
Lesenswert?

Also ich habe den Arduino Code nicht, deshalb kann ich nicht nachschauen. Aber falls dieser Mechanismus benutzt wird, dann müsste irgendwo im Arduino Code eine ›main‹ als ›weak‹ definiert sein.

Nur der Vollständigkeit halber: Es gibt noch eine weitere Möglichkeit. Das gesamte Arduino Gelumpe müsste kompiliert und in ein Archiv gesteckt werden (auch die interne ›main‹).

Der Linker würde sich dann nur die Symbole aus dem Archiv holen welche NICHT in deinem Code zu finden wären.

Gast #7330072
Lesenswert?

Norbert schrieb:

Also ich habe den Arduino Code nicht, deshalb kann ich nicht nachschauen.

Das kann ich ändern. https://github.com/arduino/ArduinoCore-avr

Norbert schrieb:

dann müsste irgendwo im Arduino Code eine ›main‹ als ›weak‹ definiert sein.

Dachte ich auch. Aber noch nicht gefunden.

Norbert schrieb:

Es gibt noch eine weitere Möglichkeit. Das gesamte Arduino Gelumpe müsste kompiliert und in ein Archiv gesteckt werden (auch die interne ›main‹).

Das geschieht allerdings! Alle *.o Dateien werden in eine *.a gestopft

Und dann mit der *.ino.cpp.o gelinkt:

1
"E:\\Programme\\arduino/portable/avr-gcc/avr-gcc-11.3.0_mingw32_binutils2.38/bin/avr-gcc" -Wall -Wextra -Os -g -flto -fuse-linker-plugin -Wl,--gc-sections -mmcu=atmega328p -o "E:\\temp\\Arduino/sketch_jan27a.ino.elf" "E:\\temp\\Arduino\\sketch\\sketch_jan27a.ino.cpp.o" "E:\\temp\\Arduino/core\\core.a" "-LE:\\temp\\Arduino" -lm
Gast #7330112
Lesenswert?

Michael S. schrieb:

Ich möchte einfach nur ganz genau die Stelle sehen, an der entschieden wird, ob die eigene int main oder die vom main.cpp genommen wird. weiss jemand wo genau man diese Abfrage sehen kann ?

Wozu? Reicht es dir nicht, wenn du weißt, das deine eigene main() verwendet wird - egal warum?

Gast #7330182
Lesenswert?

Michael S. schrieb:

hallo Norbert und EAF, ich bin nicht so ein Profi wie ihr. Was kann dem jetzt entnehmen ? Wie wird die interne main auf weak geschaltet ?

Gar nicht. Es gibt die oben zuerst gezeigte Möglichkeit das Ganze über ›weak‹ zu lösen, das macht Arduino anscheinend nicht. Oder über die später genannte und deutlich umständlichere Archiv Methode. Es deutet alles darauf hin, das Arduino die letztere Lösungsmöglichkeit nutzt.

Gast #7330510
Lesenswert?

Und ich habe gelernt, dass man mit Fragen welche nicht beantwortet werden können, das Ego von Leuten welche sich für sehr bewandert halten kränken kann. Und diese dann die Frage als sinnlos deklarieren oder was auch immer.

Gast #7330557
Lesenswert?

Hier kollidieren halt die Bedürfnisse unterschiedlicher Menschen aufeinander:

  • Leute, die etwas zügig ans Laufen bringen wollen/müssen
  • Leute, die sich nach Belieben in einzelne Details verstricken dürfen und woanders schlampig sind (z.B. weil Hobby)
  • Leute, die Details untersuchen müssen
  • Leute, die fleißig sind
  • Leute, die zu faul sind, selbst zu arbeiten

Das es dabei zu Rangeleien kommt ist völlig natürlich.

OP #7330629
Lesenswert?

Wenn ich an einem Projekt arbeite und eine konkrete Frage habe dann stelle ich diese Frage in diversen Foren und will so schnell wie möglich die richtige Antwort haben um an meinem Projekt weiterarbeiten zu können. Da will ich keine Aufforderungen, mir die Antwort selbst zu suchen, oder Vermutungen, die mich in die Irre führen. Da sollen eigentlich nur die Leute antworten, die die Antwort ganz genau wissen oder zumindest einen sehr begründeten Ansatz zum Weiterprobieren haben. So haben ja schließlich die Beiträge von Norbert und EAF genau zu der von mir gesuchten Lösung geführt. Ich will doch keine Zeit verplempern und irgendwelchen Aufforderungen nachgehen mir irgendwo selbst die Lösung zu suchen. Auf die eigentliche Lösung wäre ich ohne Norbert und EAF nie gekommen. Das Leben ist kurz.

Schnell wirst du alt, eben warst du noch jung. Jetzt lachst du noch, doch schon bald bist du Dung.

OP #7330683
Lesenswert?

Normales Verhalten ist doch: jemand stellt eine Frage und wer die Antwort weiss oder eine begründete Ahnung hat wo sie zu finden ist teilt das mit. Was ist denn das für ein seltsames Verhalten, auf eine Frage zu antworten mit: suchs dir selber, warum willst du das überhaupt wissen und so weiter und so fort. das ist doch total unerwachsen und kann man sich doch sparen. Wer eine Frage liest und dazu keine Antwort weiss kann sich doch dem Thread fernhalten. Wie viel Langeweile muss man haben um stattdessen jede Menge Senf der Frage hinzuzufügen.

Gast #7330698
Lesenswert?

EAF schrieb:

Dein Verhalten zeigt starke egomanische und narzisstische Züge.

Ja diese komischen Menschen die immer Fragen stellen und eine Antwort auf genau diese Frage erwarten. Und kein Interesse an an sinnlosen Palaver haben welches ihn nicht weiterhilft.

Wann ist die Gesellschaft nur so abgedriftet, dass die Leute so eine hohe Erwartungshaltung bei zwischenmenschlicher Kommunikation bekommen haben.

Gast #7330784
Lesenswert?

Michael S. du verwechselst diese öffentliche Diskussions-Plattform mit einer Professionellen Beratung durch ein Ingenieurs-Büro.

Die meisten Leute sind hier, um sich zu unterhalten, und nebenbei etwas zu lernen. Ich würde das mal mit einer Kneipe vergleichen, nur halt remote statt vis-à-vis.

Professionelle Arbeit kannst du haben, aber nicht kostenlos. Du bist nämlich nicht der einzige, der mit seiner Arbeit das Leben finanzieren muss.

Gast #7330794
Lesenswert?

Wie ist eigentlich jetzt das Ergebnis zur Ursprungsfrage dieses Threads? Wo wird jetzt entschieden, welch "main" verwendet wird? Das ist der Unterschied von Stack-Overflow zum Mikrocontrollernetz: Ein vernünftige Zusammenfassung gibt es nirgends.

Beitrag #7330814 wurde von einem Moderator gelöscht.
Gast #7330860
Lesenswert?

Michael S. schrieb:

Wer Fragen hat stellt sie und wer die Antwort hat sagt sie. Alles andere ist doch Blödsinn.

Nein. Hier sind etliche Leute unterwegs, die die Antwort bestens kennen, aber den Fehler begehen, anzunehmen, daß der Fragende sich für das Thema interressiert und etwas lernen möchte. Die antworten daher auf eine Art und Weise, die dem Fragesteller ermöglicht, selbst herauszufinden, was er wissen will, indem sie ihn auf die richtige Fährte locken. Hätte der Fragesteller Interesse am Thema, würde er mit den Hinweisen selbst nachsehen und damit Dinge lernen, auch Dinge, die über die ursprüngliche Fragestellung hinausgehen.

Der Fehler ist wie gesagt, davon auszugehen, daß der Fragesteller sich überhaupt für das Thema interessiert und auch noch lernwillig ist.

Das ist aber aus der Mode gekommen, warum etwas lernen, wenn man auch irgendwo im Internet nachsehen kann? Wieso muss man überhaupt irgendwas wissen, etwas können, oder gar sich für etwas interessieren? Die arroganten alten Säcke in dem doofen Forum sollen doch einfach nur die konkrete Frage beantworten!

Wir alten Säcke sollten uns ernsthaft Sorgen um unsere Rente machen, denn diese Generation Schlaffsacklusche wird die sein, die hoffentlich noch Beiträge in die Rentenkasse einzahlt ...

OP #7330961
Lesenswert?

Wenn ich eine konkrete Frage habe dann möchte ich doch eine Antwort auf meine Frage bekommen und nicht oberlehrerhaft rumkommandiert werden wo ich gefälligst nachlesen und mir die Antwort selber erarbeiten soll. Warum meinen denn einige die anderen erziehen zu müssen ? Zum Glück gibt es ja genug sachliche Antworten die einem dann doch weiterhelfen.

Beitrag #7330967 wurde von einem Moderator gelöscht.
Gast #7330978
Lesenswert?

Michael S. schrieb:

Wenn ich eine konkrete Frage habe dann möchte ich doch eine Antwort auf meine Frage bekommen und nicht oberlehrerhaft rumkommandiert werden wo ich gefälligst nachlesen und mir die Antwort selber erarbeiten soll.

Wenn so klar zu erkennen ist, daß Du die Antwort auf Deine Frage gar nicht verstehen kannst, ist es sinnlos, Dir eine präzise Antwort zu geben.

Da Du Dich für das Thema überhaupt nicht interessierst, hat Du hier also schön viel Lebenszeit verschwendet, vonn all' denen, die Dir /helfen/ wollten, und Deine eigene letztlich auch.

Spiel halt irgendwelche Videospiele, oder fang mit dem Rauchen an, aber lass die Finger von Elektronik.

Gast #7331014
Lesenswert?

Michael S. schrieb:

Warum meinen denn einige die anderen erziehen zu müssen ? Zum Glück gibt es ja genug sachliche Antworten die einem dann doch weiterhelfen.

Also ich habe die Vermutung dass sie einfach dumm sind, und gleichzeitig eingebildet und arrogant, also können sie die Frage nicht beantworten, wollen aber trotzdem ihren Senf dazugeben.

Also wird halt so komisches Palaver gehalten dass man es sich doch selbst erarbeiten soll, und anhand der teilweise fehlerhaften Vorschläge ist auch ersichtlich dass die von oben herab labernden Leute keine Ahnung haben.

Ich fühle mich sehr gut unterhalten vielen Dank.

Gast #7331031
Lesenswert?

So beantwortet ChatGPT deine Frage:

" In der Arduino IDE wird standardmäßig die int main(void) aus der main.cpp aufgerufen, die dann setup() und loop() aufruft. Wenn man jedoch selbst eine int main() in die Arduino IDE eingibt, wird die main.cpp nicht mehr verwendet. Stattdessen wird die neue int main() verwendet, die man selbst erstellt hat. Dies wird durch das Überschreiben der main.cpp mit der neuen int main() erreicht. "

Tja, sogar der intelligenteste Roboter der Welt kann dein Frage nicht zufriedenstellend beantworten.

Beitrag #7331032 wurde von einem Moderator gelöscht.
Gast #7331037
Lesenswert?

Ich hake nochmal nach:

Ich möchte einfach nur ganz genau die Stelle sehen, an der entschieden wird, ob die eigene int main oder die vom main.cpp genommen wird. weiss jemand wo genau man diese Abfrage sehen kann ?

Antwort von ChatGPT:

" Die Abfrage, ob die eigene int main oder die von main.cpp verwendet wird, findet in der Regel nicht explizit statt.

Die Arduino IDE bietet die Möglichkeit, eigene Sketches (Programme) zu erstellen und diese hochzuladen. Wenn Sie einen Sketch erstellen, wird der Quellcode in die Arduino IDE eingefügt. Der Sketch wird dann übersetzt und auf den Arduino-Mikrocontroller hochgeladen. Wenn Sie eine eigene int main() in Ihrem Sketch haben, wird diese anstelle der int main(void) aus der main.cpp verwendet. Das Überschreiben der main.cpp mit der neuen int main() erfolgt automatisch,da die IDE den Sketch Code zusammenführt und auf den Controller hochlädt.

Die Abfrage, ob die eigene int main oder die von main.cpp verwendet wird, findet in der Regel beim Hochladen des Sketches statt. Wenn Sie den Sketch hochladen, wird dieser automatisch übersetzt und anschließend auf den Mikrocontroller hochgeladen.

Es gibt auch Fälle, in denen man eigene int main() in C++ Libraries verwenden kann, und diese dann in die Arduino IDE einbinden kann, und diese werden dann aufgerufen und nicht die main.cpp.

In jedem Fall werden die Abfragen und der Prozess, der dazu führt, dass die eigene int main verwendet wird, in der Regel automatisch durch die Arduino IDE durchgeführt und sind für den Anwender nicht sichtbar. "

Bewerte die Antwort selbst.

Beitrag #7331046 wurde von einem Moderator gelöscht.
Beitrag #7331079 wurde von einem Moderator gelöscht.
Beitrag #7331084 wurde von einem Moderator gelöscht.
Gast #7331095
Lesenswert?

FahrerVomFahrrad schrieb:

Dafür von ihm etwas zu verlangen zu wollen ist doch eine sehr sonderbare Betrachtungsweise.

Davon war keine Rede. Er möchte aber, dass jemand jetzt für ihn ganz genau die Stelle im Quellcode von Arduino findet und erklärt, die dafür verantwortlich ist.

Das mache ich gerne, aber eben nicht kostenlos. Ich meine, ich kann Geld immer gut gebrauchen. Aber mein Wochenende opfere ich nur, wenn man mir dafür mehr bietet, als mein Chef. So wie sich der TO bisher verhalten hat, muss er allerdings noch erheblich was oben drauf legen, um mich zu motivieren.

Andererseits ist klar, dass er hier kostenlos abgreifen will. Also unterlasse ich es, hier ein Angebot zu machen.

Beitrag #7331103 wurde von einem Moderator gelöscht.
Gast #7331165
Lesenswert?

FahrerVomFahrrad schrieb:

Gegenleistungen

Nee ...

Und wenn, dann in Form von Respekt, oder so ähnlich. z.B. von der Sorte, die eine Kommunikation fruchtbar macht. Gegeneinander ausspielen gehört nicht dazu:

So haben ja schließlich die Beiträge von Norbert und EAF genau zu der von mir gesuchten Lösung geführt.

Das Lob fühlt sich etwas .... an.

Moderator (Firma: Titel) Persönliche Seite #7331172
Lesenswert?

Stefan F. schrieb:

sogar der intelligenteste Roboter der Welt kann dein Frage nicht zufriedenstellend beantworten.

Die konsequent richtige Antwort auf die Frage des TO ist: wenn du das Arduino-Framework verwenden willst, dann verwende es so, wie es dessen Entwickler vorgesehen haben. Sonst brauchst du hinterher nach ein paar Updates nicht herumjammern, dass dir der selbstgefrickelte Haufen auf den Kopf fällt.

Michael S. schrieb:

ich habe den code meiner main.cpp doch gepostet ! Kann man dem entnehmen dass die int main weak ist ? eher nicht oder ? kann das ausserhalb irgendwo angegeben sein ?

Nur aus Interesse und weil mir noch niemand aus der Zielgruppe eine brauchbare Antwort gegeben hat: wo lernt man denn dieses Plenken?

Und zur Info für die, die sich schwer tun, sich an ihren Usernamen zu erinnern:

Nur 1 Nutzername pro Thread. Siehe die strunzsimplen Nutzungsbedingungen.

Alle Posts mit den nachfolgenden Namen werden gelöscht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren