当前位置:首页 » 编程软件 » 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 ++编译器;
可以到亿道电子下载

热点内容
有机蔬菜配置有哪些 发布:2024-04-30 18:53:59 浏览:575
根生群算法 发布:2024-04-30 18:46:25 浏览:537
mysqllinux客户端工具 发布:2024-04-30 18:36:04 浏览:734
服务器网卡max地址 发布:2024-04-30 18:26:31 浏览:152
连战访问大陆行程 发布:2024-04-30 18:23:17 浏览:647
网易我的世界本地存档服务器 发布:2024-04-30 18:01:38 浏览:36
pythonhtmlparser 发布:2024-04-30 17:53:16 浏览:635
c语言交换两个数 发布:2024-04-30 17:20:01 浏览:765
脚本撰写基本格式 发布:2024-04-30 16:48:46 浏览:907
安卓软件是如何检测模拟器的 发布:2024-04-30 16:33:55 浏览:526