當前位置:首頁 » 編程軟體 » mdk編譯優化

mdk編譯優化

發布時間: 2022-11-29 23:55:34

A. 怎麼讓keil MDK 不把把宏定義給優化掉了

可能是寫錯了,試試 * ( ( UINT8 *)(PCCRAMBASEADDR) )

要打括弧 再對指針引用

B. 怎麼解決MDK編譯的問題

  1. warning: #550-D: variable "d" was set but never used
    描述變數'd'定義但從未使用或者是雖然這個變數你使用了但編譯器認為變數d所在的語句沒有意義編譯器把它優化了解決仔細衡量所定義的變數d是否有用

    若是認定變數d所在語句有意義那麼嘗試用volatile關鍵字修飾變數d,若是真的沒有用那麼刪除掉以釋放可能的內存

  2. .warning: #1-D: last line of file ends without a newline
    描述:
    文件最後一行不是新的一行

    編譯器要求程序文件的最後一行必須是空行想了半天沒想通為什麼要這樣解決可以不理會若是覺得出現警告不爽那麼在出現警告的文件的最後一行敲個回車空出一行

  3. warning: #111-D: statement is unreachable
    描述:


    聲明不可能到達多出現在這種場合


int main(void)
{
...

while(1) //
無限循環
,
這在不使用操作系統的程序中最常見


C. Keil優化及如何設置某段代碼不優化

Keil默認會對代碼進行優化的

一般情況預設編譯優化設置被設定為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
如何設定不優化或改變某個文件的優化設置
1、針對某個文件
(1) 右鍵->Option for File XXXX

(2) 切換到【C51】選項卡
default表示與工程設置一致

2、針對某段代碼(局部優化)
#pragma OPTIMIZE(x) x就是你希望的優化級別
舉例如下:
#pragma OPTIMIZE(6)
void FunA()
{
}
......
......
#pragma OPTIMIZE(9)
void FunB()
{
}
上面的意思就是說,在void FunA()到void FunB()之前的所有函數,包括FunA在內,都採用6級的優化,而從FunB開始直到之後,只要沒碰上#pragma OPTIMIZE,都採用9級優化了。
OPTIMIZE還可以多一個參數,就是speed和size,
用法: #pragma OPTIMIZE(9,speed)或#pragma OPTIMIZE(5,size)
對應的就是9級優化,以速度為主,或5級優化,以空間最小為主。

D. MDK編譯提示main.c(7): warning: #550-D: variable "XX" was set but never used怎麼破

定義了變數key,使用key的代碼為:key = SPI2_ReadWriteByte(0x00);執行函數並將函數返回值賦值給key,沒有使用這個返回。

比如

int b=a;

從a中讀取數據負值給b.

其實,我是感覺聲明和負值的地方離那麼遠很奇怪。

反正循環裡面又不用,為什麼不到負值的時候才聲明。

(4)mdk編譯優化擴展閱讀:

使用變數並不需要了解變數在計算機內存中的地址,只要通過變數名引用變數就可以查看或更改變數的值。在VB Script中只有一個基本數據類型,即Variant,因此所有變數的數據類型都是Variant。

例如,可以創建一個名為Click Count的變數來存儲用戶單擊Web頁面上某個對象的次數。

E. keil5 load 不能用,編譯完程序,load一直顯示灰色什麼情況

把debug設置成軟體模擬了,改為jlink或你使用的工具就好了。

F. 怎麼解決MDK的出錯問題

MDK
常見錯誤

分類:

軟體
C
語言
2012-01-04 11:03 49
人閱讀

評論
(0)
收藏

舉報

工作後從單片機轉成
ARM,
剛開始用
ADS1.2
編譯器
,
用了一段時間
,
因為我接手的項目的老
程序正是用
ADS
編譯的
,
部門也大都在用
.
在學單片機的時候用的是
keil c51
編譯器
,ads

這個編譯器在易用性上真是無法比較
.
後來漸漸知道
keil
已經被
arm
公司收購
,
現在
keil MDK
成為了
arm
官方編譯器
,
所以決定重新投奔
keil,
利用平時的時間
,
將原程序重新用
mdk


.mdk
的優點就沒必要說了
,
在這里把平時遇到的編譯器給出的警告和錯誤信息給出詳解
,
希望給初學者一點幫助
,
發現錯誤
,
需要補充的歡迎留言
.

1.warning: #550-D: variable "d" was set but never used
描述
:
變數
'd'
定義但從未使用
,
或者是
,
雖然這個變數你使用了
,
但編譯器認為變數
d
所在的語
句沒有意義
,
編譯器把它優化了
.
解決
:
仔細衡量所定義的變數
d
是否有用
,
若是認定變數
d
所在語句有意義
,
那麼嘗試用
volatile
關鍵字修飾變數
d,
若是真的沒有用
,
那麼刪除掉以釋放可能的內存
.

2.warning: #1-D: last line of file ends without a newline
描述
:
文件最後一行不是新的一行
.
編譯器要求程序文件的最後一行必須是空行
,
想了半天沒
想通為什麼要這樣
.
解決
:
可以不理會
.
若是覺得出現警告不爽
,
那麼在出現警告的文件的最後一行敲個回車
,
空出
一行
.

3. warning: #111-D: statement is unreachable
描述
:
聲明不可能到達
.
多出現在這種場合
:
int main(void)
{
...

while(1) //
無限循環
,
這在不使用操作系統的程序中最常見

{
...

}

return 0; //
這句聲明在正常情況下不可能執行到
,
編譯器發出警告

}

解決
:
不理會
.

4. warning: C3017W: data may be used before being set
描述
:
變數
'data'
在使用前沒有明確的賦值
.

:
uint8 i,data; //
定義變數
i

data,
二者都沒有明確賦值

for ( i = 0; i < 8; i++) //
變數
'i'
在語句中被賦值
0
{
if ( IO1PIN & SO_CC2420 )
data |= 0x01; //
變數
'data'
在使用前沒有明確賦值
,
編譯器發出警告

else
data &= ~0x01;
}
解決
:
應仔細衡量該變數的初始值是否為
0
,若是
,
可以不理會這個警告
,
因為
MDK
編譯器在
程序執行前
,
會將使用到的數據區初始化為
0,
但若是該變數的初始值不應該是
0
,忽略這個
警告可能會引起致命錯誤
.
這個警告應引起足夠重視
.
應養成變數賦初值的習慣
,
好在有編譯
器給把關
.

5. warning: #177-D: variable "temp" was declared but never referenced
描述
:
變數
'temp'
進行了聲明但沒有引用
.
多出現在聲明了一個變數
,
但卻沒有使用它
,
它和
warning: #550-D: variable "temp" was set but never used
不同之處在於
temp
從沒有使用

.
解決
:
若是定義的變數確實沒有用
,
刪除掉
;
若是有用
,
則在程序中使用
.
與該警告類似的還有

warning: #177-D: function "MACProcessBeacon" was declared but
never referenced

6. warning: #940-D: missing return statement at end of non-void function
"DealwithInspect2"
描述
:
返回非空的函數
"DealwithInspect2"
的最後缺少返回值聲明
.

:
int DealwithInspect2(uint32 test)
{
...
...
...
//
此處應該是
return x;
返回一個
int
型數據
,
若是沒有返回值
,
編譯器產生警告

}

7.

1. error: #65: expected a ";"
描述
:
缺少分號
.
大多是漏忘
';'.
解決
:
雙擊錯誤行
,
在定位到錯誤點的附近找到沒加
';'
號的語句
,
加上分號
.
並不一定在定位到
的錯誤行才卻分號
,
可能是這行的上一行
,
也可能是下一行
.

2. error: #65: expected a ";"


error: #20: identifier "xxxx" is undefined
一塊出現
,
而且後面

error: #20
錯誤可能一大堆

描述
:
這個錯誤對於第一次遇上的人來說絕對是個噩夢
,
當錯誤出現
,
滿懷希望的雙擊錯誤提

,
來到錯誤行時卻愕然發現
,
錯誤行絕對沒有錯
,
於是找找錯誤行的上一行
,
下一行
,
沒有錯誤
,
再找上上行
,
下下行
...
讓人無比郁悶的事情出現了
:
編譯提示的所有錯誤行都不可能有錯誤出

.
其實這最可能是你在
.h
文件聲明外部變數或者函數時
,
沒有在聲明語句的最後加分號
!

果你有很多模塊
,

main.c,lcd.c,key.c...
有很多頭文件
,

lcd.h,key.h,
若是在
lcd.h
文件聲明
函數時沒有加分號
,
那麼這種錯誤可能定為到
main.c

,
所以要檢查所有頭文件
.
解決
:
仔細檢查
.h
文件
,
將分號補上
.

3. Error: L6200E: Symbol flagu multiply defined (by uart0.o and main.o).

描述
:
變數
(
也是一種符號
)flagu
多處定義
(

uart0.c
中和
main.c
都定義了
).
通常錯在全局變
量定義重復
.
比如
:

main.c
中定義全局變數
flagu:

uint8 flagu=0;


uart0.c
中也用到該變數
,
於是聲明此變數
,
我通常都是先復制定義的變數再在變數前面加
關鍵字
extern
修飾
:

extern uint8 flagu=0;

然後編譯
,
就會出現上面的連接錯誤
,
原因在於
,
我在
uart0.c
中是又定義了一個變數
,
而不是聲
明變數
,
因為我給變數賦了初值
"flagu=0",
這樣就重復定義了變數
flag.
正確的聲明方法是去
掉賦值部分
:

extern uint8 flagu;

解決辦法
:
找到重復定義的變數
,
看情況修改一處
.

4.error: #159: declaration is incompatible with previous "wr_lcd" (declared at line 40)
描述
:

wr_lcd
函數還沒有聲明之前就已經使用了
.
多出現在兩種情況
:
第一種
,wr_lcd
函數體
還沒有寫
,
就已經用到了它
,
這種情況多出現在寫一個程序的大體結構中
,
只是簡單寫一下框

.
第二種情況比較常見
,
函數
a
調用函數
b,
但函數
b
的函數體在函數
a
的下面
:
void a(void) //
函數
a
的實體

{
b(); //
調用函數
b
}

void b(void) //
函數
b
的實體

{
...
}
這樣如果點編譯
,
就會產生
error: #159
的錯誤
,
因為當函數
a
調用函數
b

,
發現在這之前都
沒有函數
b
的任何聲明
.
解決方法
:
在函數
a
調用函數
b
之前
,
對函數
b
進行聲明
,

:
void b(void); //
對函數
b
進行聲明

void a(void) //
函數
a
的實體

{
b(); //
調用函數
b
}

void b(void) //
函數
b
的實體

{
...
}

G. 關於如何提高keil的編譯速度

Project -> Options for Target -> C/C++下面勾選「Optimize for Time」優化時間,即優化代碼中費時的地方。

Keil(MDK-ARM)系列教程(四)_工程目標選項配置(Ⅱ):
http://blog.csdn.net/ybhuangfugui/article/details/53131141

Keil系列教程:
http://blog.csdn.net/column/details/13472.html

H. MDK編譯器優勢有哪些

1.超過3000款Arm?的Cortex?-M微控制器的解決方案;
2.支持32位Arm Cortex-A和Cortex-A/ Cortex-M的基礎設備;
3.Software Packs包括現成可使用的CMSIS和中間件組件;
4.MDK專業版支持Armv8-M架構;
5.強大的uVision?IDE,調試器和模擬環境;
6.配合ULINKpro?調試適配器使用生成應用的即時全指令跟蹤分析記錄;
7.關於程序執行的完整代碼覆蓋信息;
8.利用執行探查和性能分析器來優化你的代碼;
9.調試器完全支持CMSIS-RTOS RTX實時操作系統;
10.提供完整的中間件庫:包括TCP/ IP網路,文件系統,USB,和圖形界面;
11.具有領先特定處理器優化和microlib的業界領先的Arm C/C ++編譯器;
可以到億道電子下載

熱點內容
c語言f星號 發布:2023-02-01 10:06:49 瀏覽:283
漢末霸業安卓哪裡下載 發布:2023-02-01 10:05:28 瀏覽:888
西門子機床數控編程 發布:2023-02-01 10:04:27 瀏覽:380
做源碼站長 發布:2023-02-01 10:01:21 瀏覽:129
光遇如何安卓加蘋果區好友 發布:2023-02-01 10:01:14 瀏覽:69
有權的訪問許可權 發布:2023-02-01 09:59:14 瀏覽:285
阿里雲學生伺服器帶寬 發布:2023-02-01 09:58:15 瀏覽:316
dt演算法 發布:2023-02-01 09:49:57 瀏覽:498
安卓11如何查處理器 發布:2023-02-01 09:49:42 瀏覽:138
優酷超清上傳 發布:2023-02-01 09:47:36 瀏覽:117