簡體   English   中英

為什么編譯器不優化中斷代碼?

[英]Why does the compiler not optimize away interrupt code?

我最近遇到一個問題,該變量僅在中斷處理程序中被修改。 變量本身並未聲明為volatile,因此在更高級別的優化下,編譯器破壞了代碼。 但是,編譯器很聰明,可以編譯中斷代碼,因為該中斷仍然會觸發。

所以這是我的問題:

  1. 如果編譯器足夠聰明,可以編譯中斷代碼,為什么還不足夠聰明,無法意識到在該中斷中更改了變量?

  2. 在更高級別的優化中,未被調用的功能會得到優化。 由於沒有代碼調用中斷處理程序,因此應該對其進行優化。 是什么導致編譯器仍然編譯中斷代碼?

  1. 語言執行模型說普通的(非易失性)變量不能被“外力”改變。 即,如果您的代碼流沒有顯式更改變量,那么從該代碼流的角度來看,變量可能無法更改。 (除了C11為多線程執行定義的內容之外)。 您必須手動“指定”可由中斷處理程序更改的變量。

    這是實現C代碼高效優化的主要因素之一。 如果不對C程序的性能造成重大負面影響,就無法消除它。

  2. 首先,編譯器通常不會通過外部鏈接來優化函數。 是否使用外部鏈接聲明了中斷處理程序?

    其次,優化或保留功能的決定實際上並不是基於是否調用該功能。 它基於您的程序中是否以任何方式引用了相應的符號。 刪除未引用的符號,同時保留引用的符號。 除了調用函數符號外,還有其他方法可以引用它。 例如,將功能的地址也視為對功能符號的引用。 其地址在程序中任何位置的函數都不會被優化。

    您的中斷向量條目會在程序啟動時以某種方式初始化,這通常涉及獲取處理程序函數的地址。 這已經足以保護該功能不被優化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM