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后,这个寄存器显示相关位没有被置位,自己找了好久的配置、程序逻辑等相关的东西,就是找不到根上,最后发现:
这个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这样的黄色三角警告,代表括号有重复多余的情况。