diff options
Diffstat (limited to 'Master/Real-Time Systems/Praktikum1/Aufgabe1')
4 files changed, 647 insertions, 0 deletions
diff --git a/Master/Real-Time Systems/Praktikum1/Aufgabe1/.cproject b/Master/Real-Time Systems/Praktikum1/Aufgabe1/.cproject new file mode 100644 index 0000000..bb5f1ad --- /dev/null +++ b/Master/Real-Time Systems/Praktikum1/Aufgabe1/.cproject @@ -0,0 +1,325 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<?fileVersion 4.0.0?> + +<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage"> +<storageModule moduleId="org.eclipse.cdt.core.settings"> +<cconfiguration id="cdt.managedbuild.toolchain.gnu.base.1558666333"> +<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.toolchain.gnu.base.1558666333" moduleId="org.eclipse.cdt.core.settings" name="Default"> +<externalSettings/> +<extensions> +<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/> +<extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> +<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> +<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> +<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> +</extensions> +</storageModule> +<storageModule moduleId="cdtBuildSystem" version="4.0.0"> +<configuration artifactName="Aufgabe1" buildProperties="" description="" id="cdt.managedbuild.toolchain.gnu.base.1558666333" name="Default" parent="org.eclipse.cdt.build.core.emptycfg"> +<folderInfo id="cdt.managedbuild.toolchain.gnu.base.1558666333.1984080204" name="/" resourcePath=""> +<toolChain id="cdt.managedbuild.toolchain.gnu.base.512081926" name="cdt.managedbuild.toolchain.gnu.base" superClass="cdt.managedbuild.toolchain.gnu.base"> +<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.target.gnu.platform.base.1986976681" name="Debug Platform" osList="linux,hpux,aix,qnx" superClass="cdt.managedbuild.target.gnu.platform.base"/> +<builder id="cdt.managedbuild.target.gnu.builder.base.955044668" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="cdt.managedbuild.target.gnu.builder.base"/> +<tool id="cdt.managedbuild.tool.gnu.archiver.base.796301174" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/> +<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.base.1098688671" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.base"> +<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1767651157" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/> +</tool> +<tool id="cdt.managedbuild.tool.gnu.c.compiler.base.252239008" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.base"> +<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1424581121" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/> +</tool> +<tool id="cdt.managedbuild.tool.gnu.c.linker.base.207422333" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.base"/> +<tool id="cdt.managedbuild.tool.gnu.cpp.linker.base.269282950" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.base"> +<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.2107672036" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input"> +<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> +<additionalInput kind="additionalinput" paths="$(LIBS)"/> +</inputType> +</tool> +<tool id="cdt.managedbuild.tool.gnu.assembler.base.355824222" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.base"> +<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1472786683" superClass="cdt.managedbuild.tool.gnu.assembler.input"/> +</tool> +</toolChain> +</folderInfo> +<sourceEntries> +<entry excluding="src" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/> +<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/> +</sourceEntries> +</configuration> +</storageModule> +<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> +<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/> +<storageModule moduleId="org.eclipse.cdt.core.language.mapping"/> +<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"> +<buildTargets> +<target name="all" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> +<buildCommand>make</buildCommand> +<buildArguments/> +<buildTarget>all</buildTarget> +<stopOnError>true</stopOnError> +<useDefaultCommand>true</useDefaultCommand> +<runAllBuilders>true</runAllBuilders> +</target> +<target name="clean" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> +<buildCommand>make</buildCommand> +<buildArguments/> +<buildTarget>clean</buildTarget> +<stopOnError>true</stopOnError> +<useDefaultCommand>true</useDefaultCommand> +<runAllBuilders>true</runAllBuilders> +</target> +</buildTargets> +</storageModule> +<storageModule moduleId="scannerConfiguration"> +<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/> +<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="makefileGenerator"> +<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/${specs_file}"'" command="sh" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-c 'g++ -E -P -v -dD "${plugin_state_location}/specs.cpp"'" command="sh" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/specs.c"'" command="sh" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<scannerConfigBuildInfo instanceId="cdt.managedbuild.toolchain.gnu.base.1558666333;cdt.managedbuild.toolchain.gnu.base.1558666333.1984080204;cdt.managedbuild.tool.gnu.c.compiler.base.252239008;cdt.managedbuild.tool.gnu.c.compiler.input.1424581121"> +<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/> +<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="makefileGenerator"> +<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/${specs_file}"'" command="sh" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-c 'g++ -E -P -v -dD "${plugin_state_location}/specs.cpp"'" command="sh" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/specs.c"'" command="sh" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +</scannerConfigBuildInfo> +<scannerConfigBuildInfo instanceId="cdt.managedbuild.toolchain.gnu.base.1558666333;cdt.managedbuild.toolchain.gnu.base.1558666333.1984080204;cdt.managedbuild.tool.gnu.cpp.compiler.base.1098688671;cdt.managedbuild.tool.gnu.cpp.compiler.input.1767651157"> +<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/> +<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="makefileGenerator"> +<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/${specs_file}"'" command="sh" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-c 'g++ -E -P -v -dD "${plugin_state_location}/specs.cpp"'" command="sh" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/specs.c"'" command="sh" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +</scannerConfigBuildInfo> +</storageModule> +</cconfiguration> +</storageModule> +<storageModule moduleId="cdtBuildSystem" version="4.0.0"> +<project id="Aufgabe1.null.1680394135" name="Aufgabe1"/> +</storageModule> +</cproject> diff --git a/Master/Real-Time Systems/Praktikum1/Aufgabe1/.project b/Master/Real-Time Systems/Praktikum1/Aufgabe1/.project new file mode 100644 index 0000000..2c30c84 --- /dev/null +++ b/Master/Real-Time Systems/Praktikum1/Aufgabe1/.project @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>RTS_P1_1</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name> + <triggers>clean,full,incremental,</triggers> + <arguments> + <dictionary> + <key>?name?</key> + <value></value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.append_environment</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.autoBuildTarget</key> + <value>all</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.buildArguments</key> + <value></value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.buildCommand</key> + <value>make</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.cleanBuildTarget</key> + <value>clean</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.contents</key> + <value>org.eclipse.cdt.make.core.activeConfigSettings</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.enableAutoBuild</key> + <value>false</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.enableCleanBuild</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.enableFullBuild</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.fullBuildTarget</key> + <value>all</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.stopOnError</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key> + <value>true</value> + </dictionary> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.cdt.core.cnature</nature> + <nature>org.eclipse.cdt.core.ccnature</nature> + <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature> + <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature> + </natures> +</projectDescription> diff --git a/Master/Real-Time Systems/Praktikum1/Aufgabe1/Makefile b/Master/Real-Time Systems/Praktikum1/Aufgabe1/Makefile new file mode 100644 index 0000000..e5c163d --- /dev/null +++ b/Master/Real-Time Systems/Praktikum1/Aufgabe1/Makefile @@ -0,0 +1,49 @@ +# +# Variables +# +PROJECT_ROOT = . +BUILDDIR = $(PROJECT_ROOT)/build +SOURCEDIR = $(PROJECT_ROOT)/src +INCLUDEDIRS = $(SOURCEDIR) +INCLUDES = $(addprefix -I,$(INCLUDEDIRS)) +LIBNAMES = pthread +LIBS = $(addprefix -l,$(LIBNAMES)) +DEBUGFLAGS = -g +CFLAGS = -Wall -DDEBUG_MODE -DDEBUG +CFLAGS += -DLINUX $(DEBUGFLAGS) +LDFLAGS = $(DEBUGFLAGS) +CC = g++ +LD = g++ + +LINK_TARGET = $(BUILDDIR)/regelungsverfahren + +SOURCES := $(wildcard $(SOURCEDIR)/*.cpp) + +OBJS_TMP := $(foreach srcfile,$(SOURCES),$(srcfile).o) +OBJS := $(foreach tmp,$(OBJS_TMP),$(patsubst $(SOURCEDIR)/%.cpp.o,$(BUILDDIR)/%.o,$(tmp))) + +REBUILDABLES = $(OBJS) $(LINK_TARGET) + +.PHONY: clean +clean : + rm -f $(REBUILDABLES) + rm -f $(BUILDDIR)/* + rmdir $(BUILDDIR) + @echo Clean done + +all : builddir $(LINK_TARGET) + @echo All done + +builddir : + @echo 'Creating build directory' + mkdir -p $(BUILDDIR) + +$(LINK_TARGET) : $(OBJS) + @echo 'Linking file: $@' + $(LD) $(LDFLAGS) $(LIBS) -o $@ $^ + +$(BUILDDIR)/%.o : $(SOURCEDIR)/%.cpp + @echo 'Building file: $<' + $(CC) $(CFLAGS) $(INCLUDES) -o $@ -c $< + + diff --git a/Master/Real-Time Systems/Praktikum1/Aufgabe1/src/main.cpp b/Master/Real-Time Systems/Praktikum1/Aufgabe1/src/main.cpp new file mode 100644 index 0000000..65eef37 --- /dev/null +++ b/Master/Real-Time Systems/Praktikum1/Aufgabe1/src/main.cpp @@ -0,0 +1,195 @@ +/* + * main.cpp + * + * Created on: 31.10.2010 + * Author: sven + */ +#include <pthread.h> +#include <semaphore.h> +#include <time.h> +#include <sys/time.h> +#include <signal.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +// debug printing +#ifdef DEBUG_MODE +#include <stdio.h> + #define DEBUG_PRINT(format, args...)\ + {\ + static char message[512];\ + snprintf(message,512,format, ##args);\ + fprintf(stdout, "[%s: %d] : %s\n", __PRETTY_FUNCTION__,__LINE__, message);\ + fflush(stdout);\ + } +#else + #define DEBUG_PRINT(format, args...) +#endif // DEBUG_MODE + +/* + * global variables + */ +sem_t main_block,timer_block; +pthread_t timer_thread; +bool stop_timer_thread = false; +pthread_mutex_t stop_mutex = PTHREAD_MUTEX_INITIALIZER; +// 0 sec +const long TIMER_INTERVAL_SECS = 0; +// 10 msec +const long TIMER_INTERVAL_USECS = 10000; + +struct sigaction timer_action, quit_action; +/* + * function prototypes + */ +void readSensors(); +void initializeClock(); +void initializeMain(); +void WaitForNextCycle(); +void ActuateProcess(); +bool CalculateNewSetValues(); +void Error(); +void* TimerThreadProc(void*); +void timer_handler(int); + +void* TimerThreadProc(void*) { + /** + * Timer code originally from + * http://www.informit.com/articles/article.aspx?p=23618&seqNum=14 + */ + DEBUG_PRINT("entry Process: %d Thread: %lu",(int)getpid(),pthread_self()); + bool stop_me = false; + struct itimerval timer; + /* Install timer_handler as the signal handler for SIGALRM. */ + timer_action.sa_handler = timer_handler; + sigemptyset(&timer_action.sa_mask); + timer_action.sa_flags = 0; + sigaction(SIGALRM,&timer_action,NULL); + + /* Configure the timer to expire after + * TIMER_INTERVAL_SECS + TIMER_INTERVAL_USECS... */ + timer.it_value.tv_sec = TIMER_INTERVAL_SECS; + timer.it_value.tv_usec = TIMER_INTERVAL_USECS; + /* ... and every TIMER_INTERVAL_SECS+TIMER_INTERVAL_USECS after that. */ + timer.it_interval.tv_sec = TIMER_INTERVAL_SECS; + timer.it_interval.tv_usec = TIMER_INTERVAL_USECS; + /* If the timer code is ITIMER_REAL, + * the process is sent a SIGALRM signal after the + * specified wall-clock time has elapsed*/ + setitimer (ITIMER_REAL, &timer, NULL); + while(1) { + pthread_mutex_lock(&stop_mutex); + stop_me = stop_timer_thread; + pthread_mutex_unlock(&stop_mutex); + if(stop_me) { + DEBUG_PRINT("exiting thread Process: %d Thread: %lu",(int)getpid(),pthread_self()); + pthread_exit(NULL); + } + DEBUG_PRINT("waiting for timer_handler Process: %d Thread: %lu",(int)getpid(),pthread_self()); + sem_wait(&timer_block); + DEBUG_PRINT("waking up main Process: %d Thread: %lu",(int)getpid(),pthread_self()); + sem_post(&main_block); + } + DEBUG_PRINT("should never happen Process: %d Thread: %lu",(int)getpid(),pthread_self()); + return NULL; +} + +void timer_handler(int signum) { + DEBUG_PRINT("entry Process: %d Thread: %lu",(int)getpid(),pthread_self()); + static int count = 0; + DEBUG_PRINT("timer expired %d times", ++count); + sem_post(&timer_block); + DEBUG_PRINT("exit"); +} + +void quit_handler(int signum) { + DEBUG_PRINT("entry Process: %d Thread: %lu",(int)getpid(),pthread_self()); + int semval; + pthread_mutex_lock(&stop_mutex); + stop_timer_thread = true; + pthread_mutex_unlock(&stop_mutex); + sem_getvalue(&timer_block,&semval); + if(semval > 0) { + DEBUG_PRINT("waking up timer thread"); + sem_post(&timer_block); + } + pthread_join(timer_thread,NULL); + DEBUG_PRINT("Joined timer thread"); + //clean up + sem_destroy(&timer_block); + sem_destroy(&main_block); + pthread_mutex_destroy(&stop_mutex); + DEBUG_PRINT("exit"); + exit(EXIT_SUCCESS); +} + +void WaitForNextCycle() { + DEBUG_PRINT("entry Process: %d Thread: %lu",(int)getpid(),pthread_self()); + sem_wait(&main_block); + DEBUG_PRINT("exit"); +} + +void readSensors() { + DEBUG_PRINT("entry Process: %d Thread: %lu",(int)getpid(),pthread_self()); + struct timeval tv; + struct timezone tz; + struct tm *tm; + gettimeofday(&tv, &tz); + tm=localtime(&tv.tv_sec); + printf(" %d:%02d:%02d %lu \n", tm->tm_hour, tm->tm_min, + tm->tm_sec, tv.tv_usec); + DEBUG_PRINT("exit"); +} +void Error() { + DEBUG_PRINT("entry Process: %d Thread: %lu",(int)getpid(),pthread_self()); + DEBUG_PRINT("exit"); +} +bool CalculateNewSetValues() { + DEBUG_PRINT("entry Process: %d Thread: %lu",(int)getpid(),pthread_self()); + DEBUG_PRINT("exit"); + return true; +} +void ActuateProcess() { + DEBUG_PRINT("entry Process: %d Thread: %lu",(int)getpid(),pthread_self()); + DEBUG_PRINT("exit"); +} +void initializeClock() +{ + DEBUG_PRINT("entry Process: %d Thread: %lu",(int)getpid(),pthread_self()); + pthread_create(&timer_thread,NULL,TimerThreadProc,NULL); + DEBUG_PRINT("exit"); +} + +void initializeMain() { + DEBUG_PRINT("entry Process: %d Thread: %lu",(int)getpid(),pthread_self()); + + /* init semaphore as closed */ + sem_init(&main_block,0,0); + sem_init(&timer_block,0,0); + + /* catch all interesting signals */ + quit_action.sa_handler = quit_handler; + sigemptyset(&quit_action.sa_mask); + quit_action.sa_flags = 0; + sigaction(SIGTERM,&quit_action,NULL); + sigaction(SIGQUIT,&quit_action,NULL); + sigaction(SIGINT,&quit_action,NULL); + sigaction(SIGHUP,&quit_action,NULL); + DEBUG_PRINT("exit"); +} + +int main(int argc, char* argv[]) +{ + initializeMain(); + initializeClock(); + while(1) { + readSensors(); + if(CalculateNewSetValues()) + ActuateProcess(); + else + Error(); + WaitForNextCycle(); + } + return EXIT_SUCCESS; +} |
