新闻中心

EEPW首页>嵌入式系统>设计应用> 嵌入式软件设计中查找缺陷的几个技巧

嵌入式软件设计中查找缺陷的几个技巧

作者: 时间:2008-04-06 来源:网络 收藏

本文引用地址://m.amcfsurvey.com/article/258085.htm
清单1:竞争条件
  如果在数据写入之前,使用shared_sensor的另一个线程或ISR先占(preempt)了这个线程,它将得到原来的传感器读数。使用临时副本可以防止先占线程读取只经过部分处理的数据。不过,如果这些代码在一个数据总线不足32位的处理器上运行,就会存在竞争条件。

  在一个8位或16位的处理器上,向shared_sensor的写入操作并不是一次性完成的。在8位处理器上,写入32位浮点值可能需要四条指令,在16位处理器上可能需要两条指令。如果在对shared_sensor进行连续写入中途Update_Sensor()被先占,则先占线程将从由一部分老数据和一部分新数据组成的shared_sensor读取一个数值。根据应用的具体情况,这有可能造成严重的后果。解决的办法是锁定调度程序,或在更新共享变量期间禁止中断。

  消除竞争条件通常很简单,但找出隐藏在代码中的竞争条件则需要仔细的分析。

  对于由一个循环程序和不同ISR组成的简单系统,分析竞争条件很简单,只需检查每个ISR并识别它引用的所有共享变量。共享变量通常是这些系统中的全局数据,一旦这些共享变量被找出来之后,就可以检查它们在代码中的各次使用情况。每次访问都必须按需要进行保护,以避免潜在的冲突。在简单设计中,一般通过在关键代码段周围禁止中断来实现保护。遵守下列规则可帮助避免竞争问题:

  * 如果一个ISR对共享数据进行写入,则该ISR之外的每次可中断的读操作都必须予以保护。
  * 如果一个ISR对共享数据进行写入,则该ISR之外的任何读-修-写操作都必须予以保护。
  * 如果一个ISR读取共享数据,则对该数据的可中断写操作必须予以保护。
  * 如果一个ISR和其它代码都要检查一个硬件状态标志,以便在使用某资源之前确定其可用性,如:
  if (!resource_busy)
  {
    // Use resource
  }

  则从检查标志之时开始,到硬件设置标志表示资源不可用为止,必须采取保护措施。

  对于使用了优先级不同的多个线程的更为复杂的系统,其分析也非常相似。上述规则仍然适用于ISR使用的所有数据。此外,还必须识别出每个线程使用的共享数据。首先从系统中优先级最高的线程开始,找出它与任何优先级较低的线程共享的所有数据,然后按照上述四条规则进行保护。对于软件使用的其它每个优先级,再重复这一过程。

  注意,如果系统采用了一种循环调度算法,则特定优先级内的所有线程可在任意时刻相互先占。这意味着前述四条分析规则在考虑较低优先级的线程之外,还必须考虑同一优先级的所有线程。

  多线程系统通常使用某种类型的操作系统,它能够提供多种保护选择。可以使用互斥或信号量,或者锁定调度器。有时也可使用其它进程间通信(IPC)基本技术:通过向消息队列发送消息(而非修改共享变量)来表示数据已经改变。在许多情况下,最好由单一线程来管理共享资源,它负责处理所有的读写请求,并在内部防止访问冲突。


评论


相关推荐

技术专区

关闭