From 70931e3f263c25dbd04b95af599576da6a98e5b5 Mon Sep 17 00:00:00 2001
From: Federico Terraneo <fede.tft@miosix.org>
Date: Tue, 2 May 2017 01:06:02 +0200
Subject: [PATCH] Increased priority of the Scheduler thread, added the option
 to synchronize tasks, removed unnecessary cyclic in Anakin

---
 src/shared/boards/AnakinBoard.cpp |  4 ++--
 src/shared/boards/AnakinBoard.h   |  2 +-
 src/shared/events/Scheduler.cpp   | 16 +++++++++-------
 src/shared/events/Scheduler.h     | 12 +++++++++---
 4 files changed, 21 insertions(+), 13 deletions(-)

diff --git a/src/shared/boards/AnakinBoard.cpp b/src/shared/boards/AnakinBoard.cpp
index 2c0fe8f9f..283fa7ec5 100644
--- a/src/shared/boards/AnakinBoard.cpp
+++ b/src/shared/boards/AnakinBoard.cpp
@@ -86,11 +86,11 @@ bool AnakinBoard::init()
     sLog->logString("Adding samplers to scheduler\n");
     #define ADD_SAMPLER(type, name, rate) \
         sEventScheduler->add(std::bind(& type ## SensorSampler::Update,name),\
-                rate, #name "-" #rate "ms")
+                rate, #name "-" #rate "ms",start)
 
+    int64_t start=getTick(); //Synchronize activation
     ADD_SAMPLER(DMA, m100HzDMA, 10); // 10ms
     ADD_SAMPLER(DMA, m25HzDMA, 40);  // 25ms
-    ADD_SAMPLER(Simple, m100HzSimple, 10); // 10ms
     ADD_SAMPLER(Simple, m10HzSimple, 100); // 100ms
 
     return true;
diff --git a/src/shared/boards/AnakinBoard.h b/src/shared/boards/AnakinBoard.h
index 9dc5dba5e..10e6ee347 100644
--- a/src/shared/boards/AnakinBoard.h
+++ b/src/shared/boards/AnakinBoard.h
@@ -74,7 +74,7 @@ public:
 
 private:
     DMASensorSampler m100HzDMA, m25HzDMA;
-    SimpleSensorSampler m100HzSimple, m10HzSimple;
+    SimpleSensorSampler m10HzSimple;
     mpu_t*      mS_MPU9250;
     inemo_t*    mS_INEMO;
     fxas_t*     mS_FXAS;
diff --git a/src/shared/events/Scheduler.cpp b/src/shared/events/Scheduler.cpp
index ccfb3749f..634bbe76f 100644
--- a/src/shared/events/Scheduler.cpp
+++ b/src/shared/events/Scheduler.cpp
@@ -41,14 +41,14 @@ std::ostream& operator<<(std::ostream& os, const TaskStatResult& sr)
 //
 
 void EventScheduler::add(function_t func, uint32_t intervalMs, 
-        const string& name) {
+        const string& name, int64_t start) {
     task_t task = { func, intervalMs, name, false, -1 };
-    addTask(task);
+    addTask(task, start);
 }
 
-void EventScheduler::addOnce(function_t func, uint32_t delayMs) {
+void EventScheduler::addOnce(function_t func, uint32_t delayMs, int64_t start) {
     task_t task = { func, delayMs, "", true, -1 };
-    addTask(task);
+    addTask(task, start);
 }
 
 vector<TaskStatResult> EventScheduler::getTaskStats()
@@ -102,19 +102,21 @@ void EventScheduler::run() {
             } else tasks.erase(e.task);
         } else {
             Unlock<FastMutex> u(l);
+            leds::led9::high();
             Thread::sleepUntil(nextTick);
+            leds::led9::low();
         }
     }
 }
 
-void EventScheduler::addTask(const EventScheduler::task_t& task) {
+void EventScheduler::addTask(const EventScheduler::task_t& task, int64_t start) {
     Lock<FastMutex> l(mutex);
     tasks.push_back(task);
     if(task.once==false) permanentTasks++;
     
     auto it = tasks.end();
     --it; //This makes it point to the last element of the list
-    event_t event = { it, getTick() };
+    event_t event = { it, start };
     enqueue(event);
 }
 
@@ -145,4 +147,4 @@ void EventScheduler::updateStats(event_t& e, int64_t startTime, int64_t endTime)
     e.task->workloadStats.add(endTime - startTime);
 }
 
-EventScheduler::EventScheduler() : ActiveObject(1024), permanentTasks(0) {}
+EventScheduler::EventScheduler() : ActiveObject(1024,PRIORITY_MAX-1), permanentTasks(0) {}
diff --git a/src/shared/events/Scheduler.h b/src/shared/events/Scheduler.h
index 859b8997d..659da2f6b 100644
--- a/src/shared/events/Scheduler.h
+++ b/src/shared/events/Scheduler.h
@@ -68,16 +68,22 @@ public:
      * Add a task function to be called periodically by the scheduler
      * \param func function to be called
      * \param intervalMs inter call period
+     * \param start the first activation will be at time start+intervalMs,
+     * useful for synchronizing tasks
      */
-    void add(function_t func, uint32_t intervalMs, const std::string& name);
+    void add(function_t func, uint32_t intervalMs, const std::string& name,
+             int64_t start=miosix::getTick());
     
     /**
      * Add a single shot task function to be called only once, after the
      * given delay
      * \param func function to be called
      * \param delayMs delay before the call
+     * \param start the first activation will be at time start+intervalMs,
+     * useful for synchronizing tasks
      */
-    void addOnce(function_t func, uint32_t delayMs);
+    void addOnce(function_t func, uint32_t delayMs,
+                 int64_t start=miosix::getTick());
     
     /**
      * \return statistics for all tasks
@@ -123,7 +129,7 @@ private:
      * In addition, also takes care of genrating the (first) event for the task
      * \param pask the task to add
      */
-    void addTask(const task_t& task);
+    void addTask(const task_t& task, int64_t start);
     
     /**
      * (Re)Enqueue a schedule.
-- 
GitLab