<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 嵌入式軟件設計中查找缺陷的幾個(gè)技巧

嵌入式軟件設計中查找缺陷的幾個(gè)技巧

作者: 時(shí)間:2008-04-06 來(lái)源:網(wǎng)絡(luò ) 收藏

本文引用地址:http://dyxdggzs.com/article/258085.htm
清單1:競爭條件
  如果在數據寫(xiě)入之前,使用shared_sensor的另一個(gè)線(xiàn)程或ISR先占(preempt)了這個(gè)線(xiàn)程,它將得到原來(lái)的傳感器讀數。使用臨時(shí)副本可以防止先占線(xiàn)程讀取只經(jīng)過(guò)部分處理的數據。不過(guò),如果這些代碼在一個(gè)數據總線(xiàn)不足32位的處理器上運行,就會(huì )存在競爭條件。

  在一個(gè)8位或16位的處理器上,向shared_sensor的寫(xiě)入操作并不是一次性完成的。在8位處理器上,寫(xiě)入32位浮點(diǎn)值可能需要四條指令,在16位處理器上可能需要兩條指令。如果在對shared_sensor進(jìn)行連續寫(xiě)入中途Update_Sensor()被先占,則先占線(xiàn)程將從由一部分老數據和一部分新數據組成的shared_sensor讀取一個(gè)數值。根據應用的具體情況,這有可能造成嚴重的后果。解決的辦法是鎖定調度程序,或在更新共享變量期間禁止中斷。

  消除競爭條件通常很簡(jiǎn)單,但找出隱藏在代碼中的競爭條件則需要仔細的分析。

  對于由一個(gè)循環(huán)程序和不同ISR組成的簡(jiǎn)單系統,分析競爭條件很簡(jiǎn)單,只需檢查每個(gè)ISR并識別它引用的所有共享變量。共享變量通常是這些系統中的全局數據,一旦這些共享變量被找出來(lái)之后,就可以檢查它們在代碼中的各次使用情況。每次訪(fǎng)問(wèn)都必須按需要進(jìn)行保護,以避免潛在的沖突。在簡(jiǎn)單設計中,一般通過(guò)在關(guān)鍵代碼段周?chē)怪袛鄟?lái)實(shí)現保護。遵守下列規則可幫助避免競爭問(wèn)題:

  * 如果一個(gè)ISR對共享數據進(jìn)行寫(xiě)入,則該ISR之外的每次可中斷的讀操作都必須予以保護。
  * 如果一個(gè)ISR對共享數據進(jìn)行寫(xiě)入,則該ISR之外的任何讀-修-寫(xiě)操作都必須予以保護。
  * 如果一個(gè)ISR讀取共享數據,則對該數據的可中斷寫(xiě)操作必須予以保護。
  * 如果一個(gè)ISR和其它代碼都要檢查一個(gè)硬件狀態(tài)標志,以便在使用某資源之前確定其可用性,如:
  if (!resource_busy)
  {
    // Use resource
  }

  則從檢查標志之時(shí)開(kāi)始,到硬件設置標志表示資源不可用為止,必須采取保護措施。

  對于使用了優(yōu)先級不同的多個(gè)線(xiàn)程的更為復雜的系統,其分析也非常相似。上述規則仍然適用于ISR使用的所有數據。此外,還必須識別出每個(gè)線(xiàn)程使用的共享數據。首先從系統中優(yōu)先級最高的線(xiàn)程開(kāi)始,找出它與任何優(yōu)先級較低的線(xiàn)程共享的所有數據,然后按照上述四條規則進(jìn)行保護。對于軟件使用的其它每個(gè)優(yōu)先級,再重復這一過(guò)程。

  注意,如果系統采用了一種循環(huán)調度算法,則特定優(yōu)先級內的所有線(xiàn)程可在任意時(shí)刻相互先占。這意味著(zhù)前述四條分析規則在考慮較低優(yōu)先級的線(xiàn)程之外,還必須考慮同一優(yōu)先級的所有線(xiàn)程。

  多線(xiàn)程系統通常使用某種類(lèi)型的操作系統,它能夠提供多種保護選擇??梢允褂没コ饣蛐盘柫?,或者鎖定調度器。有時(shí)也可使用其它進(jìn)程間通信(IPC)基本技術(shù):通過(guò)向消息隊列發(fā)送消息(而非修改共享變量)來(lái)表示數據已經(jīng)改變。在許多情況下,最好由單一線(xiàn)程來(lái)管理共享資源,它負責處理所有的讀寫(xiě)請求,并在內部防止訪(fǎng)問(wèn)沖突。


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>