27 m_last_start_ticks(0),
28 m_last_cycle_ticks(0),
30 (void)::memset(&m_state, 0,
sizeof(m_state));
34 FW_ASSERT(queueDepth == 1, static_cast<FwAssertArgType>(
41 m_cycle = cycle_ticks;
49 if (m_state.
used > 0) {
52 static_cast<FwAssertArgType>(previous.
start),
53 static_cast<FwAssertArgType>(
start));
55 static_cast<FwAssertArgType>(previous.
start),
56 static_cast<FwAssertArgType>(
start));
68 FW_ASSERT(length <= m_cycle, static_cast<FwAssertArgType>(length), static_cast<FwAssertArgType>(m_cycle));
69 FW_ASSERT(
start <= m_cycle - length, static_cast<FwAssertArgType>(
start), static_cast<FwAssertArgType>(length),
70 static_cast<FwAssertArgType>(m_cycle));
71 FW_ASSERT(userContext > m_cycle, static_cast<FwAssertArgType>(userContext), static_cast<FwAssertArgType>(m_cycle));
82 entry.
context = (userContext !=
DONT_CARE) ? userContext / m_cycle : getNextContext(port);
86 FW_ASSERT(std::numeric_limits<U32>::max() / m_ticks_rollover >= entry.
context);
87 m_ticks_rollover *= entry.
context;
90 entry.
contextType = (userContext !=
DONT_CARE) ? PhaserContextType::COUNT : PhaserContextType::SEQUENTIAL;
112 void ActivePhaser ::Tick_internalInterfaceHandler() {
114 static_cast<FwAssertArgType>(m_state.
used));
116 U32 full_ticks = m_ticks;
120 if ((this->timeInCycle(full_ticks) >= m_cycle) && (m_state.
current == m_state.
used)) {
121 m_last_cycle_ticks = full_ticks;
124 m_cycle_count = (m_cycle_count + 1) % m_ticks_rollover;
128 if (finishChild(full_ticks) != ActivePhaser::FinishStatus::LATE) {
129 startChild(full_ticks);
136 return ActivePhaser::FinishStatus::UNKNOWN;
143 const U32 execution_time = full_ticks - m_last_start_ticks;
144 const U32 expected_time = entry.length;
147 entry.started =
false;
151 if (execution_time > expected_time) {
153 return ActivePhaser::FinishStatus::LATE;
156 return ActivePhaser::FinishStatus::ON_TIME;
159 void ActivePhaser ::startChild(U32 full_ticks) {
163 timeInCycle(full_ticks))
174 FW_ASSERT(entry.context != 0, static_cast<FwAssertArgType>(entry.port));
175 context = m_cycle_count % entry.context;
177 entry.started =
true;
178 m_last_start_ticks = full_ticks;
182 U32 ActivePhaser ::getNextContext(
FwIndexType port) {
187 for (U32 i = 0; i < m_state.
used; i++) {
195 U32 ActivePhaser ::timeInCycle(U32 full_ticks) {
196 return (full_ticks - m_last_cycle_ticks);
static const U32 MAX_CHILDREN
void configure(U32 cycle_ticks)
void register_phased(FwIndexType port, U32 length, U32 start=DONT_CARE, U32 userContext=DONT_CARE)
PlatformSizeType FwSizeType
void unLock()
unlock the mutex and assert success
FinishStatus
Finish status.
void PhaserMemberOut_out(FwIndexType portNum, U32 context) const
Invoke output port PhaserMemberOut.
PhaserStateEntry entries[MAX_CHILDREN]
ActivePhaser(const char *const compName)
Construct ActivePhaser object.
void init()
Object initializer.
configuration for phasing
PhaserContextType contextType
~ActivePhaser()
Destroy ActivePhaser object.
void Tick_internalInterfaceInvoke()
Internal interface base-class function for Tick.
static const U32 DONT_CARE
bool isConnected_PhaserMemberOut_OutputPort(FwIndexType portNum) const
Auto-generated base for ActivePhaser component.
PlatformIndexType FwIndexType
static constexpr FwIndexType getNum_PhaserMemberOut_OutputPorts()
RateGroupDivider component implementation.
void start(FwTaskPriorityType priority=Os::Task::TASK_PRIORITY_DEFAULT, FwSizeType stackSize=Os::Task::TASK_DEFAULT, FwSizeType cpuAffinity=Os::Task::TASK_DEFAULT, FwTaskIdType identifier=static_cast< FwTaskIdType >(Os::Task::TASK_DEFAULT))
called by instantiator when task is to be started
U32 used
The number of registered tasks (the last registered task is at used - 1)
U32 current
The current child task entry index.
void lock()
lock the mutex and assert success
void log_WARNING_HI_MissedDeadline(FwIndexType p, U32 start, U32 length, U32 ticks)