解決keil4版本的程式亂跳的原因

2021-05-23 02:28:44 字數 1576 閱讀 7129

前段時間除錯乙個很簡單的iic匯流排程式,程式編譯通過了,但是在軟體**除錯的時候發現,不按照自己設定的程式跳轉,找了很多天現在總結如下:

1.是你的程式優化級別太高,調低點就可以了,現在的rom都很大。

2.是你有中斷程式沒有用,或者用錯了

3.你定義的指標有錯或者非法

一、優化

keilc51的編譯器有乙個優化設定,不同的優化設定,會產生不同的編譯結果。一般情況預設編譯優化設定被設定為8級優化,實際最高可設定為9級優化:

1.dead code elimination。 

2.data overlaying。 

3.peephole optimization。 

4.register variables。 

5.common subexpression elimination。

6.loop rotation。 

7.extended index access optimizing。 

8.reuse common entry code。 

9.common block subroutines

附表:keil c51中的優化級別及優化作用

級別 說明 0

常數合併:編譯器預先計算結果,盡可能用常數代替表示式。包括執行位址計算。

優化簡單訪問:編譯器優化訪問8051系統的內部資料和位位址。

跳轉優化:編譯器總是擴充套件跳轉到最終目標,多級跳轉指令被刪除。

1 死**刪除:沒用的**段被刪除。

拒絕跳**嚴密的檢查條件跳轉,以確定是否可以倒置測試邏輯來改進或刪除。

2 資料覆蓋:適合靜態覆蓋的資料和位段被確定,並內部標識。bl51連線/定位器可以通過全域性資料流分析,選擇可被覆蓋的段。

3 窺孔優化:清除多餘的mov指令。這包括不必要的從儲存區載入和常數載入操作。當儲存空間或執行時間可節省時,用簡單操作代替複雜操作。

4 暫存器變數:如有可能,自動變數和函式引數分配到暫存器上。為這些變數保留的儲存區就省略了。

優化擴充套件訪問:idata、xdata、pdata和code的變數直接包含在操作中。在多數時間沒必要使用中間暫存器。

區域性公共子表示式刪除:如果用乙個表示式重複進行相同的計算,則儲存第一次計算結果,後面有可能就用這結果。多餘的計算就被刪除。

case/switch優化:包含switch和case的**優化為跳轉表或跳轉佇列。

5 全域性公共子表示式刪除:乙個函式內相同的子表示式有可能就只計算一次。中間結果儲存在暫存器中,在乙個新的計算中使用。

簡單迴圈優化:用乙個常數填充儲存區的迴圈程式被修改和優化。

6 迴圈優化:如果結果程式**更快和有效則程式對迴圈進行優化。

7 擴充套件索引訪問優化:適當時對暫存器變數用dptr。對指標和陣列訪問進行執行速度和**大小優化。

8 公共尾部合併:當乙個函式有多個呼叫,一些設定**可以復用,因此減少程式大小。

9 公共塊子程式:檢測迴圈指令序列,並轉換成子程式。cx51甚至重排**以得到更大的迴圈序列。

設定:在的target 中c51 的code 中選擇你需要的級別

堆疊、指標和自己寫的中斷問題那得自己檢查下你的程式函式。

Jbpm4的延續,Activiti5 3版本發布

url 了解activiti專案的,可以到以下 url 由於jbpm5相對於jbpm4有了太大的變化,幾乎是面目全非,所有想從jbpm4公升級到jbpm5幾乎是不可能,從jbpm開發團隊出走的jbpm的創始人tom baeyens重新啟動了乙個專案activiti5以延續jbpm4,activiti...

Css相容IE8版本的解決方法

當使用 microsoft internet explorer 8 beta 1 版本時,可能會遇到以下問題之一 之所以發生這些問題,是因為 internet explorer 8 beta 1 預設情況下使用它最新的 標準模式 來顯示網頁,但是目前大多數的網頁都是在 internet explor...

Qt3和Qt4版本差異帶來的問題和解決方法

qt3和qt4兩個版本存在很大的差異,這也給我們使用帶來了很大的挑戰。下面我結合一下我在實際程式設計過程中遇到的問題來總結一下如何更好的使用qt3和qt4兩個版本來進行程式設計。qt的版本不斷更新,現在最新的版本是4.6。1.首先是系統平台的差異。在win下,qt3的 已經很少能見到了,而且noki...