diff --git a/src/shared/boards/AnakinBoard.cpp b/src/shared/boards/AnakinBoard.cpp index 2c0fe8f9fa72a913056a3361c18f961ac37ae975..283fa7ec5c7a5ee1e313a48474bf1b41c06ae9a1 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 9dc5dba5ea8cc155aa781c4cd4276a5e4d7d4b1d..10e6ee347619efff4e82fa74dddaae94827172cd 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 ccfb3749fbeb535fafc9034c12b5cb7c64143891..634bbe76fae90f1e65c347ad0b6ba8fbc36c6132 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 859b8997db83babe0aebd04c17aff6d0b19b0d1c..659da2f6b9e12465aae87601a3c71a4f3e6eea3d 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.