v这段文档是在系统性说明"Reaction(反应)是怎么被触发的" 。
我帮你拆开讲 + 结合你之前问的"能不能一直判断条件"来解释,这样你一看就懂。
一、Reaction 是什么?
在 CREATE / YAKINDU 里:
Reaction = 触发条件(Trigger) + 可选条件(Guard) + 动作(Effect)
基本形式是:
text
trigger [guard] / effect
二、Trigger(触发器)是什么?
Trigger 决定"什么时候检查 / 执行这条 reaction"
1️⃣ 普通事件作为 trigger
text
ev1 / doSomething
意思是:
当事件
ev1发生时,执行doSomething
2️⃣ 多个 trigger(逗号分隔 = OR)
text
ev1, ev2 / doSomething
意思是:
ev1 或 ev2 任意一个发生,就执行
⚠️ 不是同时发生,是 逻辑 OR
3️⃣ Trigger + Guard(你最关心的)
text
ev1 [x > 10] / doSomething
意思是:
ev1 发生 并且
x > 10才执行动作
👉 条件只在 trigger 到来时判断
三、时间相关 trigger(非常重要)
⏱ after
text
after 3s / doSomething
含义:
进入状态后,3 秒后执行一次
只执行 一次
🔁 every
text
every 100 ms / checkSomething
含义:
周期执行
进入状态后,每 100ms 触发一次
👉 这就是"持续判断条件"的推荐方式之一
四、always / oncycle(重点理解)
always
text
always [x > 10] / raise alarm
oncycle
text
oncycle [x > 10] / raise alarm
文档里说:
oncycle= same asalways
它们真正的含义是:
在每一次 state machine runCycle() 时都会被触发
⚠️ 关键前提:
你必须在外部调用
statemachine_runCycle()
对应你之前的问题 👇
能不能在状态下一直判断条件?
✅ 可以,但方式是:
text
oncycle [condition] / effect
而不是 while 循环。
五、entry / exit(你已经比较熟了)
text
entry / init()
exit / cleanup()
含义很明确:
| trigger | 执行时机 |
|---|---|
| entry | 进入状态 |
| exit | 离开状态 |
只执行 一次
六、else / default(Choice 状态用)
text
choice {
[x > 0] -> A
else -> B
}
else/default:
前面条件都不满足时的兜底分支
七、Trigger 可以组合使用(非常强)
text
ev1, after 3s [ready] / start()
意思是:
- ev1 到来 或
- 3 秒过去
只要其中之一发生
且
ready == true→ 执行动作
八、和你"持续判断"的正确映射关系
❌ 错误思维(程序员直觉)
c
while(state == WAIT) {
if(cond) trigger();
}
✅ 正确的状态机写法
方案 1:oncycle
text
state WAIT {
oncycle [cond] / raise eventX
}
方案 2:every
text
state WAIT {
every 50 ms [cond] / raise eventX
}
方案 3:tick 事件
text
tick [cond] / raise eventX
九、总结一句话(非常重要)
Reaction 永远不会"自己执行",
它只会在 trigger 到来时被检查。
| trigger | 谁触发 |
|---|---|
| event | 外部 / 内部 raise |
| after / every | 定时器 |
| always / oncycle | runCycle() |
| entry / exit | 状态变化 |
十、如果你愿意,我可以继续帮你
我可以直接帮你:
- 把 你现在的某个状态改成最合理的 trigger 写法
- 对比
alwaysvsevery在 RTOS / 裸机 下的区别 - 解释 EventDriven vs CycleBased 时这些 trigger 的差异
你可以直接贴你现在的 state 行为代码 👍