MDK中常见编译警告和错误的总结及部分的解决方法

1、function "fabs" declared implicitly 说明调用fabs的这个文件中没有对fabs这个函数进行声明,因此在头文件中包含该函数的声明即可。即在头文件中添加#include "math.h"即可。

2、关于编译器优化容易产生的不可思议的BUG,因此编译器不要轻易优化,除非对编译器的工作原理很熟悉。现在说一下自己遇到的问题,一个简单的函数就是不正确执行,函数如下:

void Beep(int  state)
{

	if(state)
	{
		GPIO_SetBits(GPIOA, BEEP_PIN);	

	}
	else
	{
		GPIO_ResetBits(GPIOA, BEEP_PIN);	

	}
}

函数在被调用Beep(1)后,相关的gpio口就是没有被置位,而且单步调试,函数的执行顺序也很诡异,函数再执行玩GPIO_SetBits后,这个寄存器显示相关位没有被置位,自己找了好久的配置、程序逻辑等相关的东西,就是找不到根上,最后发现:

MDK中常见编译警告和错误的总结及部分的解决方法_第1张图片

这个Level0(-O0),自己手残将他改成了default,导致了这种问题的发生,因此不知道这个具体含义,不能瞎更改,否则会搞死自己,自己就是个活生生的例子。现在就简单的总结一下这个东西到底是一个什么含义和作用,方便以后自己不再犯同样的错误。

level0   近乎不优化,用于调试代码。出现代码行不能设置断点可如此设置试试

level1  部分优化。移除未调用的内联函数和静态函数,关闭debug窗口优化,此状态也能用于调试

level2 默认优化等级。如果处于debug状态,部分代码行将不能被调试,
KEIL编译器C语言编译选项优化等级设置不一样造成代码运行的效果完全不一样。

以上关于编译等级优化的简单理解的内容摘自博客:https://blog.csdn.net/chengdong1314/article/details/53463183。

3、pointless comparison of unsigned integer with zero   代表无符号整形和0进行比较没有意义,由于无符号没有负数,这种判断恒为真。

4、代码可以正常的通过MDK下载到单片机中,但是程序不运行,程序总是停留在启动文件关于终端服务函数名字处,原因是在启动文件中并没有定义你所编写的代码中的中断服务函数。

5、在MDK中出现equality comparison with extraneous parentheses这样的黄色三角警告,代表括号有重复多余的情况。

 

你可能感兴趣的:(MDK)