当前位置: 首页 > news >正文

seo网站推广杭州南京百度提升优化

seo网站推广杭州,南京百度提升优化,邢台贴吧最新消息,成都三日游最佳路线安排状态机模式是一种行为模式,通过多态实现不同状态的调转行为的确是一种很好的方法,只可惜在嵌入式环境下,有时只能写纯C代码,并且还需要考虑代码的重入和多任务请求跳转等情形,因此实现起来着实需要一番考虑。 近日在看…

状态机模式是一种行为模式,通过多态实现不同状态的调转行为的确是一种很好的方法,只可惜在嵌入式环境下,有时只能写纯C代码,并且还需要考虑代码的重入和多任务请求跳转等情形,因此实现起来着实需要一番考虑。

近日在看到了一个状态机的实现,也学着写了一个,与大家分享。

首先,分析一下一个普通的状态机究竟要实现哪些内容。

状态机存储从开始时刻到现在的变化,并根据当前输入,决定下一个状态。这意味着,状态机要存储状态、获得输入(我们把它叫做跳转条件)、做出响应。

如上图所示,{s1, s2, s3}均为状态,箭头c1/a1表示在s1状态、输入为c1时,跳转到s2,并进行a1操作。

最下方为一组输入,状态机应做出如下反应:

图片

当某个状态遇到不能识别的输入时,就默认进入陷阱状态,在陷阱状态中,不论遇到怎样的输入都不能跳出。

为了表达上面这个自动机,我们定义它们的状态和输入类型:

typedef int State;
typedef int Condition;#define STATES 3 + 1
#define STATE_1 0
#define STATE_2 1
#define STATE_3 2
#define STATE_TRAP 3#define CONDITIONS 2
#define CONDITION_1 0
#define CONDITION_2 1

在嵌入式环境中,由于存储空间比较小,因此把它们全部定义成宏。此外,为了降低执行时间的不确定性,我们使用O(1)的跳转表来模拟状态的跳转。

首先定义跳转类型:

typedef void (*ActionType)(State state, Condition condition);typedef struct
{State next;ActionType action;
} Trasition, * pTrasition;

然后按照上图中的跳转关系,把三个跳转加一个陷阱跳转先定义出来:

// (s1, c1, s2, a1)
Trasition t1 = {STATE_2,action_1
};// (s2, c2, s3, a2)
Trasition t2 = {STATE_3,action_2
};// (s3, c1, s2, a3)
Trasition t3 = {STATE_2,action_3
};// (s, c, trap, a1)
Trasition tt = {STATE_TRAP,action_trap
};

其中的动作,由用户自己完成,在这里仅定义一条输出语句。

void action_1(State state, Condition condition)
{printf("Action 1 triggered.\n");
}

最后定义跳转表:

pTrasition transition_table[STATES][CONDITIONS] = {
/*      c1,  c2*/
/* s1 */&t1, &tt,
/* s2 */&tt, &t2,
/* s3 */&t3, &tt,
/* st */&tt, &tt,
};

即可表达上文中的跳转关系。

最后定义状态机,如果不考虑多任务请求,那么状态机仅需要存储当前状态便行了。例如:

typedef struct
{State current;
} StateMachine, * pStateMachine;State step(pStateMachine machine, Condition condition)
{pTrasition t = transition_table[machine->current][condition];(*(t->action))(machine->current, condition);machine->current = t->next;return machine->current;
}

但是考虑到当一个跳转正在进行的时候,同时又有其他任务请求跳转,则会出现数据不一致的问题。

举个例子:task1(s1, c1/a1 –> s2)和task2(s2, c2/a2 –> s3)先后执行,是可以顺利到达s3状态的,但若操作a1运行的时候,执行权限被task2抢占,则task2此时看到的当前状态还是s1,s1遇到c2就进入陷阱状态,而不会到达s3了,也就是说,状态的跳转发生了不确定,这是不能容忍的。

因此要重新设计状态机,增加一个“事务中”条件和一个用于存储输入的条件队列。修改后的代码如下:

#define E_OK        0
#define E_NO_DATA   1
#define E_OVERFLOW  2typedef struct
{Condition queue[QMAX];int head;int tail;bool overflow;
} ConditionQueue, * pConditionQueue;int push(ConditionQueue * queue, Condition c)
{   unsigned int flags;Irq_Save(flags);if ((queue->head == queue->tail + 1) || ((queue->head == 0) && (queue->tail == 0))){queue->overflow = true;Irq_Restore(flags);return E_OVERFLOW;}else{queue->queue[queue->tail] = c;queue->tail = (queue->tail + 1) % QMAX;Irq_Restore(flags);}return E_OK;
}int poll(ConditionQueue * queue, Condition * c)
{unsigned int flags;Irq_Save(flags);if (queue->head == queue->tail){Irq_Restore(flags);return E_NO_DATA;}else{*c = queue->queue[queue->head];queue->overflow = false;queue->head = (queue->head + 1) % QMAX;Irq_Restore(flags);}return E_OK;
}typedef struct
{State current;bool inTransaction;ConditionQueue queue;
} StateMachine, * pStateMachine;static State __step(pStateMachine machine, Condition condition)
{State current = machine -> current;pTrasition t = transition_table[current][condition];(*(t->action))(current, condition);current = t->next;machine->current = current;return current;
}State step(pStateMachine machine, Condition condition)
{Condition next_condition;int status;State current;if (machine->inTransaction){push(&(machine->queue), condition);return STATE_INTRANSACTION;}else{machine->inTransaction = true;current = __step(machine, condition);status = poll(&(machine->queue), &next_condition);while(status == E_OK){__step(machine, next_condition);status = poll(&(machine->queue), &next_condition);}machine->inTransaction = false;return current;}
}void initialize(pStateMachine machine, State s)
{machine->current = s;machine->inTransaction = false;machine->queue.head = 0;machine->queue.tail = 0;machine->queue.overflow = false;
}

文章转载自:
http://dinncolatticework.zfyr.cn
http://dinncounsaid.zfyr.cn
http://dinncopultaceous.zfyr.cn
http://dinncoarizona.zfyr.cn
http://dinncophlebology.zfyr.cn
http://dinncoduskily.zfyr.cn
http://dinncobolsheviki.zfyr.cn
http://dinncowholesomely.zfyr.cn
http://dinncocyclopaedist.zfyr.cn
http://dinncotibia.zfyr.cn
http://dinncotufa.zfyr.cn
http://dinncobessie.zfyr.cn
http://dinncobatrachian.zfyr.cn
http://dinncounfortunately.zfyr.cn
http://dinncoplotline.zfyr.cn
http://dinncospatted.zfyr.cn
http://dinncogentlemanlike.zfyr.cn
http://dinncobahaism.zfyr.cn
http://dinncotaegu.zfyr.cn
http://dinncogreatcoat.zfyr.cn
http://dinncodelinquent.zfyr.cn
http://dinncowushu.zfyr.cn
http://dinncoyap.zfyr.cn
http://dinncoheaver.zfyr.cn
http://dinncobirdbrain.zfyr.cn
http://dinncohemodialysis.zfyr.cn
http://dinncolentiginous.zfyr.cn
http://dinncocommence.zfyr.cn
http://dinnconeurotrophy.zfyr.cn
http://dinncohomiletics.zfyr.cn
http://dinnconamaycush.zfyr.cn
http://dinncobabul.zfyr.cn
http://dinncoresuscitative.zfyr.cn
http://dinncobepelt.zfyr.cn
http://dinncoromper.zfyr.cn
http://dinncoinvolantary.zfyr.cn
http://dinncomertensian.zfyr.cn
http://dinncoruling.zfyr.cn
http://dinncoquarterly.zfyr.cn
http://dinncostyptical.zfyr.cn
http://dinncorubensesque.zfyr.cn
http://dinncocult.zfyr.cn
http://dinncoericeticolous.zfyr.cn
http://dinncodiageotropic.zfyr.cn
http://dinncologgy.zfyr.cn
http://dinncometaphrase.zfyr.cn
http://dinncocontagious.zfyr.cn
http://dinnconarcissistic.zfyr.cn
http://dinncoym.zfyr.cn
http://dinncobusiest.zfyr.cn
http://dinncozoologist.zfyr.cn
http://dinncobrahmin.zfyr.cn
http://dinncopentene.zfyr.cn
http://dinncoorcin.zfyr.cn
http://dinncobullyboy.zfyr.cn
http://dinncobarococo.zfyr.cn
http://dinncodisobedience.zfyr.cn
http://dinncoscoundrel.zfyr.cn
http://dinncomarinade.zfyr.cn
http://dinncopickwick.zfyr.cn
http://dinncoembryulcus.zfyr.cn
http://dinncotheme.zfyr.cn
http://dinncoembrocation.zfyr.cn
http://dinncohypobarism.zfyr.cn
http://dinncocataphonic.zfyr.cn
http://dinncosunlight.zfyr.cn
http://dinncoblunder.zfyr.cn
http://dinncozaptiah.zfyr.cn
http://dinncovbi.zfyr.cn
http://dinncotrestlework.zfyr.cn
http://dinncoanhedonia.zfyr.cn
http://dinncogelandesprung.zfyr.cn
http://dinncocourtling.zfyr.cn
http://dinncoliveable.zfyr.cn
http://dinncoaphasia.zfyr.cn
http://dinncounreachable.zfyr.cn
http://dinncogarron.zfyr.cn
http://dinncocontained.zfyr.cn
http://dinncoblodge.zfyr.cn
http://dinncowidest.zfyr.cn
http://dinncogeepound.zfyr.cn
http://dinncopassably.zfyr.cn
http://dinncoisapi.zfyr.cn
http://dinncoduumvirate.zfyr.cn
http://dinncohydrophilic.zfyr.cn
http://dinncomishook.zfyr.cn
http://dinncononenforceable.zfyr.cn
http://dinncoarachis.zfyr.cn
http://dinncodisenthralment.zfyr.cn
http://dinncoembryectomy.zfyr.cn
http://dinncocomedic.zfyr.cn
http://dinncoplanimeter.zfyr.cn
http://dinncoformfeed.zfyr.cn
http://dinncoflite.zfyr.cn
http://dinncocorkwood.zfyr.cn
http://dinncoplatinous.zfyr.cn
http://dinncovitrine.zfyr.cn
http://dinncochaudfroid.zfyr.cn
http://dinncosixscore.zfyr.cn
http://dinncorebato.zfyr.cn
http://www.dinnco.com/news/158057.html

相关文章:

  • 学校网站建设的验收单北京做网站公司哪家好
  • 公司主页是什么意思北京网站优化推广公司
  • 网站地图好处hao123文件在哪里
  • 如何在自己网站上做支付宝怎么查百度搜索排名
  • 网站制作工具有哪些灰色关键词排名代做
  • 国外开源cmsseo全称是什么意思
  • 中山建设工程招聘信息网站找网站公司制作网站
  • 建一个网站难不难百度seo排名主要看啥
  • 网站改版要多少钱磁力宝最佳搜索引擎入口
  • 罗湖网站建设罗湖网站设计新手怎么做销售
  • 做网站公众号网站网址查询工具
  • 郑州网站开发hndlwx二十个优化
  • 上海网站设计制作报价持续优化完善防控措施
  • wordpress下不了插件seo优化外包公司
  • 自适应网站 seo怎么做朝阳seo推广
  • 代写网站建设合同网络营销产品推广方案
  • 怎样在我的世界做汽车视频网站短视频营销推广方案
  • 温州微网站制作公司哪家好seo关键词优化案例
  • 用php做网站平台推广是什么意思
  • 动态网站开发 教材昆山seo网站优化软件
  • 网站怎么做sem代发qq群发广告推广
  • phpweb成品网站建站超市系统如何推广网址链接
  • 太原加盟网站制作链接搜索引擎
  • 小说网站的会员充值是怎么做的网络营销渠道有哪三类
  • 洛阳网站建设启辰网络b2b电商平台有哪些
  • 做公众号的网站有哪些功能营销公司取名字大全
  • 网站公司后台网络推广平台有哪些渠道
  • 程序员为什么不敢创业做网站黑帽seo之搜索引擎
  • 深圳手机网站制作价钱手机百度
  • c 网站建设seo优化运营