- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
基本上,我只想知道手动对 C FSM 的状态进行热编码是否是个好主意。我实现了它来编写一个简单的状态转换验证器:
typedef enum
{
FSM_State1 = (1 << 0),
FSM_State2 = (1 << 1),
FSM_State3 = (1 << 2),
FSM_StateError = (1 << 3)
} states_t;
然后验证:
states_t nextState, requestedState;
uint32_t validDestStates = 0;
// Compute requested state
requestedState = FSM_State1;
// Define valid transitions
validDestStates |= FSM_State2;
validDestStates |= FSM_State3;
// Check transition
if (validDestStates & requestedState)
{
// Valid transition
nextState = requestedState;
}
else
{
// Illegal transition
nextState = FSM_StateError;
}
我知道我受限于我可以使用的最大整数大小。但是我没有那么多状态。所以这不是问题
有比这种编码更好的东西吗?是否有一些我还没有看到的缺点?
感谢您的帮助!
编辑:根据 user3386109 评论更改了验证测试
最后就是我所做的:
1/状态枚举是一个“经典”枚举:
typedef enum
{
FSM_State1,
FSM_State2,
FSM_State3,
FSM_StateError
} states_t;
2/有效转换的位字段:
struct s_fsm_stateValidation
{
bool State1IsValid: 1;
bool State2Valid: 1;
bool State3IsValid: 1;
bool StateErrorIsValid: 1;
/// Reserved space for 32bit reserved in the union
uint32_t reserved: 28;
};
3/为验证创建一个 union
typedef union FSM_stateValidation_u
{
/// The bit field of critical system errors
struct s_fsm_stateValidation state;
/// Access the bit field as a whole
uint32_t all;
} u_FSM_stateValidation;
4/我更改了验证:
u_FSM_stateValidation validDestStates;
// Set valid states
validDestStates.state.State1 = true;
// Compute requestedState
requestedState = FSM_State2;
if ((validDestStates.all & ((uint32_t) (1 << requestedState)) ))
{
// Next state is legal
return requestedState;
}
else
{
return FSM_StateError;
}
最佳答案
从快速 Google 中,“一个热编码”意味着每个有效代码都恰好设置了一位,这似乎就是您正在做的。搜索结果表明这是一种硬件设计模式。
我能想到的缺点是...
正如您所建议的,您极大地限制了有效代码的数量 - 对于 32 位,您最多有 32 个代码/状态,而不是超过 40 亿。
它不是查找表的理想选择,查找表是 switch
的常见实现。声明。通常有一个内部函数可用于确定哪个是最低位集,但我不会打赌编译器会自动使用它。
不过,只要州的数量很少,这些都不是大问题。
那么,IMO 的问题是,是否有优势证明该成本是合理的。它不需要是一个巨大的优势,但必须有某种意义。
我能想到的最好办法是你可以使用按位技巧来指定状态集,这样你就可以有效地测试当前状态是否在给定的集合中——如果你有一些需要在状态中完成的 Action (1<<0)
和 (1<<3)
,例如,您可以测试 if (state & 0x9)
.
关于c - C FSM 状态的一种热编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32220507/
组合 FSM 的状态是否“正确”? 假设你有一个对象 enum State { State1 = 1 << 0, State2 = 1 << 1, State3 = 1 <<
我想编写一个以空闲状态开始并根据某些事件从一种状态转移到另一种状态的FSM。我对FSM的编码不熟悉,而Google也无济于事。 欣赏是否有人可以发布可用于同一数据结构的C数据结构。 谢谢, syuga
我在 django-fsm 中让基于源和目标规则的转换装饰器运行良好(有限状态机)。现在我正在尝试添加权限处理。这看起来很简单,但似乎无论我做什么,转换都会执行,无论用户是否拥有权限。我试过 Djan
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我正在尝试使用有限状态机作为管理简单游戏流程的模型。进入主菜单状态,从中选择开始游戏或修改选项等。 我这样做的方法是创建一个状态基类,每个状态都从该类继承。我有一个管理程序循环的应用程序类,并添加一个
嗨..我想要一个如何在 C 中使用函数指针实现 FSM 的示例。 最佳答案 参见 this simple example关于如何在 C 中实现有限状态机。 关于c - FSM 中的函数指针,我们在St
我想为此语法实现一个 FSM/“下推自动机”解析器:parser with scopes and conditionals已经被“词法分析”到 Finite State Machine parser
我正在使用 Fysom 创建 FSM。我想以其他方式使用回调: TABLE = { 'initial': 'OFF', 'events': [{'name': 'load', 'src': 'OFF'
我是 VHDL 的新手,正在关注 this tutorial实现以下 Mealy 有限状态机: 并用VHDL编写了以下代码: library ieee; use ieee.std_logic_1164
我在 VHDL 中看到的很多 FSM 都是通过在 FSM 逻辑中设置一个变量“next_state”来工作的,然后将它单独分配给进程之外的状态变量。 如果简单地写“state <= state_fiv
当我尝试编写有限状态机时,我刚刚在 Haskell 中遇到了“无限类型”。我认为以下内容非常直观: fsm [] _ acc = Right acc fsm (x:xs) state
我喜欢采用 FSM 需要的指标,直到它达到某个状态。我不想用度量代码向我的类发送垃圾邮件,而是想添加一个特征来覆盖某些方法并在调用该方法时发出一条消息。 例如: trait InstrumentedA
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
假设我有一个类型 Thing拥有国有属性(property)A | B | C , 和合法的状态转换是 A->B, A->C, C->A . 我可以写: transitionToA :: Thing
对具有 native 语言的建议(因此没有 FSM 生成工具)支持状态机开发和执行以及消息/信号的传递。这适用于电信,例如这种复杂程度的 FSM 的实现。 我考虑过 Erlang,但希望得到一些反馈、
Akka提供了两种重叠的方式来管理角色状态Finite State Machines和unbecome/become。他们各自的好处/缺点是什么?什么时候应该选择其中一个? 最佳答案 FSM是DSL,
我必须用 vhdl 编写一个带有计时器的 FSM。 我认为,您无需厌倦了解我的电路将做什么。 我只是想帮助我解决这个问题:从一种状态到另一种状态的每次变化,都会有一个(或多个)时钟周期延迟。问题是,我
我在我的项目中使用 Akka FSM 并打算添加持久性。直接的解决方案是使用 Persistent FSM( https://doc.akka.io/docs/akka/current/persist
我正在 java 类中实现有限状态机。我无法找到另一个例子,其中状态和事件是它们自己的对象(也许这是有原因的?),而且我不太相信我的解决方案,特别是因为我必须为 FSM 分配一个状态(实际管理器)然后
我想在 FSM 中的状态执行之间创建一个计时器间隔。 我现在所拥有的是非常基础的,因为我对编程还是很陌生。如果您能将任何可能的解决方案保持在基本水平附近,那就太好了。 public override
我是一名优秀的程序员,十分优秀!