您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 利用“时间片轮询法”处理串口发送
利用“时间片轮询法”处理串口发送就地控制器对于三相VBE控制器充当“主机”角色,它通过串口3、4、5要定时、轮流地去查询A、B、C三相VBE控制器的各种状态和参数等。由于需要定时、轮流地查询,所以在本程序中使用了“时间片轮询”这一程序结构。本文将对该程序结构作一详细说明。第一步:定义一个枚举类型,该类型说明了有哪些任务和任务的个数,定义如下所示:typedefenum_TASK_LIST{TAST_UART3_Tra,//串口3发送TAST_UART4_Tra,//串口4发送TAST_UART5_Tra,//串口5发送TASKS_MAX//总的可供分配的定时任务数目}TASK_LIST;通过上面的枚举类型定义,可以知道我们的任务有三个,分别是串口3、4、5的发送,注意这里定义的任务名称在程序中没有其它的用途。该类型的最后一项是任务个数,在这里为3。第二步:定义一个结构体类型,该结构体定义了一个任务结构,定义如下所示:typedefstruct_TASK_COMPONENTS{unsignedintRun;//程序运行标记:0-不运行,1运行unsignedintTimer;//计时器unsignedintItvTime;//任务运行间隔时间void(*TaskHook)(void);//要运行的任务函数}TASK_COMPONENTS;//任务定义该任务有四个参数,具体功能如注释中所示,这里不再做详细介绍。第三步:定义任务变量,并初始化。代码如下所示:staticTASK_COMPONENTSTaskComps[3]={{0,600,600,UART3_Tra_Process},//串口3发送处理函数{0,400,600,UART4_Tra_Process},//串口4发送处理函数{0,200,600,UART5_Tra_Process},//串口5发送处理函数};三个任务在初始状态都是处于不运行状态,在200毫秒后串口5发送处理函数被调用,再过200毫秒(即上电初始化后的第400毫秒后),串口4发送处理函数被调用。同理600毫秒后串口3发送处理函数被调用。三个任务函数每两次被调用的时间间隔都是600毫秒。这样就实现了向A、B、C三相VBE轮流发送报文的操作,轮流间隔时间为200毫秒。第四步:在系统时钟中断(本程序为1毫秒中断)中调用计时任务标志处理函数。函数代码如下所示:voidTaskRemarks(void){unsignedinti;for(i=0;iTASKS_MAX;i++)//逐个任务时间处理{if(TaskComps[i].Timer){TaskComps[i].Timer--;if(TaskComps[i].Timer==0){TaskComps[i].Timer=TaskComps[i].ItvTime;TaskComps[i].Run=1;//任务可以运行}}}}该函数在毫秒中断中被调用,轮流扫描各项任务,当每项任务的计时器不为0时,则对该计时器减1。直到减至0时,重新给计时器赋值,且置运行标志位为1。第五步:在主循环中调用任务处理函数。函数代码如下所示:voidTaskProcess(void){unsignedinti;for(i=0;iTASKS_MAX;i++)//逐个任务处理{if(TaskComps[i].Run){TaskComps[i].TaskHook();TaskComps[i].Run=0;}}}该函数在毫秒中断中被调用,轮流扫描各项任务。当任务运行标志为1时,执行对应任务函数,且清零任务运行标志。结语:以上就是“时间片轮询”程序架构的所有内容,该程序结构紧凑、清晰、可移植性好、易于修改,在做分时多任务处理的程序中都可以使用。
本文标题:利用“时间片轮询法”处理串口发送
链接地址:https://www.777doc.com/doc-2608904 .html