使用工作调度程序初始化多装置的方法

xiaoxiao2020-7-23  9

【知识产权代理】【专利服务】Tel:18215660330

专利名称:使用工作调度程序初始化多装置的方法
技术领域
本发明涉及初始化装置,更具体地讲,涉及一种提供被设计用于使用工作调度技术有效地初始化多装置的手段的方法。
背景技术
包括多装置的产品已普遍地增加,并且由于产品的特点在于提供装置的服务所以必须将装置依次初始化。
另外,由于产品变得日益复杂并且庞大,所以组成产品的装置的类型和装置的数量增加。因此,当确定产品的值时,装置初始化处理已变得更加重要。因而,装置初始化的关键目的在于在可能的最短时间中执行稳定的初始化。
图1是表示传统的初始化装置的处理的例子的流程图。
对于执行提供特定服务的预定功能的单一装置,在该装置准备好提供其服务之前装置驱动程序必须经受用于驱动该装置的初始化处理。
也就是说,当由嵌入式操作系统启动控制装置的装置驱动程序(步骤S100)时,检查对装置初始化的硬件和/或软件要求以确定这些要求是否已满足(步骤S110)。如果初始化要求没有满足,则装置驱动程序保持在备用状态并且装置被周期性地检查以观察那些要求是否已满足。如果该要求已满足,则根据该要求设置初始值(步骤S120)。然后,执行检查以观察是否已为装置驱动程序的初始化设置了所有的初始值(步骤S130)。如果所有初始值已被设置,则装置被初始化以在提供相关服务之前进入备用状态。也就是说,执行服务备用初始化(步骤S140)。然后,装置初始化处理终止(步骤S150)。另一方面,如果不是所有初始值已被设置(步骤S130),则处理返回到检查初始化要求(步骤S110)。
图2是表示传统的初始化多装置的处理的例子的流程图。
当单一系统包括多装置时,对于该系统必须依次初始化所有装置以提供需要每个装置的初始化的预定服务。例如,当如在图2的步骤S210-S230中所示系统包括三个装置A、B、和C时,装置A、B、和C被顺序地初始化。
装置初始化方法的特定的非限制性的例子可以是顺序地执行各种装置驱动程序以执行装置初始化的基于x86的Linux系统中的Linux内核。在这种情况下,每个装置驱动程序模块探测它支持的装置,然后它初始化该装置并以预定方式向Linux内核注册相关服务。因为通过对所有装置驱动器模块重复上述处理所有装置被初始化,所以该处理需要几分钟来引导。
因此,从图1和2清楚可知,每次装置被初始化时,传统的装置初始化处理都经受因等待周期和重复的执行步骤S110和步骤S130引起的CPU空闲时间。因为大量时间被用于初始化比CPU慢的装置,所以CPU空闲时间增加,这又降低了装置初始化处理的效率。因此,非常希望具有一种有效地初始化多装置而不浪费CPU资源的方法。


发明内容
本发明提供了一种使用工作调度技术有效地初始化包括在系统中的多装置的方法。
本发明的一方面提供了一种使用工作调度程序初始化多装置的方法。该方法包括确定将被初始化的装置是否满足对初始化的要求;关于已满足对初始化的要求的装置执行初始化工作;确定是否存在已满足对初始化的要求的另一装置;和执行上述步骤直到所有其他装置的初始化已完成。确定装置是否满足对初始化的要求的步骤可包括预先注册所有的将被初始化的装置的工作调度表。最好而非必要地,基于关于分配的用于初始化工作的CPU时间的信息确定该工作调度表。
执行初始化工作的步骤可包括为已满足对初始化的要求的装置设置预先指定的初始值;检查是否所有的初始值已被设置,并且如果所有的初始值已被设置,则执行初始化以在提供相关服务之前进入备用状态。最好而非必要地,该方法还包括删除已被初始化以在提供相关服务之前进入备用状态的装置的工作调度信息。
该方法还可包括即使关于当前装置不是所有的初始值已被设置,也执行已满足对初始化的要求的另一装置的初始化工作。



通过结合附图对其示例性实施例进行的描述,本发明的以上和其他特点及优点将会变得清楚,其中 图1是表示传统的初始化装置的处理的例子的流程图; 图2是表示传统的初始化多装置的处理的例子的流程图; 图3是表示根据本发明实施例的工作调度方法的示图; 图4是表示根据本发明实施例的初始化装置的全部处理的流程图; 图5是表示根据本发明实施例的由工作调度程序执行初始化的处理的流程图;和 图6是表示根据本发明实施例的初始化装置的处理的流程图。

具体实施例方式 现在将参照附图对根据本发明的示例性实施例的初始化多装置的方法进行描述。
图3是表示根据本发明实施例的工作调度方法的示图。
在图3中,每个小正方形代表其中CPU工作的时间的最小单位。以下,正方形的宽度被称为“滴嗒(tick)”。
此外,每个垂直地画有阴影线的正方形代表用于初始化装置A的CPU执行时间,每个水平地画有阴影线的正方形代表用于初始化装置B的CPU执行时间,并且每个没有阴影线的正方形代表CPU空闲时间。例如,在图3中,当初始化装置A时,CPU执行时间和CPU空闲时间分别为5和9滴嗒。当初始化装置B时,CPU执行时间和CPU空闲时间都是5滴嗒。
当使用传统的方法时,由于装置B的初始化跟随在装置A的初始化的后面,所以用于初始化两个装置的CPU时间是24滴嗒(14滴嗒(装置A)加上10滴嗒(装置A))。
然而,在本发明中,在每个装置初始化处理期间的CPU空闲时间被适当地使用以减少初始化时间量。也就是说,当如在图3中所示使用工作调度时,花费的用于初始化的CPU时间是14滴嗒,这比传统技术快10滴嗒。
图4是表示根据本发明实施例的初始化装置的全部处理的流程图。
为了初始化组成特定系统的每个装置,执行初始化所需的信息被注册在该特定系统内的物理存储区域中或单独的由软件实现的数据库中(步骤S410)。该信息可包含装置标识符、关于初始化参数的信息、初始化命令、初始化的详细资料、和其他信息。
使用该注册的信息,系统CPU然后指示由软件实现的工作调度程序执行装置初始化工作。然后,装置初始化工作终止(步骤S430)。当系统启动时,工作调度程序可作为后台处理器工作。
与初始化工作关联的数据结构的例子包括枚举数据类型(job_state),代表枚举的工作状态;和结构数据类型(device_job),代表用于装置初始化的单位工作(unit jobs)。
也就是说,枚举数据类型job_state可定义为 enum job_state={hold,do,drop,done,fail} 其中,‘hold’表示其中功能‘do’还不能被执行的状态,‘do’是其中在结构数据类型device_job中确定的do_func能被执行的状态,‘drop’是其中装置不存在或不可用的状态,并且‘fail’是其中装置初始化已失败的状态。
结构数据类型device_job也可定义如下struct device_job{ priority_level level; job_state lastJobState; job_state(*decide_func)(device_job&); unsigned long decide_timeout; job_state(*do_func)(device_job&); unsigned long do_timeout; }; 这里,‘level’代表初始化工作的优先次序,‘lastJobState’是指示device_job 的上一工作状态的 job_state数据类型,并且‘(*decide_func)(device_job&)’是代表指向确定工作状态的函数的指针的job_state数据类型。‘decide_timeout’是工作停留在‘hold’状态的以微秒计的最大时间长度,‘(*do_func)(device_job&)’是代表指向将在工作状态为‘do’时被执行的函数的指针的job_state数据类型。此时,正被执行的工作的状态也被确定。‘do_timeout’代表do_func被执行的以微秒计的最大时间长度。
现在将使用上述的数据结构来描述盘装置的初始化的例子。
盘装置驱动程序保持在‘hold’状态,直到盘驱动器转速按要求超过最小每分钟转数(RPM)。如果满足了RPM要求,则使用直接存储器存取(DMA)读取超级块。然后,如果从该超级块读取的详细资料被满足,则安装该盘。
如果初始化例程定义为‘module_init’,则在‘module_init’例程中执行用于初始化的装置工作的初始注册如下 int module_init(void) {device_job*dj; /*Priority_level是10,decide_func是isSpinUp,decide_timeout是4 secs,do_func是doReadSuperBlock,并且do_timeout是1msec*/ dj=addDeviceJob(10,isSpinUp,4000000,doReadSuperBlock,1000); return 0; } 在这种情况下,decide_func和do_func可实现如下   char DmaBuffer[BLOCK_SIZE];/*用于使用DMA读取盘的缓冲器*/  job_state isSpinUp(device_job&amp;DJ){  /*如果作为探测的结果,盘驱动器不存在也不被支持,则返回到drop状态*/  if(!ProbeDiscDrive())return drop;  /*如果RPM未达到最小SpinUpRPM,则返回到hold状态,否则,返回到do状态*/  if(regRPM<MinSpinUpRPM)return hold;  else return do;  }  job_state doReadSuperBlock(device_job&amp;DJ)  {<!-- SIPO <DP n="5"> --><dp n="d5"/>  /*驱动DMA以将块0(超级块)读入DmaBuffer。*/  if(initiateDMA(DmaBuffer,0)){  /*如果DMA读取设置成功,则确定下一decide_func和do_func并返回到hold状态*/  setDeviceJob(11,DJ,DMADone,100000,doMount,1000000);  /*Priority_level是11,decide_func是DMADone,decide_timeout是100msecs,do_func是doMount,并且do_timeout是1 sec*/  return hold;}else return drop;/*如果它失败,则返回到drop状态*/}  job_state isDMADone()  {  if(isDoneDMA())return do;/*如果DMA传输完成,则返回到do状态*/  else hold; /*如果它还没完成,则返回到hold状态*/  }  job_state doMount()  {  /*如果读取到DmaBuffer的详细资料指示盘已被成功地安装,则返回到done状态*/  if(mount(DmaBuffer))return done;  else return fail; /*如果该盘未能被安装,则返回到fail状态*/  } 图5是表示根据本发明实施例的由工作调度程序执行初始化工作(步骤S420)的处理的流程图。
为了执行初始化工作,首先,确定是否存在满足对执行装置初始化的要求的工作(步骤S510)。对所有装置检查该要求以确定它们是否被满足。该要求包括所有可在软件中实现的条件,比如逻辑表达式、时间、以及随机数产生。
最好而非必要地,装置驱动程序确定对执行初始化的要求是否已被满足。用于初始化的注册device_job的处理阐述如下   list DJL;/*device_job的优先权链接的列表*/  device_job*addDeviceJob(priority_level level,  job_state(*decide_func)(device_job&amp;),   unsigned long decide_timeout,   job_state(*do_func)(device_job&amp;);  unsigned long do_timeout)  {  device_job*nDJ=new device_job;  nDJ->level=level;  nDJ->decide_func=decide_func;  nDJ->decide_timeout=decide_timeout;  nDJ->do_func=do_func;  nDJ->do_timeout=do_timeout;  DJL.addlist(nDJ); /*将新成员添加到device_job列表*/  return nDJ;  } 同时,下面给出用于实际地执行初始化工作的处理   while(!DJL.isEmpty())/*连续执行,直到没有device_job保留在列表中*/  {  device_job*DJ;  /*获得将根据优先权级别和调度方法执行的具有最高优先权的装置工<!-- SIPO <DP n="7"> --><dp n="d7"/>作*/  DJ=DJL.getDeviceJob();  /*安装看门狗定时器以检查decide_timeout*/  WD=setWatchDog(getCurrentTime(),DJ->decide_timeout,decide_timeout_handler());  /*执行decide_func以设置上一工作状态*/  DJ->lastJobState=DJ->decide_func(*DJ);  DO_STATE  switch(DJ->lastJobState)  {  case hold/*在hold状态,除了使看门狗定时器超时之外什么也不做*/  break;  case do  deleteWatchDog(WD);/*删除看门狗*/  WD=setWatchDog(getCurmetTime(),DJ->do_timeout,do_timeout_handler());  /*执行do_func以设置上一工作状态*/  DJ->lastJobState=DJ->do_func(*DJ);  goto DO_STATE;/*转到DO_STATE例程*/  case drop  case done  case fail  default/*在drop、done、fail或其他的情况下,从列表删除device_job*/  deleteWatchDog(WD);/*删除看门狗*/  DJL.removeList(DJ);/*从device_job列表删除当前的device_job*/<!-- SIPO <DP n="8"> --><dp n="d8"/>  break;  }/*switch*/  }/*while*/ 在确定存在已满足初始化要求的工作之后,从满足该要求的工作中根据工作调度协议选择将被执行的工作。可使用保留在系统内的注册的初始化工作信息(步骤S410)或装置信息制定工作调度协议,或者工作调度协议可对操作系统是特定的。例如,可选择满足要求的第一个工作。另外,可由公知的调度方法制定工作调度协议。
一旦工作被选择(步骤S520),则执行选择的工作(步骤S530),如果任何将被执行的初始化工作保留在工作调度程序中(步骤S540),则该处理然后确定是否存在已满足对初始化的要求的工作(步骤S510)。
图6是表示根据本发明实施例的初始化装置的处理的流程图。
具体地讲,为了执行选择的工作(图5中的步骤S530),预先指定的初始值被设置(步骤S610),然后被检查以确定是否已对当前选择的工作设置了所有的初始值(步骤620)。在这种情况下,可由程序执行的所有可能的描述,包括将由装置驱动程序执行的功能的分配、将出现分支的位置的地址、预定的方程、和包含执行的工作的详细资料的脚本,可在初始值设置中被指定。如果对当前选择的工作设置了所有的初始值(步骤620),则该装置被初始化以在提供相关服务之前进入备用状态(步骤S630)。然后,当前工作被从工作调度程序中删除(步骤S640)。如果不是所有初始值已被设置(步骤620),则执行下一装置的初始化所需的要求和初始值设置被分配到工作调度程序(步骤S650)。
本发明提供了一种使用工作调度程序初始化多装置的方法,由此当具有多装置的系统启动时有效地减少初始化时间。因此,CPU资源未因当初始化多装置时出现的CPU空闲时间而被浪费。
尽管参照其示例性实施例具体地表示和描述了本发明,但本领域的普通技术人员应该理解,在不脱离由所附权利要求限定的本发明的精神和范围的情况下,可以对其进行形式和细节的各种修改。
权利要求
1、一种初始化多个装置的方法,包括
确定该多个装置是否满足对初始化的要求;
关于已满足对初始化的要求的第一装置执行初始化工作;
确定是否存在已满足对初始化的要求的第二装置;和
执行所有上述步骤直到该多个装置中的所有装置的初始化已完成。
2、如权利要求1所述的方法,其中,确定多个装置是否满足对初始化的要求的步骤包括预先注册所有的将被初始化的装置的工作调度表。
3、如权利要求2所述的方法,其中,工作调度表基于关于分配的用于初始化工作的CPU时间的信息被确定。
4、如权利要求1所述的方法,其中,执行初始化工作的步骤包括
为第一装置设置初始值;
检查是否所有的初始值已被设置;和
如果所有的初始值已被设置,则初始化第一装置以在提供服务之前进入备用状态。
5、如权利要求4所述的方法,还包括在第一装置已被初始化以进入备用状态之后,删除第一装置的工作调度信息。
6、如权利要求4所述的方法,还包括如果对第一装置不是所有的初始值已被设置,则执行第二装置的初始化工作。
全文摘要
一种使用工作调度程序来初始化多装置的方法。该方法包括确定将被初始化的装置是否满足对初始化的要求;关于已满足对初始化的要求的装置执行初始化工作;确定是否存在已满足对初始化的要求的另一装置;和执行上述步骤直到所有其他装置的初始化已完成。
文档编号G06F9/445GK1637711SQ20041010171
公开日2005年7月13日 申请日期2004年12月23日 优先权日2003年12月23日
发明者崔爀丞 申请人:三星电子株式会社

最新回复(0)