Keil MDK 5编译工程时遇到以下问题:
不懂就搜,CSDN上也搜到很多的类似问题,需要定义USE_STDPERIPH_DRIVER,STM32F10X_HD。
意思需要引入传递给C代码的宏定义,开启某些功能,本着从代码中找到问题的原则,先在工程中搜索一把:
结果~~~~~
函数实现的原型找不到,emmm~~
不过在Keil的options for target,也就是编译选项之类的操作界面,如下一顿操作
就能去掉assert_param找不到的错误。
这就完了吗?我觉得没有,这两个宏定义在代码中确实有相关的定义,使用时大抵都是下面的样子
可以看到代码中的宏开关:USE_STDPERIPH_DRIVER这个宏定义如果被定义了,就可以包含头文件stm32f2xx_conf.h,
查了其它几个 #ifdef USE_STDPERIPH_DRIVER 并没有什么实质性的东西,就直接追着stm32f2xx_conf.h文件看到下面这些定义
这不是有对应的assert_param宏实现吗?
编译器就算定义了用户宏定义,也找不到对应的实现,IDE傻掉了?
从上面的代码可以看出,如果需要打开断言,则需要在前面的界面中增加对应宏定义:USE_FULL_ASSERT
IDE也有代码符号建立不全的问题,不要过渡相信它~~。Windows下看代码Sourceinsight比较方便,不过最近国内各大公司去A化(减少漂亮国软件依赖),慎重!!
在Linux下grep命令,也可以直接搜到,grep "assert_param" ./ -r | grep "define" 就可以过滤出来,缺点是Linux下编译代码不直观,还需要CMake或Makefile加持,入门难度稍大。
正如下面这个代码实现
但是如果改成下面这样实现就没有告警信息:
如果编译选项打开-Wall,将告警信息当做错误处理,代码就编译不过了~~,有点莫名其妙。
armcc编译器不是收费的吗?就这~
至此:错误都是有来源的,耐心找找就能发现问题,所有问题都来自代码。