Prozessaufteilung. was wie optimal Nutzen



  • aaaaaaaalso ... ich hab mein programm erstmal so geschrieben das es ohne threads sequenziell nacheinander alles abarbeitet.
    Jetzt habe ich noch mal mit dem Support des AD-wandlers geschrieben und er meinte:
    [][][]
    In C++ empfehle ich Ihnen die Verwendung von std::thread (http://en.cppreference.com/w/cpp/thread/thread/thread) und std::async (http://en.cppreference.com/w/cpp/thread/async), dafür wird das PThread im Linux aber auch benötigt. Beide Sachen funktionieren aber nur, wenn Sie C++11 aktivieren (in CMAKE mit -> add_definitions("-std=c++11")).
    [
    ][][]

    ... da gelange ich auf das nächste Problem. wo trage ich das -std=c++11 ein?
    hier mal das Makefile was mir vom AD-Wandler zur Verfügung gestellt wurde:

    project(msrexamples)
    cmake_minimum_required(VERSION 2.8)
    cmake_policy(SET CMP0015 NEW)
    
    set(VERSION 1.4)
    
    # Short path to project.
    set(ROOT ${CMAKE_HOME_DIRECTORY})
    
    # Check for 32 or 64 bit.
    if(CMAKE_SIZEOF_VOID_P EQUAL 4)
    	set(HAVE_64_BIT 0)
    else()
    	set(HAVE_64_BIT 1)
    endif()
    
    # Set target specific output path.
    set(EXECUTABLE_OUTPUT_PATH ${ROOT}/bin)
    set(LIBRARY_OUTPUT_PATH ${ROOT}/lib)
    link_directories(${ROOT}/lib)
    
    # Depending on tool-chain, define library path ...
    # Visual Studio requires libs, either 32 or 64 bit.
    if(MSVC)
    	if(HAVE_64_BIT)
    		set(LIB_NAME cebomsr-${VERSION}-x86_64)
    	else()
    		set(LIB_NAME cebomsr-${VERSION}-x86)
    	endif()
    	link_directories(${ROOT}/lib)
    endif()
    
    # MinGW directly links against the .DLL's, either 32 or 64 bit.
    if(MINGW)
    	if(HAVE_64_BIT)
    		set(LIB_NAME cebomsr-${VERSION}-x86_64)
    	else()
    		set(LIB_NAME cebomsr-${VERSION}-x86)
    	endif()
    	link_directories(../runtime)
    endif()
    
    # POSIX links against .so .
    if(UNIX)
    	link_directories(../runtime)
    	set(LIB_NAME cebomsr-${VERSION})
    endif()
    
    # Include path is always constant.
    include_directories(${ROOT}/api/)
    
    # API is constant for all examples.
    set(API_FILES ${ROOT}/api/cebomsrpp.cpp ${ROOT}/api/cebomsrpp.h ${ROOT}/api/cebomsr.h)
    source_group(Api FILES ${API_FILES})	
    
    # The examples.
    foreach(EX counter frameio info singleio streamingi trigger zz)
    	add_executable(${EX} ${ROOT}/examples/${EX}.cpp ${API_FILES})
    	target_link_libraries(${EX} ${LIB_NAME})
    endforeach()
    


  • freaksdd schrieb:

    aaaaaaaalso ... ich hab mein programm erstmal so geschrieben das es ohne threads sequenziell nacheinander alles abarbeitet.

    Gut. Und es ist zu langsam?

    freaksdd schrieb:

    Jetzt habe ich noch mal mit dem Support des AD-wandlers geschrieben und er meinte:
    [][][]
    In C++ empfehle ich Ihnen die Verwendung von std::thread (http://en.cppreference.com/w/cpp/thread/thread/thread) und std::async (http://en.cppreference.com/w/cpp/thread/async), dafür wird das PThread im Linux aber auch benötigt. Beide Sachen funktionieren aber nur, wenn Sie C++11 aktivieren (in CMAKE mit -> add_definitions("-std=c++11")).
    [
    ][][]

    ... da gelange ich auf das nächste Problem. wo trage ich das -std=c++11 ein?

    Du hast also ein Problem mit der Konfiguration von CMake, nicht mit C++.

    Vielleicht beschreibst Du Dein Problem im Compiler/IDE Forum, oder in Rund um die Programmierung.
    Schreib aber auch gleich noch für welche(n) Compiler Du C++11 Support aktivieren möchtest.



  • also zu langsam kann ich nicht wirklich äußern da ich noch kein vergleich mit threads machen konnte.
    ich lese mit dem raspberry pi problemlos mit 1000Hz 4x25 (25 = Puffergröße) Messwerte aus(AD-Wandler besitzt einen internen Puffer). Das senden der Daten erfolg nach beenden der Messung. Dadurch klappt alles reibungslos doch es verlängert halt die ganze komplette sache.
    mit threads wollt ich den ganzen vorgang etwas verkürzen. ich werd mal sehen was sich da machen lässt.
    danke für den tipp ... da werd ich mal mit dem Compiler/IDE Forum auseinandersetzen und schauen was ich erreichen kann.

    weiß jemand wo ich eine genaue beschreibung mit beispielen(nicht unbedingt) zu den std::thread finden kann? also ich suche genau beschreibungen der funktionen, flags, ...

    Danke an alle Antworten. Ihr habt mir schon etwas "beibringen" können. im studium bekommt man halt leider auch nicht alles gelernt. 😉



  • freaksdd schrieb:

    mit threads wollt ich den ganzen vorgang etwas verkürzen.

    Wenns dir um die Geschwindigkeit geht: Hat dein Raspberry überhaupt mehr als einen Kern?



  • der raspberry hat nur 1 kern mit satten 700 Mhz 🙂 .
    den AD-Wandler lese ich momentan mit 1Mhz aus was recht schnell und zuverlässig läuft. da aber mehr Herz am Raspberry zur Verfügung stehen könnte man nebenbei einen weiteren Prozess laufen lassen ... das war zumindest mein Gedanke. Ich wollte es testen und schauen ob das überhaupt möglich ist mit 1Mhz Daten lesen und nebenbei einen weiteren Prozess laufen zu lassen.



  • Wenn du den Wandler mit 1 MHz auslesen willst, dann musst du dafür sowieso schon alle Interrupts sperren.
    Sonst macht dein Thread einfach mal so pause - und das deutlich länger als die 700 Zyklen die du theoretisch zwischen 2x Lesen des Wandlers "zeit hast".



  • gut das du das erwähnst. Ich muss natürlich dafür sorgen das die Arbeitszeiten der Prozesse gleich aufgeteilt werden bzw in festgelegten Intervallen statt findet. dafür gibt es sicherlich auch Funktionen wie lange ein Thread/Prozess arbeiten soll/darf.



  • Hat der Wandler ne halbwegs grosse FIFO oder wie soll das gehen?

    Oder stellst du dir wirklich vor dass das Ding dann im 1 MHz Takt Context-Switches machen wird und das alles einfach so geht?
    Das wird's nicht spielen.
    Auf PC Hardware + OSen kannst du schon froh sein wenn du - ohne Interrupts zu sperren - auf 1ms genau etwas machen kannst.


Anmelden zum Antworten