ZHCUAV8W january 1998 – march 2023 66AK2E05 , 66AK2H06 , 66AK2H12 , 66AK2H14 , AM1705 , AM1707 , AM1802 , AM1806 , AM1808 , AM1810 , AM5K2E04 , OMAP-L132 , OMAP-L137 , OMAP-L138 , SM470R1B1M-HT , TMS470R1A288 , TMS470R1A384 , TMS470R1A64 , TMS470R1B1M , TMS470R1B512 , TMS470R1B768
默認情況下,編譯器允許函數之間的雙狀態交互工作。但是,編譯器允許您更改支持級別以滿足您的特定需求。
在雙狀態交互工作中,被調用函數負責處理調用函數所需的正確狀態更改。調用函數負責處理間接調用函數(通過地址調用)所需的正確狀態更改。因此,如果某個函數提供了需要狀態改變的函數直接調用該函數(按名稱調用)的能力,并提供間接調用涉及狀態改變的函數的機制,那么該函數支持雙狀態交互工作。
如果某個函數不支持雙狀態交互工作,則不能被需要狀態改變的函數調用,也不能間接調用支持雙狀態交互工作的函數。無論某個函數是否支持雙狀態交互工作,它都可以直接或間接調用某些函數:
鑒于支持雙狀態的這種定義,ARM C/C++ 編譯器提供了三個級別的支持。使用表 6-8 來確定用于代碼的最佳支持級別。
| 如果代碼... | 使用這種支持級別... |
|---|---|
| 需要少量狀態更改 | 默認值 |
| 需要很多狀態更改 | 經優化的 |
| 不需要狀態更改并具有頻繁間接調用 | 無 |
以下是有關每個支持級別的詳細信息:
具有此支持級別的函數只能間接調用不需要狀態更改且不支持雙狀態交互工作的函數。具有此支持級別的函數不提供雙狀態交互工作,因此需要狀態更改的函數無法調用它們。
如果您不需要雙狀態交互工作,間接調用頻繁,并且不能容忍支持雙狀態交互工作的間接調用所產生的額外代碼大小或速度,請使用此支持級別。
當程序不需要任何狀態更改時,指定不支持和默認支持之間的唯一區別是默認支持級別中的間接調用更復雜。