资讯与服务

    (周一至周日 9:00-21:00)
    微信:liu87712531
    微信:lin445385978

    邮箱:87712531@qq.com

    咨询电话:15321970583

网站服务

您当前位置:首页 -> 计算机论文 -> 计算机理论->详细(目前国内最大最全原创最多的免费论文中心)

客服QQ咨询:点击这里给我发消息 点击这里给我发消息

无忧论文,为您指导,让您轻松发表,轻松晋级!

字号大小:


实时嵌入式系统中的一种互斥方法(二)

作者:来来来 整理:本网站论文网 录入时间:2011-12-14 00:18:12
的任务都无法抢占它。

  3.2最高优先级法的普通实现

  我们先来分析下面的一种在实际开发工作中会遇到的情况,任务A中有一段临界区代码,并且假设该临界区代码不包含因等待资源而不得不让出CPU的可能:

  PriorityProtect();

  ……//代码1

  Func();//函数调用

  ……//代码2

  UnPriorityProtect();

  而函数Func()如下定义:

  Func()

  {

  ……//代码3

  PriorityProtect();

  ……//代码4

  UnPriorityProtect();

  ……//代码5

  }

  当Func()执行完时,任务A的优先级被设回了原先的优先级,代码2将受不到保护!因此,我们需要对函数PriorityProtect()和UnPriorityProtect()进行改造:函数PriorityProtect()需返回设置最高优先级之前任务的优先级,而函数UnPriorityProtect()却不一定总是设置任务原先的优先级,它设置的是与之配对的PriorityProtect()返回的优先级。这两个函数都是成对使用的,不管嵌套使用了多少次都不会出错,举例如下:

  OldPriority=PriorityProtect();

  ……//代码1

  Func();//函数调用

  ……//代码2

  UnPriorityProtect(OldPriority);

  而函数Func()如下定义:

  Func()

  {

  int OldPriority;

  ……//代码3

  OldPriority =PriorityProtect();

  ……//代码4

  UnPriorityProtect(OldPriority);

  ……//代码5

  }

  这样在函数Func()执行完后任务仍处于最高优先级状态,代码2仍受到保护,符合程序员的意图,程序员不必担心会发生意外。但是这种方法的效率有点低下,执行Func()时已经是最高优先级状态了,却还要再设置,浪费了CPU时间,在嵌套次数较多时效率问题将更加严重。另一方面我们不能轻易将函数Func()中的互斥手段去掉,因为这要考虑在其它没提供互斥手段的情况下调用Func()。基于上述原因,我们引入一种高效的方法——嵌套计数法。

undefined undefined

  3.3最高优先级法的嵌套计数实现

  先来定义操作规则:COUNT为系统中的全局变量,初始化为0。

  PriorityProtect()

  {

  if(!COUNT) ……(1)

  利用具体的系统调用把当前任务设成最高优先级 ……(2)

  COUNT++; ……(3)

  }

  UnPriorityProtect()

  {

  COUNT--;……(4)

  if(!COUNT) ……(5)

  利用具体的系统调用把当前任务设成原先的优先级……(6)

  }

  再来分析一下这种方法的安全性。COUNT是全局变量,对它的访问要防止竞争条件。但巧妙的是一旦我们把任务用操作系统原语调用设成最高优先级后,对COUNT的访问将是独占的;一个任务首次调用PriorityProtect()时在语句(1)处有竞争条件,但一次只能有一个任务通过(2)处的原语成为最高优先级,只要我们正确地配对使用这两个函数,当这个任务最终退出最高优先级状态时COUNT必为0,并不影响其它任务在(1)处的判断。这种方法的高效性也是明显的,在嵌套使用的里层仅仅进行嵌套计数的计算,并不用进行优先级的设置。

  4 结论

  尽管不同的实时嵌入式操作系统给用户提供的系统调用接口不尽相同,但是它们所准遵循的基本原理都是相同的。上述关于禁止任务抢占的普通实现以及嵌套计数实现提供的都是实现思想,在实际应用中很容易结合所使用的具体的操作系统写出PriorityProtect()和UnPriorityProtect()的实现代码。

  [1] Labrosse Jean J,uc/OS-II-源码公开的实时嵌入式操作系统,邵贝贝译,北京:中国电力出版社,2001.

  [2] 孔祥营等,嵌入式实时操作系统VxWorks及其开发环境Tornado,北京:中国电力出版社,2001.

首页 上一页 1 2 3 下一页 尾页 2/3/3

上一篇赞自由软件(四)
下一篇优化程序长度的一种方法