补充,前面没讨论优先级问题。<br /> 优先级可以通过以下方式实现:<br /> 一是通过中断优先级设置,在低优先级中断里面再产生中断,遇到没有中断优先级的CPU(比如PIC的很多型号),可以在你认为的低优先级里面,再次人为打开全局中断,让高优先级中断可以再发生,并注意保存与恢复中断现场。这种方式是最可靠的;<br /> 二是任务优先级,可以在外部查询事件Int_Event里面,执行完你认为最优先的一级并返回,再次查询时执行第二优先级并返回,依此类推。这样也可以实现软件优先级,效果不错的。<br /> 不过,在这种结构的支配下,一般的项目并不需要建立软件优先级,因为这种结构本身是基于多任务,面像对象的机制建立的,主程序只有十几条指令,循环非常快,(敌不动,我不动,敌一动我立即对付)。所以建立优先级没必要。<br /> 除非当你遇到一个问题,比如上位机发来一条指令,让你计算一个问题,比如MD5验证,大概要运算100ms,这是一个复杂的运算问题。那么下位机主程序<br />在Int_Event()里面查询到这一事件后,一般人会立即去计算MD5,表面上看起来其他中断还能发生,但是细想一下,那些本来应该每隔1毫秒运算的事件,等这MD5运算完毕,他们应该执行过100次才对,实际上1次没执行,这显然会得到不好甚至错误的结果,解决这一问题的根本方法是任务分离技术。<br /> 任务分离,就是将一个复杂的任务分成很多个子步骤,使每一个子任务的调度时间在我们的允许范围内,如果不符合可以呈树状形式展开再分,直到符合要求。实际上,我们产品的初始化过程,往往就需要这样做,这样做的好处就是,当软件上电电路稳定之后,立即可以进入主循环,不需要为了进行一系列初始化而单独写个初始化过程,使上位机通讯处于盲目状态,或称为软件的空子,软件最好不要留空子(软件的某一个时间段不能执行某些合法操作,因为软件长时间滞留在一个地方,比如大循环,多重循环)。举个例子,比如QQ等软件,如果我来做,软件介面可以马上出现,因为那些初始化过程对用户来说,只是后台问题,当用户看到鼠标繁忙时间比较长时,那么会感觉郁闷。<br /><br /> 任务分离举例,比如大循环(for(i=0;i<100;i++),你可以用一个变量Index,每过一定时间比如1毫秒,Index++,执行这个for循环里面的内容,并将For循环里面的所有i变量替换成Index,这样一来原本可能要用5毫秒运算的问题,现在分成100份,每份平均50us,每过1毫秒执行一个单步花50us,100毫秒之后任务解决完毕,在执行这一任务期间,其他主程序任务也会及时得到执行。显然通过这种方法,CPU利用率显著下降。注意任务分离最重要的是把握好度,任务块的大小,每过多少时间去执行任务块,如果任务非常紧急,那么必须把子任务块安排在立即事件(Immediate_Event())里面做。这个问题也回答了有些朋友说立即事件没有用的问题。<br /> <br /><br /><br /> <br /><br />
|