Reaction(反应)是怎么被触发的

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 as always

它们真正的含义是:

在每一次 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 写法
  • 对比 always vs everyRTOS / 裸机 下的区别
  • 解释 EventDriven vs CycleBased 时这些 trigger 的差异

你可以直接贴你现在的 state 行为代码 👍