#include "zos_schduler.hpp" #include "zoslogger.hpp" #include "ticket.hpp" using namespace std; using namespace iflytop; void ZOSSchduler::regPeriodJob(function job, uint32_t period_ms) { PeriodJob* periodJob = new PeriodJob(job, period_ms); ZASSERT(periodJob != NULL); m_periodJobs.push_back(periodJob); } void ZOSSchduler::loop() { Context context; if (zos_haspassedms(ticket) < 1) { return; } ticket = zos_get_tick(); for (auto iter = m_periodJobs.begin(); iter != m_periodJobs.end(); iter++) { auto periodJob = *iter; if ((uint32_t)zos_haspassedms2(periodJob->lastcall, ticket) < periodJob->period_ms) { continue; } context.periodJob = periodJob; periodJob->lastcall = ticket; periodJob->job(context); periodJob->schedule_times++; } } void ZOSSchduler::startSchedule(const char* threadname, int stack_size, osPriority priority) { m_thread.init(threadname, stack_size, priority); m_thread.run([this]() { while (true) { loop(); osDelay(1); } }); }