C 如何在状态机上使用全局变量
我制作了这个状态机:C 如何在状态机上使用全局变量,c,global-variables,state-machine,C,Global Variables,State Machine,我制作了这个状态机: enum states { STATE_ENTRY, STATE_....} current_state; enum events { EVENT_OK, EVENT_FAIL,EVENT_REPEAT, MAX_EVENTS } event; void (*const state_table [MAX_STATES][MAX_EVENTS]) (void) = { { action_entry , action_entry_fail , action_entr
enum states { STATE_ENTRY, STATE_....} current_state;
enum events { EVENT_OK, EVENT_FAIL,EVENT_REPEAT, MAX_EVENTS } event;
void (*const state_table [MAX_STATES][MAX_EVENTS]) (void) = {
{ action_entry , action_entry_fail , action_entry_repeat }, /*
procedures for state 1 */
......}
void main (void){
event = get_new_event (); /* get the next event to process */
if (((event >= 0) && (event < MAX_EVENTS))
&& ((current_state >= 0) && (current_state < MAX_STATES))) {
state_table [current_state][event] (); /* call the action procedure */
printf("OK 0");
} else {
/* invalid event/state - handle appropriately */
}
}
enum states{STATE\u ENTRY,STATE\u….}当前状态;
枚举事件{EVENT_OK,EVENT_FAIL,EVENT_REPEAT,MAX_events}事件;
void(*const state_table[MAX_STATES][MAX_EVENTS])(void)={
{action\u entry,action\u entry\u fail,action\u entry\u repeat},/*
国家1的程序*/
......}
真空总管(真空){
event=get_new_event();/*获取下一个要处理的事件*/
如果((事件>=0)和&(事件<最大事件))
&&((当前状态>=0)和&(当前状态<最大状态))){
状态表[当前状态][事件]();/*调用操作过程*/
printf(“正常0”);
}否则{
/*无效事件/状态-正确处理*/
}
}
当我在一个状态中修改一个全局变量时,全局变量保持不变,并且我需要在所有状态中使用该变量。你现在知道有什么问题吗?
我的全局变量是以下结构:
#if (CPU_TYPE == CPU_TYPE_32)
typedef uint32_t word;
#define word_length 32
typedef struct BigNumber {
word words[64];
} BigNumber;
#elif (CPU_TYPE == CPU_TYPE_16)
typedef uint16_t word;
#define word_length 16
typedef struct BigNumber {
word words[128];
} BigNumber;
#else
#error Unsupported CPU_TYPE
#endif
BigNumber number1 , number2;
Here is how I modify:
//iterator is a number from where I start to modify,
//I already modified on the same way up to the iterator
for(i=iterator+1;i<32;i++){
nr_rand1=661;
nr_rand2=1601;
nr_rand3=1873;
number2.words[i]=(nr_rand1<<21) | (nr_rand2<<11) | (nr_rand3);
}
\if(CPU类型==CPU类型32)
typedef uint32_t字;
#定义字长32
typedef结构BigNumber{
单词[64];
}大数;
#elif(CPU类型==CPU类型16)
typedef uint16_t字;
#定义单词长度16
typedef结构BigNumber{
单词[128];
}大数;
#否则
#错误:不支持的CPU\u类型
#恩迪夫
大数字1,数字2;
以下是我如何修改的:
//迭代器是我开始修改的数字,
//我已经用同样的方法修改了迭代器
对于(i=iterator+1;i这只是为了防止您可能想要更改定义FSM的方法。我将用一个示例向您展示;假设您有以下FSM:
您可以将其表示为:
void function process() {
fsm {
fsmSTATE(S) {
/* do your entry actions heare */
event = getevent();
/* do you actions here */
if (event.char == 'a') fsmGOTO(A);
else fsmGOTO(E);
}
fsmSTATE(A) {
event = getevent();
if (event.char == 'b' || event.char == 'B') fsmGOTO(B);
else fsmGOTO(E);
}
fsmSTATE(B) {
event = getevent();
if (event.char == 'a' ) fsmGOTO(A);
else fsmGOTO(E);
}
fsmSTATE(E) {
/* done with the FSM. Bye bye! */
}
}
}
我确实声称(但我相信有人会不同意)这比使用表格更简单,可读性更强,更直接地传达了FSM的结构。即使我没有放图片,绘制FSM图也相当容易
要实现这一点,您只需定义fsmXXX
内容,如下所示:
#define fsm
#define fsmGOTO(x) goto fsm_state_##x
#define fsmSTATE(x) fsm_state_##x :
这只是为了防止您可能想要更改定义FSM的方法。我将用一个示例向您展示;假设您有以下FSM:
您可以将其表示为:
void function process() {
fsm {
fsmSTATE(S) {
/* do your entry actions heare */
event = getevent();
/* do you actions here */
if (event.char == 'a') fsmGOTO(A);
else fsmGOTO(E);
}
fsmSTATE(A) {
event = getevent();
if (event.char == 'b' || event.char == 'B') fsmGOTO(B);
else fsmGOTO(E);
}
fsmSTATE(B) {
event = getevent();
if (event.char == 'a' ) fsmGOTO(A);
else fsmGOTO(E);
}
fsmSTATE(E) {
/* done with the FSM. Bye bye! */
}
}
}
我确实声称(但我相信有人会不同意)这比使用表格更简单,可读性更强,更直接地传达了FSM的结构。即使我没有放图片,绘制FSM图也相当容易
要实现这一点,您只需定义fsmXXX
内容,如下所示:
#define fsm
#define fsmGOTO(x) goto fsm_state_##x
#define fsmSTATE(x) fsm_state_##x :
关于更改编号2的代码:
for(i=iterator+1;i<32;i){
nr_rand1=661;
nr_rand2=1601;
nr_rand3=1873;
number2.words[i]=(nr_rand1<<21) | (nr_rand2<<11) | (nr_rand3);
}
for(i=iterator+1;i关于更改的代码number2
:
for(i=iterator+1;i<32;i){
nr_rand1=661;
nr_rand2=1601;
nr_rand3=1873;
number2.words[i]=(nr_rand1<<21) | (nr_rand2<<11) | (nr_rand3);
}
for(i=iterator+1;i这不是一个答案,而是一个注释。但是它太大,无法容纳注释字段,所以我现在将其发布在这里
问题中发布的代码不足以找到根本原因。您需要发布一个显示问题的最小但完整的示例
比如:
#include<stdio.h>
#include<stdlib.h>
#include <stdint.h>
typedef uint32_t word;
#define word_length 32
typedef struct BigNumber {
word words[4];
} BigNumber;
BigNumber number2;
enum states { STATE_0, STATE_1} current_state;
enum events { EVENT_A, EVENT_B } event;
void f1(void)
{
int i;
current_state = STATE_1;
for (i=0; i<4; ++i) number2.words[i] = i;
}
void f2(void)
{
int i;
current_state = STATE_0;
for (i=0; i<4; ++i) number2.words[i] = 42 + i*i;
}
void (*const state_table [2][2]) (void) =
{
{ f1 , f1 },
{ f2 , f2 }
};
int main (void){
current_state = STATE_0;
event = EVENT_A;
state_table [current_state][event] (); /* call the action procedure */
printf("%u %u %u %u\n", number2.words[0], number2.words[1], number2.words[2], number2.words[3]);
event = EVENT_B;
state_table [current_state][event] (); /* call the action procedure */
printf("%u %u %u %u\n", number2.words[0], number2.words[1], number2.words[2], number2.words[3]);
return 0;
}
这不是一个答案,而是一个评论。但是它太大了,不适合评论栏,所以我现在把它贴在这里
问题中发布的代码不足以找到根本原因。您需要发布一个显示问题的最小但完整的示例
比如:
#include<stdio.h>
#include<stdlib.h>
#include <stdint.h>
typedef uint32_t word;
#define word_length 32
typedef struct BigNumber {
word words[4];
} BigNumber;
BigNumber number2;
enum states { STATE_0, STATE_1} current_state;
enum events { EVENT_A, EVENT_B } event;
void f1(void)
{
int i;
current_state = STATE_1;
for (i=0; i<4; ++i) number2.words[i] = i;
}
void f2(void)
{
int i;
current_state = STATE_0;
for (i=0; i<4; ++i) number2.words[i] = 42 + i*i;
}
void (*const state_table [2][2]) (void) =
{
{ f1 , f1 },
{ f2 , f2 }
};
int main (void){
current_state = STATE_0;
event = EVENT_A;
state_table [current_state][event] (); /* call the action procedure */
printf("%u %u %u %u\n", number2.words[0], number2.words[1], number2.words[2], number2.words[3]);
event = EVENT_B;
state_table [current_state][event] (); /* call the action procedure */
printf("%u %u %u %u\n", number2.words[0], number2.words[1], number2.words[2], number2.words[3]);
return 0;
}
您能在修改全局变量的地方添加实际代码段吗?您对将FSM表示为(2D)有严格要求吗指向函数的指针数组?我发现它非常复杂,您选择它肯定会从其他地方获得一些好处。@PopoviciSebi-不要添加代码作为注释。而是编辑您的问题,使代码成为问题本身的一部分。尝试提供一个生成问题的小而完整的示例,以便我们可以在自己的系统中重复它stem.@Remo.D这是我发现的最简单的模型之一…我需要一个rsa签名的状态机,在32位板上实现,我是这方面的新手。您的方法还可以,但您没有向我们展示足够的代码来帮助您。请尝试将您的代码转换为一个可以按原样编译的简短简化示例。也许您会发现错误,而我举一个简化的例子;-)您能在修改全局变量的地方添加实际的代码段吗?您对将FSM表示为(2D)有严格的要求吗指向函数的指针数组?我发现它非常复杂,您选择它肯定会从其他地方获得一些好处。@PopoviciSebi-不要添加代码作为注释。而是编辑您的问题,使代码成为问题本身的一部分。尝试提供一个生成问题的小而完整的示例,以便我们可以在自己的系统中重复它stem.@Remo.D这是我发现的最简单的模型之一…我需要一个rsa签名的状态机,在32位板上实现,我是这方面的新手。您的方法还可以,但您没有向我们展示足够的代码来帮助您。请尝试将您的代码转换为一个可以按原样编译的简短简化示例。也许您会发现错误,而我举个简单的例子;-)谢谢,我要试试这个模型,它看起来适合我需要的。谢谢,我要试试这个模型,它看起来适合我需要的。好的捕获-这可能是:-)我修改了增量(这里的复制粘贴错误),但问题出在状态机或全局内存上,因为如果我在状态内声明它们,它正在工作,但我需要下一个状态上的结构(修改)好的捕获-可能就是这样:-)我修改了增量(这里粘贴了错误的副本),但问题是在状态机或全局内存上,因为如果我在状态内声明它们,它正在工作,但我需要结构(修改)在下一个状态谢谢,我把所有的函数都放在这个较小的STM机器上,然后再复制粘贴回来,看起来它工作了,仍然不知道是什么问题,但现在它工作了