基于时间系统的状态机

摘要:
1根据各任务的周期执行时间确定轮询间隔,注意2用一个定时器,基准定时为各任务的最小公倍数;软件计数器累加从而触发各任务标志3主函数中分别操作:Toggle_Task();//设置各标志,这里可以是非时间触发的事件slect_task();//对任务标志进行字节解码:指针函数指向不同的具体函数如果不是空函数就用指针函数调用各具体函数。要注意异步事件时的现场保护。3基于时间片和异步事件的任务触发要仔细分析优先级,对多事件触发如何处理(可以做变通方法。

1根据各任务的周期执行时间确定轮询间隔,注意(轮询时间间隔只能比任务执行时间稍长,但一定不能断)

2 用一个定时器,基准定时为各任务的最小公倍数;软件计数器累加从而触发各任务标志(对任务进行字节编码)

3主函数中分别操作:Toggle_Task();//设置各标志,这里可以是非时间触发的事件

slect_task();//对任务标志进行字节解码:指针函数指向不同的具体函数

如果不是空函数(状态陷阱)就用指针函数调用各具体函数。

注意:

1 状态机编程思想要贯彻整个设计,即分层状态机,每个状态又分成各子状态。

2 各状态函数中的状态指示要用静态变量,即便被中断断开,下次还可以接着之前的状态继续进行。要注意异步事件时的现场保护。

3基于时间片和异步事件的任务触发要仔细分析优先级,对多事件触发如何处理(可以做变通方法。)

int main(void)
{
初始化。。。
while(1)
{
switch(i)
{
case 0:if(TaskFlag.Flag0 == 1) Task0();break;
case 1:if(TaskFlag.Flag1 == 1) Task1();break;
case 2:if(TaskFlag.Flag2 == 1) Task2();break;
case 3:if(TaskFlag.Flag3 == 1) Task3();break;
case 4:if(TaskFlag.Flag4 == 1) Task4();break;
case 5:if(TaskFlag.Flag5 == 1) Task5();break;
default: i = 0;break;
}
if((++i)>=Task_Num) i = 0;
}
}

void TIM3_IRQHandler(void) //TIM3 中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查 TIM3 更新中断发生与否
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除 TIM3 更新中断标志
CTimer++;//系统时间累加
TaskFlag.Flag0 = 1;
}
}

void Task0(void)
{
TaskFlag.Flag0 = 0;
if((CTimer & BITMAK_TASK1) == 0x01)//20ms 任务1
{
TaskFlag.Flag1= 1;
}

f((CTimer & BITMAK_TASK2) == 0x02)//20ms 任务1
{
TaskFlag.Flag2= 1;
}

。。。

}

=========================架构2=============================

#define VOID_FUNC ((void *)0)

#typedef void pFunc_type(void)

pFunc_typepresent_task =VOID_FUNC;

typedef union TASKFLAG_BITS{
Uint8 taskall;
struct{
Uint16 task0:1;
Uint16 task1:1;
Uint16 task2:1;
Uint16 task3:1;
Uint16 task4:1;
Uint16 task5:1;
Uint16 task6:1;
Uint16 task7:1
}Flag;
}TaskFlag_Bits,*TaskFlag_Bits_Pt;

TaskFlag_Bits TaskFlag;

int main(void)
{
初始化。。。
while(1)
{

Task_Trigger();//任务触发
Task_Select();
if (present_task != VOID_FUNC)
present_task();
}

}

void Task_Trigger(void)

{

/*至少有一个初始引导条件*/

if(某个条件具备)/*时间到或者异步事件触发*/

{ 

Taskflag.Flag.task1=1;

}

if(某个条件具备)

{   

Taskflag.Flag.task2=1;

}

。。。。。

}

void Task_Select(void)

{

if (Taskflag.Flag.task0)
{
present_task = Task0;
return;
}

if (Taskflag.Flag.task1)
{
present_task = Task1;
return;
}

....

present_task = VOID_FUNC;/*缺省*/

}

免责声明:文章转载自《基于时间系统的状态机》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇微信开放平台注册 步骤音视频入门-18-手动生成一张GIF图片下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

HBase丢失数据的故障和原因分析

hbase的稳定性是近期社区的重要关注点,毕竟稳定的系统才能被推广开来,这里有几次稳定性故障和大家分享。第一次生产故障的现象及原因现象: Java代码 1hbase发现无法写入 2通过hbck检测发现.META.表中出现空洞,具体log是:;Chainofregionsintable...isbroken;edgesdoesnotcontain......

P4: Programming Protocol-Independent Packet Processors

P4: Programming Protocol-Independent Packet Processors 摘要 P4是一门高级语言,用于编程与协议无关的数据包处理器。P4与SDN控制协议相关联,类似与OpenFlow。当前,OpenFlow明确指定了运行的协议头。这个设置在几年内,从12个字段增长到41个字段,并且增加了协议头的复杂性,却没有提供应有的...

FPGA综合工具--Synplify Pro的常用选项及命令

最近要用到Synplify,但以前没使用过,无基础,找到一篇帖子,隧保存下来。 本文转自:http://blog.sina.com.cn/s/blog_65fe490d0100v8ax.html Synplify 使用过程中最常用的选项及命令的介绍。一、 状态机相关(1)FSM Compiler Option  FSM Compiler是一个全局选项。勾选...

状态机设计——从简单的按键消抖开始

  目前笔者正在接受明德扬FPGA网上培训班的培训,讲的内容非常适合新手,且以练习和互动答疑的教学模式让我学到了很多东西。由于是根据自身时间安排进度的,所以战线拉的比较长,发现做些设计总结非常重要,可以帮助自己理清思路,同时也能得到很好的复习。   之前一直在做altera FPGA的相关学习,对xilinx还不是很熟悉,借着这个契机,将比较基础常用的设计...

WF Workflow 状态机工作流 开发

概述 工作流是对业务流程的建模,当我们设计工作流的时候,我们首先要分析业务处理过程中要经历的步骤。然后,我们就可以利用WF创建工作流模型来模拟业务的处理过程。 我们知道,WF包含两种类型的工作流:顺序工作流和状态机工作流。顺序工作流提供了一系列有组织的步骤,一般情况下,步骤是逐一执行的。可能有的步骤需要等待某些事件的发生才可以继续执行,但通常情况下顺序工作...

C#异步编程之(三):深入 Async 和 Await 的实现及其成本

From: http://msdn.microsoft.com/zh-cn/magazine/hh456402.aspx异步性能:了解 Async 和 Await 的成本Stephen Toub 异步编程长时间以来一直都是那些技能高超、喜欢挑战自我的开发人员涉足的领域 — 这些人愿意花费时间,充满热情并拥有心理承受能力,能够在非线性的控制流程中不断地...