SimpleKernel 1.17.0
Loading...
Searching...
No Matches
task_fsm.hpp
Go to the documentation of this file.
1
5#pragma once
6
7#include <etl/fsm.h>
8
9#include "kernel_log.hpp"
10#include "task_messages.hpp"
11
13namespace TaskStatusId {
14inline constexpr etl::fsm_state_id_t kUnInit = 0;
15inline constexpr etl::fsm_state_id_t kReady = 1;
16inline constexpr etl::fsm_state_id_t kRunning = 2;
17inline constexpr etl::fsm_state_id_t kSleeping = 3;
18inline constexpr etl::fsm_state_id_t kBlocked = 4;
19inline constexpr etl::fsm_state_id_t kExited = 5;
20inline constexpr etl::fsm_state_id_t kZombie = 6;
21} // namespace TaskStatusId
22
23// 前向声明所有状态类,以便在转换表中相互引用
24struct StateUnInit;
25struct StateReady;
26struct StateRunning;
27struct StateSleeping;
28struct StateBlocked;
29struct StateExited;
30struct StateZombie;
31
35struct StateUnInit : public etl::fsm_state<etl::fsm, StateUnInit,
36 TaskStatusId::kUnInit, MsgSchedule> {
37 auto on_event(const MsgSchedule&) -> etl::fsm_state_id_t {
39 }
40 auto on_event_unknown(const etl::imessage& msg) -> etl::fsm_state_id_t {
41 klog::Warn("TaskFsm: UnInit received unexpected message id={}",
42 static_cast<int>(msg.get_message_id()));
43 return STATE_ID;
44 }
45};
46
50struct StateReady : public etl::fsm_state<etl::fsm, StateReady,
51 TaskStatusId::kReady, MsgSchedule> {
52 auto on_event(const MsgSchedule&) -> etl::fsm_state_id_t {
54 }
55 auto on_event_unknown(const etl::imessage& msg) -> etl::fsm_state_id_t {
56 klog::Warn("TaskFsm: Ready received unexpected message id={}",
57 static_cast<int>(msg.get_message_id()));
58 return STATE_ID;
59 }
60};
61
66 : public etl::fsm_state<etl::fsm, StateRunning, TaskStatusId::kRunning,
67 MsgYield, MsgSleep, MsgBlock, MsgExit> {
68 auto on_event(const MsgYield&) -> etl::fsm_state_id_t {
70 }
71 auto on_event(const MsgSleep&) -> etl::fsm_state_id_t {
73 }
74 auto on_event(const MsgBlock&) -> etl::fsm_state_id_t {
76 }
77 auto on_event(const MsgExit& msg) -> etl::fsm_state_id_t {
78 if (msg.has_parent) {
80 }
82 }
83 auto on_event_unknown(const etl::imessage& msg) -> etl::fsm_state_id_t {
84 klog::Warn("TaskFsm: Running received unexpected message id={}",
85 static_cast<int>(msg.get_message_id()));
86 return STATE_ID;
87 }
88};
89
94 : public etl::fsm_state<etl::fsm, StateSleeping, TaskStatusId::kSleeping,
95 MsgWakeup> {
96 auto on_event(const MsgWakeup&) -> etl::fsm_state_id_t {
98 }
99 auto on_event_unknown(const etl::imessage& msg) -> etl::fsm_state_id_t {
100 klog::Warn("TaskFsm: Sleeping received unexpected message id={}",
101 static_cast<int>(msg.get_message_id()));
102 return STATE_ID;
103 }
104};
105
109struct StateBlocked : public etl::fsm_state<etl::fsm, StateBlocked,
110 TaskStatusId::kBlocked, MsgWakeup> {
111 auto on_event(const MsgWakeup&) -> etl::fsm_state_id_t {
113 }
114 auto on_event_unknown(const etl::imessage& msg) -> etl::fsm_state_id_t {
115 klog::Warn("TaskFsm: Blocked received unexpected message id={}",
116 static_cast<int>(msg.get_message_id()));
117 return STATE_ID;
118 }
119};
120
124struct StateExited : public etl::fsm_state<etl::fsm, StateExited,
125 TaskStatusId::kExited, MsgReap> {
126 auto on_event(const MsgReap&) -> etl::fsm_state_id_t { return STATE_ID; }
127 auto on_event_unknown(const etl::imessage& msg) -> etl::fsm_state_id_t {
128 klog::Warn("TaskFsm: Exited received unexpected message id={}",
129 static_cast<int>(msg.get_message_id()));
130 return STATE_ID;
131 }
132};
133
137struct StateZombie : public etl::fsm_state<etl::fsm, StateZombie,
138 TaskStatusId::kZombie, MsgReap> {
139 auto on_event(const MsgReap&) -> etl::fsm_state_id_t {
141 }
142 auto on_event_unknown(const etl::imessage& msg) -> etl::fsm_state_id_t {
143 klog::Warn("TaskFsm: Zombie received unexpected message id={}",
144 static_cast<int>(msg.get_message_id()));
145 return STATE_ID;
146 }
147};
148
152class TaskFsm {
153 public:
157 auto Start() -> void { fsm_.start(); }
158
163 auto Receive(const etl::imessage& msg) -> void { fsm_.receive(msg); }
164
169 [[nodiscard]] auto GetStateId() const -> etl::fsm_state_id_t {
170 return fsm_.get_state_id();
171 }
172
175 TaskFsm() : fsm_(router_id::kTaskFsm) {
183 fsm_.set_states(state_list_, 7);
184 }
185
186 TaskFsm(const TaskFsm&) = delete;
187 TaskFsm(TaskFsm&&) = delete;
188 auto operator=(const TaskFsm&) -> TaskFsm& = delete;
189 auto operator=(TaskFsm&&) -> TaskFsm& = delete;
190 ~TaskFsm() = default;
192
193 private:
201
202 etl::ifsm_state* state_list_[7];
203
204 etl::fsm fsm_;
205};
任务有限状态机
Definition task_fsm.hpp:152
TaskFsm(const TaskFsm &)=delete
etl::ifsm_state * state_list_[7]
Definition task_fsm.hpp:202
StateReady state_ready_
Definition task_fsm.hpp:195
TaskFsm(TaskFsm &&)=delete
auto Receive(const etl::imessage &msg) -> void
向 FSM 发送消息
Definition task_fsm.hpp:163
auto operator=(TaskFsm &&) -> TaskFsm &=delete
StateZombie state_zombie_
Definition task_fsm.hpp:200
StateUnInit state_uninit_
Definition task_fsm.hpp:194
~TaskFsm()=default
StateRunning state_running_
Definition task_fsm.hpp:196
auto Start() -> void
启动 FSM(在 TCB 完全构造后调用)
Definition task_fsm.hpp:157
auto operator=(const TaskFsm &) -> TaskFsm &=delete
etl::fsm fsm_
Definition task_fsm.hpp:204
StateExited state_exited_
Definition task_fsm.hpp:199
StateBlocked state_blocked_
Definition task_fsm.hpp:198
auto GetStateId() const -> etl::fsm_state_id_t
获取当前状态 ID
Definition task_fsm.hpp:169
StateSleeping state_sleeping_
Definition task_fsm.hpp:197
任务状态 ID — 用作 etl::fsm 的状态 ID
Definition task_fsm.hpp:13
constexpr etl::fsm_state_id_t kExited
Definition task_fsm.hpp:19
constexpr etl::fsm_state_id_t kUnInit
Definition task_fsm.hpp:14
constexpr etl::fsm_state_id_t kReady
Definition task_fsm.hpp:15
constexpr etl::fsm_state_id_t kZombie
Definition task_fsm.hpp:20
constexpr etl::fsm_state_id_t kSleeping
Definition task_fsm.hpp:17
constexpr etl::fsm_state_id_t kBlocked
Definition task_fsm.hpp:18
constexpr etl::fsm_state_id_t kRunning
Definition task_fsm.hpp:16
auto Warn(etl::format_string< Args... > fmt, Args &&... args) -> void
以 WARN 级别记录日志
消息路由 ID
阻塞消息,携带资源 ID
退出消息,携带退出码与父任务标志
回收消息(无负载,用作事件)
调度消息(无负载,用作事件)
睡眠消息,携带唤醒时钟
唤醒消息(无负载,用作事件)
让出消息(无负载,用作事件)
Blocked 状态 — 任务阻塞,等待资源
Definition task_fsm.hpp:110
auto on_event_unknown(const etl::imessage &msg) -> etl::fsm_state_id_t
Definition task_fsm.hpp:114
auto on_event(const MsgWakeup &) -> etl::fsm_state_id_t
Definition task_fsm.hpp:111
Exited 状态 — 任务已退出,无父任务回收
Definition task_fsm.hpp:125
auto on_event_unknown(const etl::imessage &msg) -> etl::fsm_state_id_t
Definition task_fsm.hpp:127
auto on_event(const MsgReap &) -> etl::fsm_state_id_t
Definition task_fsm.hpp:126
Ready 状态 — 任务已就绪,等待调度
Definition task_fsm.hpp:51
auto on_event(const MsgSchedule &) -> etl::fsm_state_id_t
Definition task_fsm.hpp:52
auto on_event_unknown(const etl::imessage &msg) -> etl::fsm_state_id_t
Definition task_fsm.hpp:55
Running 状态 — 任务正在执行
Definition task_fsm.hpp:67
auto on_event_unknown(const etl::imessage &msg) -> etl::fsm_state_id_t
Definition task_fsm.hpp:83
auto on_event(const MsgYield &) -> etl::fsm_state_id_t
Definition task_fsm.hpp:68
auto on_event(const MsgBlock &) -> etl::fsm_state_id_t
Definition task_fsm.hpp:74
auto on_event(const MsgExit &msg) -> etl::fsm_state_id_t
Definition task_fsm.hpp:77
auto on_event(const MsgSleep &) -> etl::fsm_state_id_t
Definition task_fsm.hpp:71
Sleeping 状态 — 任务已挂起,等待唤醒时钟
Definition task_fsm.hpp:95
auto on_event(const MsgWakeup &) -> etl::fsm_state_id_t
Definition task_fsm.hpp:96
auto on_event_unknown(const etl::imessage &msg) -> etl::fsm_state_id_t
Definition task_fsm.hpp:99
UnInit 状态 — 任务尚未初始化
Definition task_fsm.hpp:36
auto on_event_unknown(const etl::imessage &msg) -> etl::fsm_state_id_t
Definition task_fsm.hpp:40
auto on_event(const MsgSchedule &) -> etl::fsm_state_id_t
Definition task_fsm.hpp:37
Zombie 状态 — 任务已退出,等待父任务回收
Definition task_fsm.hpp:138
auto on_event_unknown(const etl::imessage &msg) -> etl::fsm_state_id_t
Definition task_fsm.hpp:142
auto on_event(const MsgReap &) -> etl::fsm_state_id_t
Definition task_fsm.hpp:139