一种处理器程序调度方法及装置的制作方法

文档序号:6331865阅读:153来源:国知局
专利名称:一种处理器程序调度方法及装置的制作方法
技术领域
本发明涉及软件开发领域,尤其涉及8位、16位等中低端处理器程序开发中的程 序调度方法及装置。
背景技术
处理器,一般有高端和低端之分。高端处理器,例如高端单片机,高端单片机的系 统资源丰富,一般移植有操作系统。低端处理器,例如8位、16位等中低端单片机,中低端单 片机的系统资源有限,如果移植操作系统,由于操作系统占用大量的系统资源,使得单片机 执行效率低下,甚至不能运行。以中低端单片机为例,现有的做法是,在单片机程序中设置一个主程序,主程序中 设置一个无限循环的main函数,此main函数实现单片机的所有功能。采取这种方式的缺陷是,一个无限循环的main函数完成单片机程序的所有功能, 使得程序的结构性变差,尤其当单片机的功能较多,程序较大时,几乎没有什么结构性,并 且,程序员想要维护或修改单片机程序时,也会变得很困难。同时,这种方式的单片机执行 效率也很低,因为main函数采用自上而下的执行机制,这种机制的缺点在于,不知道能实 现特定功能的子函数在哪里,只能从main函数的第一条语句开始执行,直到触发到期望的 子函数,才执行子函数,实现特定的功能。如果实现特定功能的子函数在main函数的尾部, 这将是一件十分耗时的事情。因此,现有技术中,中低端单片机程序存在的缺陷是结构复杂,执行效率低。

发明内容
本发明要解决的主要技术问题是,提供一种处理器程序的调度方法和装置,采用 该方法和装置能提高处理器程序的结构性,并且执行效率高。为解决上述技术问题,本发明提供一种单片机程序调度方法,包括在处理器程序中设置至少一个用于实现预定功能的任务函数,并为每一个任务函 数配置任务ID ;设置消息队列,所述消息队列中的每一条消息包括一任务ID和传送数据指针;提取消息队列中的消息,根据消息中的任务ID查找对应的任务函数,并把消息中 的传送数据指针传递给任务函数,调度任务执行操作。在本发明的一优选实施例中,处理器为单片机。在本发明的一优选实施例中,消息还包括消息ID,根据消息中的任务ID查找对应 的任务函数后,把消息中的消息ID和传送数据指针传递给任务函数,调度任务函数执行操作。在本发明的另一实施例中,消息队列包括中断消息队列和任务消息队列,中断消 息队列的优先级高于任务消息队列,提取消息队列中的消息具体包括判断中断消息队列 是否有消息,如有,则从中断消息队列取消息,如否,则判断任务消息队列是否有消息,如
3有,则从任务消息队列中取消息,如否,则调用钩子函数。进一步地,消息队列为环形队列,提取消息队列中的消息时,按先入先出的原则提 取消息队中的消息。本发明还公开了一种处理器程序调度装置,包括任务函数模块,用于在处理器程序中设置至少一个用于实现预定功能的任务函 数,并为每一个任务函数配置任务ID ;消息队列模块,用于设置消息队列,消息队列中的每一条消息包括一任务ID和传 送数据指针;发送模块,用于提取消息队列中的消息,根据消息中的任务ID查找对应的任务函 数,并把消息中的传送数据指针传递给任务函数,调度任务函数执行操作。在本发明的一种优选实施例中,处理器为单片机处理器,在本发明的一种优选实施例中,消息还包括消息ID,所述根据消息中的任务ID查 找对应的任务函数后,把消息中的消息ID和传送数据指针传递给任务函数,调度任务函数 执行操作。在本发明的另一实施例中,消息队列包括中断消息队列和任务消息队列,中断消 息队列的优先级高于任务消息队列,所述提取消息队列中的消息具体包括判断所述中断 消息队列是否有消息,如有,则从所述中断消息队列取消息,如否,则判断所述任务消息队 列是否有消息,如有,则从所述任务消息队列中取消息,如否,则调用钩子函数。本发明的有益效果是处理器包括至少一个任务函数,提高了程序的结构性,使得程序更利于程序员维 护或修改,针对特定任务函数的修改不会影响其它的任务函数。同时,将包括任务ID和传 送数据指针在内的消息作为触发任务函数执行的触发机制,提高了执行效率,即通过任务 ID(任务号)索引对应的任务函数,通过传递传送数据指针给任务函数的方式完成任务函 数的运行,提高了单片机的执行效率。一种优选的方式中,消息包括消息号,在向任务函数传递传送数据指针时,传递消 息ID(消息号)给任务函数,由消息ID更精确的索引任务函数将要执行的操作,进一步的 提高程序的执行效率。只是消息ID、任务函数ID和传送数据指针都要占用一定的空间,根 据实际情况合理设置消息的组成能达到最佳的效果。


图1为本发明一种实施例的单片机程序调度方法流程图;图2为本发明一种实施例的任务表图;图3为本发明一种实施例的消息队列结构图;图4为本发明一种实施例的设置消息队列流程图;图5为本发明一种实施例的调度任务函数流程图;图6为本发明一种实施例的单片机程序调度装置结构示意图。
具体实施例方式下面通过具体实施方式
结合附图对本发明作进一步详细说明。
处理器包括高端处理器和中低端处理器,以单片机为例,高端的有,64位单片机, 中低端的有8位、16位等单片机。对于高端处理器来说,一般移植有操作系统,运行速度比 较快,而中低端处理器由于系统资源有限,不适合移植操作系统,所以处理器程序的调度方 法对于提高处理器运行速度显得更为重要。下面以8位,16位单片机为例,说明本发明是 处理器程序调度方法是如何提高程序的执行效率。可以理解的是,虽然本发明比较适合没 有移植操作系统的中低端处理器,尤其是8位、16位等中低端单片机,但如果高端处理器, 比如高端单片机采用本发明构思的程序调度方法,一样属于本发明保护的范围。下面,以8 位、16位等中低端单片机为例,具体说明本发明的发明构思现有技术中,中低端单片机一般采用在main函数中设置一个无限循环的方式来 实现用户功能,这种方式使得单片机的程序结构性变差,尤其当用户要实现的功能很多时, 程序会很复杂,此时main函数几乎没有结构性,这给程序员进行维护或修改用户程序带来 了很大的困扰。同时,main函数的运行机制加上程序结构性差等因素,导致现有技术中的 单片机执行效率低,不能快速的实现期望的功能。基于此,本发明首先将单片机程序划分为一个个用于实现预定功能的任务函数, 以此提高单片机程序的结构性,增加了程序员或用户修改程序的方便性。然后以消息事件 驱动任务函数执行预定的功能,从而提高了程序的执行效率。在此过程中,各个任务共享系 统堆栈,有利于节约系统资源。实施例1 如图1所示,本发明实施例提供了一种单片机程序调度方法,包括11、在单片机程序中设置至少一个任务函数,任务函数用于实现预定的功能,并为 每个任务函数配置任务ID。12、设置消息队列,消息队列中每一条消息包括任务ID和传送数据指针;13、提取消息队列中的消息,根据任务ID索引对应的任务函数,并向其传递传送 数据指针,调度任务函数执行操作。步骤11中,单片机程序中任务函数的个数根据实际情况而定,任务函数的功能也 由用户或程序员预先确定,每个任务函数可以只实现一个功能,也可以实现多个功能。每个 任务函数由与之对应的任务ID索引,如图2所求,在一种实施方式中,配置有专门用于索引任务函数的任务表,该表包 括任务ID和任务函数句柄,任务ID和任务函数句柄一一对应,任务函数句柄就是对应就任 务函数的函数指针,也就是任务函数入口指针。此表中,任务ID和任务函数句柄可以由用 户填写,该表在代码中的表现形式可以是二维数组的形式。当然,也可以根据实际情况灵活设置。步骤12中,消息队列中的每一条消息包括任务ID和传送数据指针。任务ID对应 任务函数句柄,即任务函数指针,用于索引任务函数,传送数据指针用于任务间发送消息时 附带传递的参数,如果有数据需要传递,可将待传递数据的指针填充到该项,如果没有数据 需要传递,该传送数据指针为空。如图3所示,在一种实施方式中,消息队列为环形队列,该消息队列可以表示中断 消息队列,也可以表示任务消息队列,中断消息队列和任务消息队列的形状和结构相同。该 消息队列中的每一条消息除包括所述的任务ID和传送数据指针外,还包括消息ID (即消息号)。该消息ID号为用户自己定义,每个ID表示什么由用户根据业务需要指定。比如,单 片机运行过程中,根据消息中的任务ID找到该任务对应的任务函数,然后调用该函数并将 消息ID和传送数据指针做为函数参数传递给该任务函数,消息ID用于指示任务函数具体 实现什么功能。也就是说,任务函数可能具有多个功能,而消息ID则提示任务函数实现其 中的一个或几个功能,具体实现几个,由用户预定义。也就是,程序执行过程中,用任务ID 索引一个大范围(任务函数),用消息ID精确索一个小范围(任务函数中的某个功能),从 而可以更有效的提高程序的结构性和运行效率,尤其是在程序功能较多的情况下,更加有 效。实际情况中,消息ID和任务ID —般占用一个字节,传送数据指针在8位单片机中占用 1位字节,在16单片机中占用2个字,但这并不是唯一的方式,具体占用字节数可以根据实 际情况合理确定。图示中,SIZE表示该消息队列可以存放的消息个数,比如,SIZE = 11表示,该消息 队列可以存放11个消息,IN表示消息存入的地址,OUT表示取消息时,第一个需要取消息的 地址。当OUT = IN时为初始状态,此时消息队列为空;当IN+1 = OUT时,消息队列满。消 息在此队列按照先入先出的方式存放。如图4所示,表示了一种实施方式中设置消息队列流程图,该实施方式中,消息队 列为环形队列。图示设置消息队列流程即可以表示设置中断消息队列流程,也可以表示设 置任务消息队列流程。该流程具体包括1)、首先判断IN加1是否等于OUT,如果等于,表示当前消息池已经放满消息,没有 多余的空间存放新消息。此时,则向发送消息程序返回队列满;如果不等于,则进行下步;2)、将消息数据(消息号、任务号和传送数据指针)添加到IN指向的地址。3)、IN加1,并判断加1后的IN与SIZE是否相等。即判断存入消息后,是否到了 环形队列的尾部,如果是,则将IN置为0,重新回到环形队列头部,表示需从环形队列头部 开始存入消息;如果IN与SIZE不相等,则返回0K,表示可以继续在IN加1后所指向的地 址处存放消息。步骤13中,提取消息队列中消息时,先判断消息队列是否有消息,如有,则提取消 息,根据消息触发任务函数执行预定操作,如否,则调用执行H00K函数,即钩子函数,钩子 函数为特定条件下需要执行的回调函数。本发明中,执行钩子函数和条件是消息队列中没 有消息,该钩子函数要执行的操作完全由用户实现,执行什么操作都可以,也可以执行空操 作。但钩子函数不宜做过多操作,否则会导致系统实时性降低,比如,在一种实施方式中,判 断消息队列中没有消息后,直接执行空操作(也可以用钩子函数来实现),这样不会对系统 造成任何影响。如图5所示,表示了一种实施方式中调度任务函数流程图。在本实施方式中,消 息队列包括中断消息队列和任务消息队列,中断消息队列的优先级高于任务消息队列,即 提取消息时,先判断中断消息队列是否有消息,如有,则从中断消息队列中取消息,如否,则 判断任务消息队列中是否有消息,如有,则从任务消息队列中取消息,如否,则调用H00K函 数。在本实施方式中消息包括消息号、任务号和传送数据指针,当然,也可以不包括消息号, 具体依实际情况而定。该流程具体过程包括1)、判断中断消息队列是否有消息,即判断中断消息队列的IN是否等于0UT,如果
6相等,转到步骤2);如果不相等,即表示中断消息队列中有消息,则从中断消息队列中取消 息,即记录*0UT的值,也就是记录OUT指向地址的消息信息(消息ID、任务ID和传送数据 指针),可以采取将消息入栈的方式保存,然后转到步骤3);2)、判断任务消息队列中是否有消息,即判断任务消息中的IN是否等于OUT,如果 相等,表示任务消息队列也没有消息,则调用执行HOOK函数。如不相等,表示任务消息队列 中有消息,则从任务消息队列中取消息,即记录任务消息*0UTR值,然后转至步骤4);3)、判断中断消息队列中OUT是否等于SIZE,如果相等,表明OUT已指向环形队列 尾部,将OUT置0后转到步骤5)。如果不相等,直接转到步骤5);4)、判断任务消息队列中OUT是否等于SIZE,如果相等,表明OUT已指向环形队列 尾部,将OUT置0后转到步骤5)。如果不相等,直接转到步骤6);5)、根据保存的消息中的任务ID索引对应的任务函数,将消息号和传送数据指针 做为函数参数传递给任务函数,任务函数根据消息号和传送数据指针执行操作;6)、根据保存的消息中的任务ID索引对应的任务函数,将消息号和传送数据指针 做为函数参数传递给任务函数,任务函数根据消息号和传送数据指针执行操作;7)、返回开始。实施例2 如图6所示,一种单片机程序调度装置,包括任务函数模块2,用于在所述单片机程序中设置至少一个用于实现预定功能的任 务函数,并为每一个任务函数配置任务ID ;消息队列模块1,用于设置消息队列,所述消息队列中的每一条消息包括一所述任 务ID和传送数据指针;发送模块3,用于提取消息队列中的消息,根据消息中的任务ID查找对应的任务 函数,并把消息中的传送数据指针传递给任务函数,调度任务函数根据传送的数据指针执 行任务。在本实施例的一种优先方式中,消息队列模块中的每一个消息包括消息ID,根据 消息中的任务ID查找对应的任务函数后,把消息中的消息ID和传送数据指针传递给任务 函数,调度任务函数执行操作。在本实施例的另一实施方式中,消息模块包括中断消息队列和任务消息队列,中 断消息队列的优先级高于任务消息队列,提取消息队列中的消息具体包括判断中断消息 队列是否有消息,如有,则从中断消息队列取消息,如否,则判断任务消息队列是否有消息, 如有,则从任务消息队列中取消息,如否,则调用钩子函数。还可以将消息队列设为环形队列,消息按先入先出的原则排列在消息队列中。本发明实施例中的单片机程序调度方法及装置,通过将程序划分为一个或多个任 务函数,每个任务函数实现一个功能或是多个功能或是一系列相关的功能根据实际情况而 定。由于程序由任务函数模块组成,增加了程序的结构性,利于程序员或用户针对特定部分 修改程序,比如,针对某一任务函数。同时,采用消息(包括消息号、任务号和传送数据指 针)作为触发任务函数的机制,提高了程序的执行速率。因为,消息中的任务号在任务表中 与任务函数指针一一对应,而任务函数指针指向对应的任务函数,从而通过任务ID可以快 速地索引到需要的任务函数。然后将消息号和传送数据指针以函数参数的形式传递给任务函数,消息号可以快速指示任务函数实现的功能,通常情况下,任务函数是多个功能函数的 集合,当然也不排除任务函数只实现一个功能的情形。传送数据指针指向系统或其它任务 需要传递给任务函数的数据,根据传送数据指针,任务函数可以调用系统内存中对应的传 送数据,从而实现预定的功能。同时,待传送数据存入系统内存中,通过传送数据指针索引, 相当于,各任务可以根据传送数据指针共享传送数据,从而节约了内存,对于系统资源有限 的中低端单片机尤其重要。通过消息触发单片机程序执行预定功能的方法及装置,提高了 程序的执行效率。 以上内容是结合具体的实施方式对本发明所作的进一步详细说明,不能认定本发 明的具体实施只局限于这些说明。对于本发明所属技术领域的普通技术人员来说,在不脱 离本发明构思的前提下,还可以做出若干简单推演或替换,都应当视为属于本发明的保护 范围。
权利要求
一种处理器程序调度方法,其特征在于,包括在所述处理器程序中设置至少一个用于实现预定功能的任务函数,并为每一个任务函数配置任务ID;设置消息队列,所述消息队列中的每一条消息包括一所述任务ID和传送数据指针;提取消息队列中的消息,根据消息中的任务ID查找对应的任务函数,并把消息中的传送数据指针传递给任务函数,调度任务函数执行操作。
2.如权利要求1所述的处理器程序调度方法,其特征在于,所述处理器为单片机处理o
3.如权利要求1或2所述的处理器程序调度方法,其特征在于,所述消息还包括消息 ID,所述根据消息中的任务ID查找对应的任务函数后,把消息中的消息ID和传送数据指针 传递给任务函数,调度任务函数执行操作。
4.如权利要求3所述的处理器程序调度方法,其特征在于,所述消息队列包括中断消 息队列和任务消息队列,中断消息队列的优先级高于任务消息队列,所述提取消息队列中 的消息具体包括判断所述中断消息队列是否有消息,如有,则从所述中断消息队列取消 息,如否,则判断所述任务消息队列是否有消息,如有,则从所述任务消息队列中取消息,如 否,则调用钩子函数。
5.如权利要求4所述的处理器程序调度方法,其特征在于,所述消息队列为环形队列, 提取消息队列中的消息时,按先入先出的原则提取所述消息队中的消息。
6.如权利要求1或2所述的处理器程序调度方法,其特征在于,还包括设置用于索引任 务函数的任务表,所述任务表包括一一对应的任务ID和任务函数指针,所述任务函数指针 指向对应的任务函数,通过任务表实现任务ID和任务函数的对应。
7.—种处理器程序调度装置,其特征在于,包括任务函数模块,用于在所述单片机程序中设置至少一个用于实现预定功能的任务函 数,并为每一个任务函数配置任务ID ;消息队列模块,用于设置消息队列,所述消息队列中的每一条消息包括一所述任务ID 和传送数据指针;发送模块,用于提取消息队列中的消息,根据消息中的任务ID查找对应的任务函数, 并把消息中的传送数据指针传递给任务函数,调度任务函数执行操作。
8.如权利要求7所述的处理器程序调度装置,其特征在于,所述处理器程序调度装置 为单片机程序调度装置。
9.如权利要求7或8所述的处理器程序调度装置,其特征在于,所述消息还包括消息 ID,所述根据消息中的任务ID查找对应的任务函数后,把消息中的消息ID和传送数据指针 传递给任务函数,调度任务函数执行操作。
10.如权利要求9所述处理器程序调度装置,其特征在于,所述消息队列包括中断消息 队列和任务消息队列,中断消息队列的优先级高于任务消息队列,所述提取消息队列中的 消息具体包括判断所述中断消息队列是否有消息,如有,则从所述中断消息队列取消息, 如否,则判断所述任务消息队列是否有消息,如有,则从所述任务消息队列中取消息,如否, 则调用钩子函数。
全文摘要
本发明公开了一种处理器程序调度方法及装置,方法包括在处理器程序中设置至少一个用于实现预定功能的任务函数,并为每一个任务函数配置任务ID;设置消息队列,消息队列中的每一条消息包括一任务ID和传送数据指针;提取消息队列中的消息,根据消息中的任务ID查找对应的任务函数,并把消息中的传送数据指针传递给任务函数,调度任务函数执行操作。本发明的方法和装置提高了程序的结构性和程序的执行效率。
文档编号G06F9/46GK101950260SQ201010278458
公开日2011年1月19日 申请日期2010年9月10日 优先权日2010年9月10日
发明者冷卫杰, 吴明远, 徐运, 汪旭光 申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1