一种经典的DOS程序框架_第1页
一种经典的DOS程序框架_第2页
一种经典的DOS程序框架_第3页
一种经典的DOS程序框架_第4页
一种经典的DOS程序框架_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

经典DOS程序框架上市时间:02008-7-25 9336363363369002阅览数: 3077件本文介绍了面向事件的通用嵌入式系统应用方案,该方案可满足intelligent测量和控制设备、POS终端产品、行业自动化、网络通信管理等领域广泛使用的大多数中低价嵌入式系统要求。采用嵌入式网络模块的客户可以在此基础上直接进行应用功能的软件规划和实施,大大节省应用程序开发时间,同时确保应用程序的高可靠性。这个应用程序方案的核心是操作简单的作业命令队列,以实现各种应用程序功能。下图是此方案的典型流程块图。1、系统进程概览上面的图表说明了三个流程:程序代码流程、操作命令(也称为事件)流程和数据流程,下面简要介绍。流程流应用程序启动后,首先执行必要的程序初始化配置以进入系统核心代码。核心程序接着读取系统工作队列中的事件代码,然后根据代码内容转到相应的程序功能模块。不同的程序功能模块对应于不同的任务,即图中所示的任务1、任务2、任务n等。这些任务代码的特点之一是通过内部状态机机制防止程序阻塞,程序快速返回到系统任务调度单元,从而实现任务之间的切换。任务划分的原则通常根据应用功能或层次进行划分,如任务1处理原始数据,任务2将处理的结果数据发送到网络,任务3备份数据。要提高系统对事件的响应速度,每个操作的设计时间不应太长。对于大多数内建系统应用程式,您可以在100毫秒内控制作业执行时间,并在内部设定状态机器,以解决作业执行时间较长的功能。命令流系统命令也称为系统事件,可以在系统中的多个设备上生成,可以是系统中预定的中断程序、应用程序特定的硬件中断程序和单独的任务功能程序模块。此模块根据自身的状态生成所需的事件,并将这些事件入队到系统作业队列中。进入系统工作队列的事件是完全异步的,按时间顺序排序,由系统核心代码统一读取,并启动相应的操作模块以处理该事件,这称为事件驱动机制。在编程中采用基于事件的直接优点是减少任务之间的结合性,提高代码的可靠性和可维护性。命令通常可以定义为枚举变量,可以考虑命令参数段以存储多个参数或字符串。系统任务队列是典型的FIFO数据结构,提供中断程序和向一般任务模块发送事件的API函数。计划任务生成器是加载到系统计划中断中的代码,在DOS系统中,计划事件通常可以通过系统中的其他计时器中断实现,对于典型嵌入式应用程序,最小计划事件不能小于5毫秒。否则,CPU开销将增加到无为,从而降低系统性能。通常,您可以在命令定义中定义IDLE或NOP命令,并将常规数据处理放入IDLE任务,或确定是否存在键盘、是否存在网络数据等,并将开始相应处理所需的事件发送到系统工作队列。数据过程每个任务模块的主要功能之一是对所有级别的应用数据执行必要的处理,并配置新数据。典型的数据处理可以是:以帧格式分析串行端口上的数据,提取相关数据,即典型的通信协议分析。将AD收集的原始数据作为一种统计处理提取要素数据。读取数字输入状态并执行必要的处理。读取网络消息并执行必要的应用层协议分析应用数据存储文件、文件数据处理等由于每个作业执行机会都有一定的不确定性,因此需要数据的特定缓冲区,并且通常在典型应用程序中按顺序执行数据处理,因此数据缓冲区的结构通常使用FIFO数据结构,缓冲区中的数据单元可以是简单的字节、单词或复合数据结构。在英国生成程序中,串行端口的数据缓冲区是FIFO数据结构,其中数据单位为一个字节,FIFO结构的数据缓冲区也称为环缓冲区。一个任务是数据处理,另一个任务是数据传输,多个任务共享单个数据单元,通过信号灯设置方法,可以确保数据单元的完整性,并可以考虑多个数据单元的FIFO数据结构。可以在单个操作中处理对数据响应时间有严格要求的应用程序,也可以处理数据收集处理和网络通信的整个过程。以下是实施上述方案的关键代码的说明。强烈建议用户在阅读本文之前,对受孕嵌入式模块的功能测试程序有基本的了解。2、主要程序代码分析使用主流程和应用程序#include stdio.h /包含必要的c执行阶段#include dos.h# include ETR _ TCP . h /ying Chuang TCP/IP库# include cmdrive.h/定义事件驱动APIint SysInit();/定义系统初始化函数void sys exit();/系统关闭处理Int main()Int i1、len、State、ExitFlag/本地变量CMD CmdCode/系统命令枚举变量char cmd par20;/系统命令中包含的参数i1=SysInit();/先初始化for(exit flag=0;)/系统主循环reload wdt();/加载watchdogstate=NET _ Running();/管理网络链接CmdCode=CmdQueue。get cmd(cmd par);/从系统工作队列读取命令交换机(CmdCode)事例nop3360/验证键盘、网络、串行端口等的一般处理NetPackagePro();/执行所需的网络低级处理/从网络接收数据后,启动该任务进行处理if(nethasdata()cmdl queue . push bcmd(task 1);BreakCase TASK1:I1=Task1。do();/也可以是常规c函数BreakCase TASK2:I1=Task2。do();If(i1) CmdQueue。push cmd(task 2);/发送命令以继续处理任务BreakCase TASK3:I1=Task3。do();Breakdefault : exit flag=1;/非法命令,退出if(exit flag)break;sys exit();return 0;系统初始化程序SysInit()初始化系统提供的资源(如初始化网络、初始化串行端口、初始化液晶屏),然后初始化定义的功能对象,最后安装中断服务程序,最后启动预定的任务生成器。因此,SysExit()函数主要卸载中断,并释放分配给初始化的动态buffer。主环路上的NOP处理以网络通信为例,允许客户在实际应用程序设计中安排其他必要的处理,如键盘处理、串行数据处理等。对于应用程序级任务,Oracle建议使用c中的类。每个类对象必须包含两个或多个公共函数Init()和Do()函数,主函数可以通过Do()函数的返回值来确定处理是否完成。如果未完成,则可以运行命令,然后启动此函数以进行后续处理。上述程序将处理任务TASK2。使用c中的类对象实现应用程序功能允许通过专用变量定义处理状态,在交互通信处理(如运行串行设备、上载FTP文件等)中尤其有用。如果处理程序需要等待对端响应,程序将返回系统控制以进行其他处理,下次重新进入操作模块时,程序可以根据当前状态继续进行相应的处理。这称为状态机机制。以下是应用操作的类定义:#define ST0 0# define st1# define st2#define ST3 3Class AppTASKInt State/个人状态变量int dost 0();/每个阶段处理int dost 1();int dost 2();int dost 3();Public:int Init();初始化包含/State的变量int Do();/任务处理函数要在类成员函数Do()中实现特定状态传输,请执行以下操作:Intapp任务3363603360 do()Int i1i1=1;/返回值=1:处理未完成。=0:处理已完成Switch(状态)Case ST0:dost 0();State=ST1/转到下一个状态BreakCase ST1:dos t1();State=ST2/转到下一个状态BreakCase ST2:dost 2();State=ST3/转到下一个状态BreakCase ST3:dost 3();State=ST0/返回初始状态i1=0;/处理完成!BreakReturn i1在整个程序方案中,核心代码是实现系统的事件驱动功能,定义为c类,如下所示:#if!Defined(_CMDRIVE_H)#define _CMDRIVE_H#ifdef _cplusplus#define _CPPARGS.#else#define _CPPARGS#endif#include dos.hEnumcmd nop,task1,task2,task3,exit ;/可以根据应用程序定义更多命令#define MaxCmdStack 400 /定义系统工作队列的长度#define PARLEN 14 /每个命令中参数的长度类taskqueueStatic unsigned int PutIdx/CmdBufStatic unsigned int GetIdx/逻辑环缓冲区,即FIFO数据结构static CMD CmdBufMaxCmdStack;static char cmd parmaxcmdstackparlen;Static struct time OldTime静态结构日期OldDateStatic unsigned int TickCount/计时计数Static unsigned int TickSize/最小计时间隔,自适应,初始值确定0static void interrupt int1c _ handler(_ _ CPP margs);/通过INT 1C实现预定任务生成器static int ISR _ push bcmd(cmd new cmd,char * PPAR=null);/在中断程序中使用Public:task queue(); task queue();CMD get CMD(char * pPar=NULL);/读取当前队列中的命令Int pushbcmd (cmd newcmd,char * PPAR=null);/在系统工作队列中填充新命令void start queue();/启动定期任务生成器void stop queue();/关闭定期任务生成器Extern class TaskQueue CmdQueue/cmdrive.cpp中定义的类变量的实例#endifTaskQueue类定义包含三个核心API函数,用于实现工作队列和计划的工作发生:从cmd task queue :3360 get cmd(char * PPAR)/FIFO读取命令CMD CmdCodeIf(GetIdx!=PutIdx)disable();CmdCode=(CMD)CmdBufGetIdx;If(pPar!=null) memcpy (PPAR,cmddar getidx,parlen);GetIdx=(GetIdx 1)% MaxCmdStack;enable();Return CmdCodeReturn NOP/return=-1: command aborted/=0: command pushed将命令填充到int task queue 33603360 push bcmd(cmd new cmd,char * PPAR)/作业队列中Unsigned int Idxif(GetIdx=0)Idx=MaxCmdStack-1;else Idx=get Idx-1;disabl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论