Forum: Compiler & IDEs C++ async und futures auf µC verwenden


von Johannes S. (Gast)


Lesenswert?

macht hier jemand schon so etwas? Ist der Overhead der std da sehr hoch 
oder ist das praktikabel? Natürlich nicht auf einem ATTiny, sondern 
Cortex-M die einiges an Flash und RAM mitbringen.

von Oliver S. (oliverso)


Lesenswert?

Wenn du eh schon ein zu den C++-Standardlibs kompatibles 
Multithreading-OS drauf laufen hast (da setzt die C++-Standardlib drauf 
auf), wird der overhead gegenüber einer „zu Fuß“ programmierten Lösung 
nahezu Null (und gegenüber dem Rest eh vernachlässigbar) sein.

Oliver

: Bearbeitet durch User
von mh (Gast)


Lesenswert?

Oliver S. schrieb:
> wird der overhead gegenüber einer „zu Fuß“ programmierten Lösung
> nahezu Null

Benötigen std::futures nicht dynamischen Speicher und exceptions?

von Oliver S. (oliverso)


Lesenswert?

Nun ja, keine Arme, keine Kekse...

Aus irgend einem guten Grund wird man ja std::futures verwenden wollen. 
Wenn man nur mal ein Thread starten will, braucht man das nicht.

Oliver

: Bearbeitet durch User
von Johannes S. (Gast)


Lesenswert?

ich finde da die asynchrone Programmierung mit EventQueues interessant, 
also eher um viele threads zu vermeiden. Das geht auch ohne die Libs, 
aber mit Unterstützung der Sprache sollte das übersichtlicher werden.
In Javascript war async vielleicht nicht Vorreiter, ist damit aber sehr 
populär geworden. Threads brauchen viel Speicher durch eigene Stacks je 
Tasks, da sehe ich auf µC bei EventQueues Vorteile. Zumindest wenn in 
einem Thread Aufgaben kooperativ abgearbeitet werden. µC haben ja auch 
nur einen Kern um Aufgaben zu erledigen, von Konstrukten wie M7+M0 oder 
ähnlichen mal abgesehen.

von Wilhelm M. (wimalopaan)


Lesenswert?

Johannes S. schrieb:
> macht hier jemand schon so etwas? Ist der Overhead der std da sehr hoch
> oder ist das praktikabel? Natürlich nicht auf einem ATTiny, sondern
> Cortex-M die einiges an Flash und RAM mitbringen.

Das ist erst einmal die Frage nach dem OS, was Du einsetzt / einsetzen 
möchtest.

von Johannes S. (Gast)


Lesenswert?

mbed-os5, habe ich hier noch nicht genug damit genervt? :)

Ich habe gesehen das es da in Tests verwendet wird, zB hier:
https://github.com/ARMmbed/mbed-os/blob/ffdd54315f98bda6021fec9076d271571dbe32e3/UNITTESTS/features/netsocket/InternetSocket/test_InternetSocket.cpp#L157

von Oliver S. (oliverso)


Lesenswert?

In dem Fall schreib dir halt mal ein minimales Testprogramm, und schau 
dir an, was der Compiler draus macht.

Oliver

von Oliver S. (oliverso)


Lesenswert?

Nachtrag:

Und berichte, was rausgekommen ist ...

Oliver

von Vincent H. (vinci)


Lesenswert?

Das is ein x86 Test...

/edit
Blöd formuliert. Was ich mein is das is ein Host-Test. Der läuft nicht 
am Target.

: Bearbeitet durch User
von Oliver S. (oliverso)


Lesenswert?

Verrat doch nicht alles ;)

Versuch macht kluch...

Oliver

von Johannes S. (Gast)


Angehängte Dateien:

Lesenswert?

Vincent H. schrieb:
> Das is ein x86 Test...
>
> /edit
> Blöd formuliert. Was ich mein is das is ein Host-Test. Der läuft nicht
> am Target.

nope, das ist ein Test für das Target mit Cortex-M irgendwas.

Und der Code im Anhang läuft, warum sollte er auch nicht? Die Newlib und 
std sind für Cortex-M implementiert. Sogar ein cout<< "hello"; 
funktioniert, ist dann aber mit +200 kB doch etwas viel des Guten.
1
Hello from BLACKPILL_F411CE
2
Mbed OS version: 99.99.99
3
test Future
4
start doSomethingElse
5
doSomethingElse done
6
diff: 4.000000

Was noch nicht geklappt hat ist der async call, da haut mir der Compiler 
Fehlermeldungen um die Ohren die ich noch nie gesehen habe. Die Zeilen 
hatte ich von Stackoverflow zusammengekratzt. Was ist da an dem 
std::async(std::launch::async, doSomething); faul? Irgendwas von 
incomplete type bemängelt der Compiler.
1
[Error] d:\Projects\Sn\LocalGit\test\Mbed5-Projects\apps\testFuture\source\main.cpp:36:58: invalid use of incomplete type 'class std::future<void>'
2
[ERROR] d:\Projects\Sn\LocalGit\test\Mbed5-Projects\apps\testFuture\source\main.cpp: In function 'int main()':
3
d:\Projects\Sn\LocalGit\test\Mbed5-Projects\apps\testFuture\source\main.cpp:36:58: error: invalid use of incomplete type 'class std::future<void>' 
4
   36 |     auto fut = std::async(std::launch::async, doSomething);
5
      |                                                          ^
6
In file included from d:\Projects\Sn\LocalGit\test\Mbed5-Projects\apps\testFuture\source\main.cpp:3:
7
c:\program files (x86)\gnu tools arm embedded\9 2019-q4-major\arm-none-eabi\include\c++\9.2.1\future:125:11: note: declaration of 'class std::future<void>'      
8
  125 |     class future;
9
      |           ^~~~~~

von Oliver S. (oliverso)


Lesenswert?

Johannes S. schrieb:
> invalid use of incomplete type 'class std::future<void>'

Sagt genau das aus, was es aussagt: An der relevanten Stelle braucht der 
Compiler die vollständige Klasse, kennt die aber nicht, sondern 
(vermutlich) nur eine Vorwärtsdeklaration davon.

Üblicherweise fehlt da ein include, in dem Fall wäre das <future>, warum 
auch immer.


Johannes S. schrieb:
> nope, das ist ein Test für das Target mit Cortex-M irgendwas.

Laut Beachreibung laufen die Unittests nicht auf dem Target, sondern 
nativ auf dem Host (Windows, Linux, Apple).

Oliver

von Johannes S. (Gast)


Lesenswert?

Oliver S. schrieb:
> Laut Beachreibung laufen die Unittests nicht auf dem Target, sondern
> nativ auf dem Host (Windows, Linux, Apple).

da hst du Recht, ich habe das mit den greentea tests verwechselt, die 
laufen auf dem Target.

Das kann dann erklären warum futue nicht komplett ist, der header ist ja 
eingebunden.
Schade, ist die Zukunft doch nicht auf dem µC angekommen?

von Johannes S. (Gast)


Lesenswert?

der g++ meldet mit -v unter anderem 'Thread model: single' und 
'configured with: --disable-threads'. Hat also definitiv keine 
Unterstützung dafür. Ok, das ist OS abhängig aber ein printf kann man ja 
auch umleiten.

Der ARMC6 redet etwas mehr Klartext:
1
[Error] thread@114,2: <thread> is not supported on this single threaded system
2
[Error] future@378,2: <future> is not supported on this single threaded system

Mal sehen wieviele Jahre es dauert bis <future> auf dem µC möglich ist 
:)

von Oliver S. (oliverso)


Lesenswert?

Läuft doch schon, nur vermutlich halt single-threaded ;)

Johannes S. schrieb:
>
> Hello from BLACKPILL_F411CE
> Mbed OS version: 99.99.99
> test Future
> start doSomethingElse
> doSomethingElse done
> diff: 4.000000

Oliver

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.