威尼斯城娱乐官方平台-威尼斯棋牌网站-首页

?

您好!欢迎进入湖南艾玛斯诺信息科技有限企业 !

?
栏目导航
问题解答
资讯资讯
问题解答
联系大家
服务热线
15388009638
13161381415
邮箱:47532418@qq.com
地址:湖南省长沙市天心区三城花苑14栋1104
嵌入式系统优先级反转问题分析
浏览: 发布日期:2017-12-20

  VxWorks是美国Wind River System企业(即WRS企业)推出的一个实时操作系统,具有良好的可靠性和卓越的实时性。该系统采用基于优先级的可抢占式调度策略,系统为每一个任务分配一个优先级,调度程序当前运行的任务是优先权最高的任务。但在实际开发中,由于任务间资源共享,信号量及中断的引入,往往会出现高优先级任务被低优先级任务长时间阻塞(pend)或阻塞一段不确定时间的现象,即所谓的优先级反转(Priority Inversion)。优先级反转会造成任务调度的不确定性,严重时可能导致系统崩溃。本文在参考文献[1,2]的基础上,结合实际项目开发过程中遇到的优先级反转问题,对造成优先级反转的原因及其解决方法进行了探讨。
 

  优先级反转一般性描述
 

  优先级反转发生在一个高优先级的任务等待一段不确定时间,等待一个低优先级任务先完成。图1中3个任务分别为task1、task2和task3,其优先级由高到低。从图1可知,当task3占有由信号量(semaphore)的某种共享资源而进入临界区实行时,task1就绪,由于系统可抢占式PBP(Priority Based Preemptive)调度策略,因此task1抢占task3实行。task1实行一段时间后也进入临界区,但此时task3仍占有此临界资源的信号量,task1被阻塞,等待task3此信号量。在经过这么一段时间后,task2已处于就绪状态,于是系统调度task2实行。如果task3在task2的实行期间一直没有能够被调度实行的话,那task1和task3将一直等到task2实行完后才能实行,task1更要等到task3它所占有的信号量才能实行;如果这段时间超出task1的Deadline,task1的调度出现了问题,此时轻则任务被长时间阻塞,重则造成系统崩溃。优先级反转原因可归纳为:高优先级的任务task1由于要等待被低优先级任务task3占有的临界资源而被task2阻塞,而此时具有中优先级的任务task2抢占了task3的CPU时间,导致task2先于task1实行。此类优先级反转问题的解决方法大致有2种:一种被称作优先级继承(priority inheritance);另一种被称作优先级极限(priority ceilings)。下面先容本文所遇到的优先级反转问题。
 

  优先级反转的实例探讨
 

  上节对一般意义上的优先级反转现象进行了描述,本节涉及的优先级反转则较上述更为复杂,更具有隐蔽性。
 

  本文采用的嵌入式微处理器为S3C2510, CPU核为Arm940T,SAMSUNG企业制造。应项目的需要,要求任务task1和task2中分别进行调用微秒级和毫秒级定时器功能函数,由于S3C2510处理器5个32位定时器(timer),因此利用其中的两个即可。其中,ms级定时器实现的代码架构如下:
 

  1) 中断处理函数:
 

  LOCAL void Timer1_Int_Handle(void)
 

  {
 

  *S3C2510_TIC = S3C2510_TIC_T1;/*清除中断*/
 

  ...
 

  semGive(TelID4_Stop);/*二进制信号量*/
 

  ...
 

  }
 

  2) 毫秒级定时函数
 

  void ms_Delay(int ms)
 

  {
 

  ...
 

  semTake(TelID4_Stop,WAIT_FOREVER);
 

  ...
 

  }
 

  3) 时钟初始化函数
 

  void msTimer_Init()
 

  TelID4_Stop=semCCreate(SEM_Q_FIFO,SEM_EMPTY);/*初始化二进制信号量*/
 

  assert(TelID4_Stop);
 

  ...
 

  }
 

  us级定时器功能实现的代码与类似,这里不再给出相应的代码。函数调用说明:先进行初始化,然后任务可随意调用定时功能函数。当某个任务调用定时功能函数时,此时该任务被信号量阻塞,同时定时器开始进行减一计数,当计数器减到0时,会产生一个中断请求信号,此时系统会调用中断处理函数,在中断处理函数将信号量,此时信号量变的可用,任务继续实行。
 

  当在两个不同优先级任务task1,task2(设优先级分别为93和94)同时运行,并分别调用us和ms级定时功能函数时,优先级反转出现了,task1会被长时间阻塞。其中,task1和task2的调用如下:
 

  void task1(void)
 

  {
 

  ...
 

  FOREVER
 

  {
 

  ...
 

  us_Delay();
 

  ...
 

  taskDelay(4);
 

  }
 

  void Task2(void)
 

  {
 

  ...
 

  FOREVER
 

  {
 

  ms_Delay();
 

  ...
 

  }
 

  上述两个任务间间资源是的,但两个任务在一起运行时,高优先级任务task1在经过一段时间后会被长期阻塞。
 

  解决上述问题的方法比较简单,只要调整task1的任务优先级低于task2,这里选为95,则两个任务可长时间并行运行。
 

  由于加入了中断和信号量,使系统任务调度变的复杂,从而导致两个原本看似的任务task1和task2,不能正常并行运行。造成此类现象的原因分析极其复杂,可视为是系统应用的一个盲点,但此类问题可通过总结规律有效饶开。例如在上述问题中,若task1调用的定时函数的定时时间小于task2中的定时时间,则相应的任务优先级也应task1PriorityTASK2PRIORITY,这样高优先级任务就不会被阻塞。
 

  4结论
 

  本文结合实际例子,对Vxworks中优先级反转问题进行了探讨,并对此类问题的解决方法进行了描述。本文的探讨将使嵌入式系统开发人员更深入了解优先级反转问题。文章最后对优先级反转问题作如下归纳:
 

  1) 通常条件:信号量引入;
 

  2) 发生时间:高优先级的任务等待一段不确定时间,等待一个低优先级任务完成;
 

  3) 造成原因:各异;
 

  4) 表现形式:高优先级任务被长时间阻塞。
 

  参考文献
 

  1、,孟凡荣,席景科.‘嵌入式实时系统的优先级反转问题’,单片机嵌入式系统应用, 2003.3
 

  2、党纪红,李东明,袁赣南.‘Vxworks实时内核调度的研究分析’,应用科技,2003.2

?

威尼斯城娱乐官方平台|威尼斯棋牌网站

XML 地图 | Sitemap 地图