首页> 中国专利> 单片机操作系统的模块化实现方法

单片机操作系统的模块化实现方法

摘要

本发明涉及一种单片机操作系统及实现方法,用于对主控系统与子系统组成的控制系统中的子系统进行控制,包括:设置系统调度,用于完成任务的调度功能,通过消息的触发对应用进程进行调度,同时完成存放消息的内存缓冲区的管理工作;设置中断处理,用于完成中断处理功能,通过内部时钟周期性地产生中断,在中断里对中断任务进行周期性调度;设置定时扫描,用于完成时钟管理功能,为用户提供定时和定时取消的服务;设置消息通讯,用于完成进程间的消息通讯,提供子系统内进程间的通讯及子系统与主控系统进程间的通讯。本发明降低了子系统的复杂程度,把操作系统和应用程序完全分离开来,大大提高了单片机汇编系统作为子系统控制的多级系统的效率。

著录项

  • 公开/公告号CN1558329A

    专利类型发明专利

  • 公开/公告日2004-12-29

    原文格式PDF

  • 申请/专利权人 中兴通讯股份有限公司;

    申请/专利号CN200410046460.4

  • 发明设计人 王永新;朱西延;

    申请日2004-06-09

  • 分类号G06F9/46;G06F9/48;G06F9/54;

  • 代理机构11006 北京律诚同业知识产权代理有限公司;

  • 代理人祁建国;梁挥

  • 地址 518057 广东省深圳市南山区高新技术产业园科技南路中兴通讯大厦A座6层

  • 入库时间 2023-12-17 15:47:27

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2014-08-06

    未缴年费专利权终止 IPC(主分类):G06F9/46 授权公告日:20070411 终止日期:20130609 申请日:20040609

    专利权的终止

  • 2007-04-11

    授权

    授权

  • 2005-03-02

    实质审查的生效

    实质审查的生效

  • 2004-12-29

    公开

    公开

说明书

技术领域

本发明涉及通信自动化和控制领域,具体涉及在单片机汇编操作系统中操作系统和应用进程的实现方式。

背景技术

在通信领域、自动化和控制领域中,系统的控制往往分为多级控制,而单片机例如8031/8051等的汇编系统又常用作子系统的控制,用来处理诸如单板级子系统的工作。在8031/8051子系统中,它的操作系统和应用程序结构安排是否合理对于提高子系统的安全性、可靠性起了重要的作用,同时也可以减少应用程序设计的复杂度,使得应用程序的实现更加简易,可读。

现有的8031/8051汇编系统,还没有一个现成的操作系统专门用于系统控制。整个子系统的控制全部由应用程序完成,一方面它要完成所有操作系统的功能,另一方面又要完成应用程序的功能,两者完全融合为一体。这样的实现方式增加了系统的复杂度,同时也不利于系统的扩充和应用。在一个普遍应用8031/8051汇编系统作为子系统控制的操作系统中,存在多个子系统,而每个子系统又必须完成一套完整的操作系统功能。如在一个采用8031/8051汇编系统作为子系统控制的交换机系统中,它的子系统类型很多:用户子系统、双音多频子系统、交换网子系统、多频互控子系统、中继子系统、测试子系统等,一方面这些子系统需完成的应用功能很复杂,另一方面它又要完成操作系统中时钟控制系统、内存管理系统、消息调度系统及子系统和主控系统进行消息通讯等功能。如果所有这些功能全部都由应用程序来完成,会使得应用程序非常复杂,很容易出错,同时对子系统的扩充也很麻烦,每增加一项子系统或子系统功能,都要对系统结构做出调整。另外对于维护也很难,毕竟系统太复杂了,它既有来自操作系统的,又有来自应用程序的。

发明内容

本发明的目的在于提供一种单片机操作系统的模块化实现方法,适合于所有子系统的独立的操作系统,同时给应用程序提供了标准的接口,使得应用程序只关注于具体应用的实现即可。

本发明的目的是这样实现的:

本发明公开了一种单片机操作系统的模块化实现方法,用于对主控系统与子系统组成的控制系统中的子系统进行控制,包括:

设置系统调度的步骤,用于完成任务的调度功能,通过消息的触发对应用进程进行调度,同时完成存放消息的内存缓冲区的管理工作;

设置中断处理步骤,用于完成中断处理功能,通过内部时钟周期性地产生中断,在中断里对中断任务进行周期性调度;

设置定时扫描步骤,用于完成时钟管理功能,为用户提供定时和定时取消的服务;

设置消息通讯的步骤,用于完成进程间的消息通讯,提供子系统内进程间的通讯及子系统与主控系统进程间的通讯。

所述设置系统调度的步骤包括:对系统环境进行初始化工作,对时钟数据区进行处理,根据消息及进程调度表对应用进程进行调度;

所述设置中断处理步骤包括:保存中断环境,根据中断任务周期性扫描控制表对任务进行调度,退出中断时恢复中断前的环境;

所述设置定时扫描步骤包括:根据进程控制进行定时器的设定,在每次中断处理中,简单地置一个调度标志;每次扫描定时数据区前,先检查该标志是否已置上,如已置上,则对该标志清0并对定时数据区进行扫描处理;否则不处理。

所述设置消息通讯的步骤包括:时钟级任务和基本级进程间进行通讯,基本级进程间相互通讯,子系统和主控系统进程间进行通讯;

系统处理时首先需要确定是子系统内进程间的通讯还是子系统和主控系统进程间的通讯。

所述初始化工作包括设置堆栈起始地址、中断定时系统的初试设置、寄存器组的设定、系统控制字的设定,建立消息调度队列、空闲内存管理队列、准备打包队列、消息包发送队列,初始化定时器数据区。

所述对时钟数据区进行处理包括:检查定时器定时是否到,如果是,则给设置定时器的进程产生定时消息。

所述定时消息被调度前,检查定时器数据区的校验值和当时定时器中的校验值是否相同。

所述调度进程表、周期性扫描控制表、中断任务调度表存储于与操作系统存储地址不同的存储空间。

所述的系统调度还包括应用进程执行完毕,将所述消息挂入空闲队列,并重新开始时钟数据区处理。

所述保存中断环境是采用压栈的方式,保存中断寄存器、中断向量、基本级操作选用的寄存器组,另外还需切换寄存器组,并重新设置中断时间,以备下次中断的产生。

所述周期性扫描控制表由多个字节组成,一个字节的一位代表一个需进行处理的任务。

所述中断任务包括每次中断扫描,只调度周期性扫描控制表的那个字节中需调度的任务,下一个中断到来时则扫描调度表中下一个字节中需调度的任务,对周期性扫描控制表进行循环调度。

所述对定时数据区进行扫描处理包括定时器加1操作,当定时器值满则根据数据区中保留的进程号产生超时消息,并将校验值带入产生的消息中以备处理。

所述时钟级任务和基本级进程间的通讯为单向的通讯方式,包括:系统申请一个空闲的内存区,在数据区中填入需接受该消息的进程、发送的消息类型、消息的长度和消息内容,并将该消息挂入消息调度队列,等待调度系统将该消息发送到相应的进程。

所述基本级进程间的相互通讯为双向通讯方式,包括:系统申请一个空闲的内存区,在数据区中填入需接受进程、发送进程、消息类型、消息的长度和消息内容拷贝到消息区中,并重新申请另一个新的内存区,将上个消息的地址存入消息内容区,将当前消息的地址作为消息内容保存下来,作为发送消息发送到负责打包、拆包的进程处。

所述子系统和主控系统进程间的通讯通过串口通讯或者采用与外部共享内存区的方式。

所述与外部共享内存区的方式包括两部分:

基本级的进程处理,用于将发送主控系统的消息内容进行打包以便在一个数据包中存放更多的消息;接受主控系统来的消息,对消息包进行拆包,并将消息发送到接受进程;

对共享内存区的读、写操作,用于完成和主控系统间消息数据包可靠性传输。

所述应用进程可通过调用操作系统提供的原语完成定时器的设定与取消、消息的发送与接收。

本发明降低了所述子系统的复杂程度,从功能和结构上把操作系统和应用程序完全分离开来,大大提高了普遍应用8031/8051等单片机汇编系统作为子系统控制的多级系统的效率。

附图说明

图1为本发明的各个系统模块示意图;

图2为本发明的调度系统模块的实现流程;

图3为本发明的中断系统模块的实现流程;

图4为本发明的定时系统模块的实现流程;

图5为本发明的定时系统模块中定时器设置流程;

图6为本发明的定时系统模块中定时器取消流程;

图7为本发明的通讯系统模块中时钟级任务和基本级进程间的通讯流程;

图8为本发明的通讯系统模块中基本级进程间的通讯和子系统内与主控系统内进程的通讯流程;

图9为图8中本发明对消息进行打包和拆包的流程。

具体实施方式

首先介绍8031/8051汇编系统中操作系统的实现原理,然后介绍提供给应用程序应用的接口和应用程序的结构。

图中涉及的步骤如下:

步骤21环境初始化化

步骤22对定时器数据区进行处理

步骤23判断调度队列是否为空

步骤24判断是否为超时消息

步骤25判断校验值是否正确    

步骤26取出队列中的消息,根据进程调度表进行调度

步骤27将消息归还空闲内存管理队列

步骤31保存中断环境

步骤32找到中断任务调度表的需处理的字节,准备处理第0位任务

步骤33判断当前任务是否需调度

步骤34取出中断任务调度表进行调度

步骤35判断是否所有任务全部调度

步骤36找任务控制字节中的下一位

步骤37通过弹栈恢复寄存器组、中断向量、中断寄存器、切换回原先的寄存器组

步骤38退出中断

步骤41判断定时标志是否置上

步骤42对该标志清查

步骤43判断当前数据区是否设置了定时

步骤44定时器定时值加1

步骤45判断定时时间是否满

步骤46产生超时消息,并将消息挂入消息调度队列

步骤47判断是否所有定时均处理

步骤48找到下一个定时器数据区

步骤51根据定时器找到该定时器的数据区

步骤52将定时器值取反后填入定时器值区域,并将设定定时器的进程号填入

步骤61根据定时器找到该定时器的数据区

步骤62将该定时器的定时器值区域清0,并将该定时器的校验码加1

步骤71申请一个空闲的内存区

步骤72在缓存区中填入需接受该消息的进程、发送的消息类型、消息的长度和消息内容

步骤73该消息挂入消息调度队列

步骤81判断是否是子系统内的消息

步骤82申请一个空闲的内存区,将接受进程、发送进程、消息类型、消息长度,消息内容拷入

步骤83该消息挂入消息调度队列

步骤84申请一块空闲内存区,将接受进程、发送进程、消息类型、消息长度和消息内容填入

步骤85重新申请另一个新的内存区,将当前消息的地址作为消息内容保存下来,作为发送消息发送到负责打包、拆包的进程处

步骤91判断当前消息类型

步骤92将消息挂入准备打包队列

步骤93判断当前是否允许打包

步骤94置不允许打包,并申请一空闲内存区

步骤95从准备打包队列中取出消息,并进行打包,归还内存缓冲区

步骤96判断包是否已满

步骤97判断准备打包队列是否为空

步骤98判断包是否可装下当前消息

步骤99将数据包挂入消息包发送队列

步骤101将消息包拆包,并挂入消息调度队列

步骤102判断当前是否允许打包

步骤103置不允许打包,并申请一空闲内存区

步骤104从准备打包队列中取出消息,并进行打包,归还内存缓冲区

步骤105判断包是否已满

步骤106判断准备打包队列是否为空

步骤107判断包是否可装下当前消息

步骤108将数据包挂入消息包发送队列

一、操作系统的构成

操作系统分为以下几个方面,见图1:调度系统14、中断系统11、定时系统13、通讯系统12,下面会详细介绍每个系统的实现原理。

8031/8051汇编系统不同的指令执行时间不同,一般按照双字节指令执行时间来计算,每个指令执行需两纳秒,如中断处理按十毫秒计算,即所有的中断任务处理必须在十毫秒内完成,也就是说最多可执行五千条指令,所以应用处理必须尽可能快,操作系统的处理也这样。因此,下面系统各功能的实现均需考虑执行的效率,特别是中断处理不能占用太多时长。

1、调度系统:

系统中对所有程序的处理分成两个优先级别:一个是处理消息的进程,它的优先级别低,称之为应用进程基本进程15,它可以被高优先级的时钟任务中断;另外一个是在时钟中断中处理的程序,它的优先级别高,称之为应用进程中断任务16,见图1。

在8031/8051汇编系统中,系统所做的工作包括两方面:一方面对硬件进行周期性的扫描,将扫描得到内容进行处理并上报主控系统,另一方面接受主控系统传递下来的消息,将消息传送到相应的应用进程去执行。对所有的数据通讯采用消息传递的处理方式,而不采用共享数据区的方式。对在基本级应用进程间的通讯或同主控系统进程间的通讯均采用消息通讯的方式;而在中断处理中,扫描硬件所得到的信息也通过消息的方式发送到相应的基本级进程进行处理。

系统调度首先对环境进行初始化工作,这其中包括设置堆栈起始地址、中断定时系统的初试设置、寄存器组的设定、系统控制字的设定,建立消息调度队列、空闲内存管理队列、准备打包队列、消息包发送队列,初始化定时器数据区,步骤21。初始化工作完成后,对定时器数据区进行检查,步骤22,用以发现是否有定时器定时到,如果有,则给设置定时器的进程产生定时消息。随后检查消息调度队列中是否有消息存在,如有则进行调度,需根据进程调度表调度相应的进程,并把该消息通过寄存器传送给应用进程进行处理,步骤23。还包括判断该消息是否为超时消息,步骤24。在应用进程执行完毕后,将该消息挂入空闲内存管理队列,并重新开始扫描定时器数据区,步骤27。对定时消息进行调度前,步骤26需进行特别的检查,检查定时器数据区中定时器的校验值和当前定时器中的校验值是否相同,步骤25,以防止定时消息挂入消息调度队列后用户又取消了该定时器。

在不同的子系统中,系统调度的应用进程不同,因此将进程调度表放在和操作系统不在同一处的程序存储空间,从而使得操作系统具有独立性。

2、中断系统:

在中断处理中,首先要保存中断环境,步骤31,使得在中断处理结束退出中断时,能够继续进行中断前的处理。环境的保存采用压栈的方式,要保存的中断环境包括:中断寄存器、中断向量、基本级操作选用的寄存器组,另外还需切换寄存器组(即在中断处理中和调度进程处理中采用不同的寄存器组),并重新设置中断时间,以备下次中断的产生。

在上述环境准备好以后,按照周期性扫描控制表进行调度。周期性扫描控制表是这样的一种表,它由多个字节组成,一个字节的一位代表一个需进行处理的任务,这样共有八个任务可进行处理。相应的存在一个中断任务调度表,对这8个任务可进行调度。每次中断扫描,只调度周期性扫描控制表的那个字节中需调度的任务,下一个中断到来时则扫描调度表中下一个字节中需调度的任务,对周期性扫描控制表进行循环调度。对每个任务的处理并不是每次都需要进行调度,而是根据实际的需要,对表中的每个任务的调度识别,用“0”和“1”来进行区分,某一比特为“0”,则该比特所对应的任务在本次中断中无需调度,而为“1”的比特所对应的任务则需调度。这样可以根据需要控制不同任务的调度周期,如每次中断调度一次、每隔一个中断调度一次、每隔四个中断调度一次、每隔十个中断调度一次等。

中断任务处理的周期性扫描控制表可以是如下结构:第7   6     5     4     3     2     1     0位

  0  0  0  0  0  0  1  1  0  0  0  0  0  1  0  1  0  0  0  0  1  0  0  1  0  0  0  1  0  0  0  1  0  0  0  0  0  0  1  1  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0  1  0  0  0  0  0  0  1  1  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0  1  0  0  0  0  0  1  0  1  0  0  0  0  0  0  1  1  0  0  0  1  0  0  0  1  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0  1
 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1

上面是20个字节,每个字节有8位,代表可处理8个时钟级中断处理任务。其中:

第0个任务每个中断均需调度一次;

第1个任务每4个中断调度一次;

第2个任务每20个中断调度一次;

第3个任务每10个中断调度一次;

第4个任务每20个中断调度一次;

不存在任务5到任务7。

在退出中断前,根据压栈的先后顺序进行相反的弹栈处理,先后弹出寄存器组、中断向量、中断寄存器、切换回原先的寄存器组,步骤37。所有中断任务处理完毕后,需退出中断,步骤38。具体过程见图3。

周期性扫描控制表和中断任务调度表同样由于不同的子系统而不同,也和操作系统放在不同的程序存储空间,从而使得操作具有独立性。

3、定时系统:

采用定时数据区管理的方式来进行控制,每个定时器对应于固定的定时数据区,进程需进行哪个定时器的设定由进程控制。每个定时器数据区安排了以下内容:两个字节的定时设定值保留区,一个字节用以记录设定定时器的进程号,还有一个字节用来进行校验。

在进行定时设定时,根据定时器号找到相应的定时器数据区,步骤51,记录下用户设定的时长,同时记录下当前的进程号。由于8031系统的单字节运行方式,系统执行减一操作比较困难,因此将定时值取反后放入定时设定值保留区,步骤52,以便在扫描定时器数据区时,执行加1的操作即可,见图5。

在进行定时取消操作时,根据定时器号找到相应的定时器数据区,步骤61,将定时设定值保留区清零,同时将该定时器数据区的校验值加1,步骤62,见图6。

定时器数据区的检测原理上应该在中断里完成,因为中断的周期性是有保障的,它是周期性地扫描定时器数据区,并对设置定时的定时器执行加1的操作,当定时器满时则产生超时消息。而这里定时器数据区的调度由调度系统进行调度,同样是每个中断周期调度一次,中断处理只是在每次中断中置一个需对定时器数据区进行调度的标志。这样做的目的是为了减少中断任务执行所需的时间。需扫描所有的定时器数据区,对定时设定值保留区中为“0”的定时器不进行处理;对不为0的定时器进行加1的操作,如定时器值满则根据数据区中保留的进程号产生超时消息,并将校验值带入产生的消息中以备处理。见图4。

4、通讯系统:

由于本系统的设计采用消息驱动的方式,因此进程间的通讯就是一个很重要的内容。进程间的通讯分为以下几种:时钟级任务和基本级进程间的通讯、基本级进程间的相互通讯、子系统和主控系统进程间的通讯。时钟级任务和基本级进程间的通讯是一种单向的通讯,时钟级任务可以向基本级进程发送消息,反之则不行。其它两种通讯则是双向的。子系统和主控系统间的通讯一般有两种方式,一种是通过串口通讯的方式,另一种是采用与外部共享内存区的方式,即子系统向共享内存区中写入数据,主控系统可以读取该数据。而主控系统同样可以向该共享内存区中写入数据,而子系统进行读取。下面对子系统和主控系统间进程通讯的设计就采用共享内存区的方式进行说明。

消息区的管理分成系统区和用户数据区,系统区用来控制消息的流程,它包括接受消息的进程号、发送消息的进程号、发送的消息类型、发送消息的长度。用户数据区则包含用户需发送的信息。

时钟级任务和基本级进程间的通讯采用了一种单独的通讯方式,它通过寄存器将需发送的信息带入。见图7,系统首先申请一个空闲的内存区,步骤71,在数据缓存区中填入需接受该消息的进程、发送的消息类型、消息的长度和消息内容,步骤72,并将该消息挂入消息调度队列,步骤73,等待调度系统将该消息发送到相应的进程。

基本级进程间的相互通讯和子系统与主控系统内进程的通讯采用了另外一种控制方式。见图8,系统处理时首先需要确定是子系统内进程间的通讯还是子系统和主控系统进程间的通讯,步骤81。如果是子系统内的通讯,它的处理比较简单,和时钟级任务和基本级进程间的通讯相同,系统首先申请一个空闲的内存区,在数据区中填入需接受消息的进程号、发送消息的进程号、发送的消息类型、消息的长度,并将消息内容拷贝到消息区中,步骤82,并将该消息挂入消息调度队列,步骤83,等待调度系统将该消息发送到相应的进程。

如果是子系统和主控系统间的通讯,它的处理比较复杂。以共享内存区方式的通讯方式进行说明。它的处理分成两部分,一部分是基本级的进程处理,它负责对需发送到主控系统的消息内容进行打包,以便在一个数据包中能够存放更多的消息;接受主控系统来的消息,对消息包进行拆包,并将消息发送到接受进程;另外一方面是对共享内存区的读、写操作,它负责完成和主控系统间消息数据包可靠性传输,这部分的实现是在时钟中断里完成的,是一个中断级的任务。

如果消息是发往主控系统的,首先用户申请一块空闲内存区,将需要接受该消息的进程号、消息类型、消息长度和消息内容填入,步骤84。

由于基本级的进程优先级别相同,负责打包、拆包的进程占用时间的长短不会影响到用户进程的处理。在这里,重新申请一个新的内存区,将当前消息的地址作为消息内容保存下来,作为发送消息发送到负责打包、拆包的进程处,步骤85。

在负责打包、拆包的进程处,首先检查消息的内容,步骤91,如果是发送消息,则根据和主控系统的约定,对消息进行打包处理,步骤92--98,可同时将多个消息打入一个数据包中,并挂入消息包发送队列,步骤99,见图9左半部分。如果是接受消息,则对数据包进行分拆,分拆成一个一个的消息挂入调度队列等待调度,步骤101--108,见图9右半部分。

在时钟级的发送接受任务处,采用1比特的滑动窗口进行数据包的发送、接受控制,将消息包发送队列中的数据包写入共享内存区中,同时读取共享内存区中的数据,在完成读取校验后把该数据包作为接受消息发送到负责打包、拆包的进程处,等待对消息进行拆包处理。

二、应用系统的构成

由于应用进程是采用消息驱动的方式进行工作的,也就是说接受了什么样的消息进行什么样的处理。在对消息处理时,可以按照进程的状态进行划分,即在特定的状态下只处理特定的消息,消息处理完后迁移到下一个状态,再等待消息进行处理,对在该状态下的其它消息不进行处理。

应用进程可通过调用操作系统提供的原语完成这些有关的功能,这些功能包括定时器的设定与取消、消息的发送与接受等。对系统提供的这些功能的调用通过直接调用相关原语的地址来实现的。

8031/8051汇编系统提供了64K的程序存贮空间,通过编译应用程序,可以知道应用程序的大小。将应用程序安排在不同的存储空间,操作系统直接调用存储空间的地址,从而将各个应用程序完全分开,进行单独编译与调试。

时钟级的发送接受任务处,采用1比特的滑动窗口通讯协议进行数据包的发送、接受控制。对于1比特的滑动窗口通讯协议就不详细介绍了。只有一点需说明,在数据包发送成功后,需将当前允许打包标志置上。

对应用进程调用系统提供原语的方式,是通过直接调用相关原语的地址来实现的。

如下定义所示:

SEND            EQU     0050H

OUTPUT          EQU     0053H

SET             EQU     0056H

RESET           EQU     0059H

GETBUF          EQU     005CH

而在操作系统的相应地址处则作如下处理:

ORG       0050H

LJMP      SEND

LJMP      OUTPUT

LJMP      SET

LJMP      RESET

LJMP      GETBUF

这样一来,可以使得各个应用程序完全分开,进行单独编译与调试。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号