我正在尝试实现多线程应用程序,其中每个线程都执行 FSA。
FSA 最初是为嵌入式应用程序编写的,现在我需要制作该 FSA 的模拟器,并在每个不同的线程中执行其中的n。
让我们深入研究单个 FSA 的一些代码:
├── inc
│ ├── common
│ │ └── controller_def.h
│ ├── controller.h
│ ├── controller_table.h
│ ├── fsa_1
│ │ ├── bar.h
│ │ ├── baz.h
│ │ ├── controller_def.h
│ │ └── foo.h
│ ├── fsa_2
│ │ ├── controller_def.h
│ │ ├── cor.h
│ │ ├── qux.h
│ │ └── wal.h
│ ├── manager.h
│ ├── queue.h
│ └── trace.h
├── src
│ ├── controller.c
│ ├── fsa_1
│ │ ├── bar.c
│ │ ├── baz.c
│ │ ├── controller_def.c
│ │ └── foo.c
│ ├── fsa_2
│ │ ├── controller_def.c
│ │ ├── cor.c
│ │ ├── qux.c
│ │ └── wal.c
│ ├── main.c
│ ├── manager.c
│ ├── queue.c
│ └── trace.c
#ifndef __CONTROLLER_H__
#define __CONTROLLER_H__
#include "controller_table.h"
#include "common/controller_def.h"
typedef struct Controller_S
{
Controller_State state;
EN_Table_ID curr_func;
EN_Table_ID last_func;
Executive_Node *en_table;
Transition **tc_table;
} Controller;
void
controller_init
(
Controller *ctrl, EN_Table_ID first_func,
Executive_Node *en, Transition **tc
);
void
controller_execute(Controller *ctrl);
void
controller_deinit(Controller *ctrl);
#endif /* __CONTROLLER_H__ */
因此,有 2 个基表提供 FSA 的正确执行:
en_table
- 提供基于枚举的函数指针 EN_Table_ID
和 tc_table
- 提供基于当前状态、最后一个函数及其结果的转换表.
因此,正如您在工作树中看到的那样,有 2 个目录用于
fsa_1
和 fsa_2
,其中是专门针对每个 FSA 的函数,还有 controller_def.c
定义了这些表。
现在的问题是:如何使其成为区分表和某些枚举名称的最佳方式,但尽可能保持通用。
我考虑了一些预处理魔法,其中每个 typedef 都将被预处理,就像额外的“名称修改”一样,但我认为这种方法有点尴尬,所以我对一些建议持开放态度!
提前致谢!
很抱歉,您几乎没有提供任何帮助他人帮助您做您想做的事情。您提供了一个函数,该函数创建了许多不初始化任何内容的变量,以及几个根本没有定义的原型。
您似乎认为所有有限状态自动机都具有完全相同的框架,因此所有代码必须具有相同的“形状”供您填充。我讨厌戳破你的泡沫,但不。
多线程代码比您提供的骨架框架有更多的考虑因素,因此没有人可以在这里帮助您。