changeset 258:88cf310417cd aux_task_args

Add a parameter 'autoSchedule' to createAuxiliaryTask() which when true causes the task to be automatically scheduled after every render function call, without the user needing to call scheduleAuxiliaryTask()
author Liam Donovan <l.b.donovan@qmul.ac.uk>
date Sat, 07 May 2016 13:23:15 +0100
parents 1606b50a58c6
children abd3657016ea
files core/PRU.cpp core/RTAudio.cpp include/BeagleRT.h
diffstat 3 files changed, 24 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/core/PRU.cpp	Sat May 07 12:51:10 2016 +0100
+++ b/core/PRU.cpp	Sat May 07 13:23:15 2016 +0100
@@ -643,6 +643,8 @@
 			// Set the test pin high
 			xenomai_gpio[GPIO_CLEARDATAOUT] = TEST_PIN_MASK;
 		}
+		
+		BeagleRT_autoScheduleAuxiliaryTasks();
 
 		// FIXME: TESTING!!
 		// if(testCount > 100000)
--- a/core/RTAudio.cpp	Sat May 07 12:51:10 2016 +0100
+++ b/core/RTAudio.cpp	Sat May 07 13:23:15 2016 +0100
@@ -48,6 +48,7 @@
 	bool started;
 	bool hasArgs;
 	void* args;
+	bool autoSchedule;
 } InternalAuxiliaryTask;
 
 const char gRTAudioThreadName[] = "beaglert-audio";
@@ -294,7 +295,7 @@
 // (equal or lower) priority. Audio priority is defined in BEAGLERT_AUDIO_PRIORITY;
 // priority should be generally be less than this.
 // Returns an (opaque) pointer to the created task on success; 0 on failure
-AuxiliaryTask BeagleRT_createAuxiliaryTask(void (*functionToCall)(void* args), int priority, const char *name, void* args)
+AuxiliaryTask BeagleRT_createAuxiliaryTask(void (*functionToCall)(void* args), int priority, const char *name, void* args, bool autoSchedule)
 {
 	InternalAuxiliaryTask *newTask = (InternalAuxiliaryTask*)malloc(sizeof(InternalAuxiliaryTask));
 
@@ -312,27 +313,33 @@
 	newTask->started = false;
 	newTask->args = args;
 	newTask->hasArgs = true;
-
+    newTask->autoSchedule = autoSchedule;
+    
 	getAuxTasks().push_back(newTask);
 
 	return (AuxiliaryTask)newTask;
 }
-AuxiliaryTask BeagleRT_createAuxiliaryTask(void (*functionToCall)(void), int priority, const char *name)
+AuxiliaryTask BeagleRT_createAuxiliaryTask(void (*functionToCall)(void), int priority, const char *name, bool autoSchedule)
 {
         InternalAuxiliaryTask *newTask = (InternalAuxiliaryTask*)malloc(sizeof(InternalAuxiliaryTask));
+        
         // Attempt to create the task
         if(rt_task_create(&(newTask->task), name, 0, priority, T_JOINABLE | T_FPU)) {
                   cout << "Error: unable to create auxiliary task " << name << endl;
                   free(newTask);
                   return 0;
         }
+        
         // Populate the rest of the data structure and store it in the vector
         newTask->function = functionToCall;
         newTask->name = strdup(name);
         newTask->priority = priority;
         newTask->started = false;
         newTask->hasArgs = false;
+        newTask->autoSchedule = autoSchedule;
+        
         getAuxTasks().push_back(newTask);
+        
         return (AuxiliaryTask)newTask;
 }
 
@@ -347,6 +354,14 @@
 	}
 	rt_task_resume(&taskToSchedule->task);
 }
+void BeagleRT_autoScheduleAuxiliaryTasks(){
+    vector<InternalAuxiliaryTask*>::iterator it;
+	for(it = getAuxTasks().begin(); it != getAuxTasks().end(); it++) {
+	    if ((InternalAuxiliaryTask *)(*it)->autoSchedule){
+    		BeagleRT_scheduleAuxiliaryTask(*it);
+	    }
+	}
+}
 
 // Calculation loop that can be used for other tasks running at a lower
 // priority than the audio thread. Simple wrapper for Xenomai calls.
@@ -359,7 +374,7 @@
 	void (*auxiliary_argfunction)(void* args) = task->argfunction;
     void (*auxiliary_function)(void) = task->function;
     
-    // get the name
+    // get the task's name
 	const char *name = task->name;
 
 	// Wait for a notification
--- a/include/BeagleRT.h	Sat May 07 12:51:10 2016 +0100
+++ b/include/BeagleRT.h	Sat May 07 13:23:15 2016 +0100
@@ -579,8 +579,8 @@
  * \param priority Xenomai priority level at which the task should run.
  * \param name Name for this task, which should be unique system-wide (no other running program should use this name).
  */
-AuxiliaryTask BeagleRT_createAuxiliaryTask(void (*functionToCall)(void*), int priority, const char *name, void* args);
-AuxiliaryTask BeagleRT_createAuxiliaryTask(void (*functionToCall)(void), int priority, const char *name);
+AuxiliaryTask BeagleRT_createAuxiliaryTask(void (*functionToCall)(void*), int priority, const char *name, void* args, bool autoSchedule = false);
+AuxiliaryTask BeagleRT_createAuxiliaryTask(void (*functionToCall)(void), int priority, const char *name, bool autoSchedule = false);
 
 /**
  * \brief Start an auxiliary task so that it can be run.
@@ -609,6 +609,7 @@
  * \param task Task to schedule for running.
  */
 void BeagleRT_scheduleAuxiliaryTask(AuxiliaryTask task);
+void BeagleRT_autoScheduleAuxiliaryTasks();
 
 /** @} */
 #include <Utilities.h>