LORA驱动移植成功后的测试过程:
1.先编译一遍已移植LORA驱动的程序:
2.在int main(void)函数里添加框起来的两段代码并编译,提示 3 Error(s), 2 Warning(s).
3.查看报错内容:
由编译提示可知,3个Error(s)均由未定义标识符所致,2个Warning(s)均为函数隐式声明。
4.选择tRadioDriver右键Go To Definition Of …找到tRadioDriver所在的头文件radio.h,同理,找到REG_LR_VERSION所在的头文件sx1276-LoRa.h。
函数RadioDriverInit所在文件radio.c,函数SX1276Read所在文件sx1276-Hal.c。
然后将#include "radio.h"和#include "sx1276-LoRa.h"两个头文件包含进去,编译提示 5 Error(s), 1 Warning(s)。
报error的原因是"bool"这个变量未定义;
报warning的原因是函数SX1276Read隐式声明。
5.我们再添加#include "platform.h"将platform.h这个头文件包含进去,编译提示 0 Error(s), 1 Warning(s)。
报warning的原因是函数SX1276Read隐式声明。
这个时候,我们的程序就已经可以运行了。接下来就把程序烧进开发板。
6.点击魔法棒图标,设置debug
7.编译,下载,可以看到开发板的LED灯以设定的时间周期闪烁。
诶,没法传视频,空着又不太好,就放张图片意思意思一下吧。
接下来讨论下细节问题:
程序虽然可以运行了,但是刚刚提示函数隐式声明的那个warning要不要处理掉呢?
最好处理掉,因为函数隐式声明是程序里的一个不稳定因子。虽然程序运行时看起来好好的也没啥问题。但如果是很大型的程序,这些隐式声明多了,估计运行起来遇到的未知bug也会接憧而来了(跑程序的时候所谓的时灵时不灵,就是程序稳定性的问题了吧)。
养成好习惯,编程少麻烦。
接下来要讨论的,就是隐式声明的问题。
那什么是隐式声明呢?(下面是我百度来的~)
由于编译器在处理函数调用代码时没有找到函数原型,只好根据函数调用代码做隐式声明。
为什么编译器在处理函数调用代码时需要有函数原型?因为必须知道参数的类型和个数以及返回值的类型才知道生成什么样的指令。
为什么隐式声明靠不住呢?因为隐式声明是从函数调用代码推导而来的,而事实上函数定义的形参类型可能跟函数调用代码传的实参类型并不一致,如果函数定义带有可变参数(例如printf),那么从函数调用代码也看不出来这个函数带有可变参数,另外,从函数调用代码也看不出来返回值应该是什么类型,所以隐式声明只能规定返回值都是int型的。
既然隐式声明靠不住,那编译器为什么不自己去找函数定义,而非要让我们在调用之前写函数原型呢?因为编译器往往不知道去哪里找函数定义。(所以这个时候我们就要告诉编译器让它去哪里找我们调用的函数~)
可以到下面的两个链接去看看,了解何为隐式声明以及它的“危害”。
参考链接
https://zhidao.baidu.com/question/341065125.html
http://www.360doc.com/content/16/0516/15/478627_559610934.shtml
本例程处理函数隐式声明warning的方法也很简单:找到标注隐式声明的函数所在文件,将其头文件包含进main.c里去。
前面我们提到过程序里唯一的一个warning原因是函数SX1276Read隐式声明。选择SX1276Read右键Go To Definition Of …找到SX1276Read所在的文件sx1276-Hal.c。
在main.c中添加#include "sx1276-Hal.h"将sx1276-Hal.h头文件包含进去,再编译,0 Error(s) , 0 Warning(s).
到此,测试程序中就排除了函数隐式声明的不稳定性因子啦~
以后都要养成尽量排除warning的习惯,特别是函数隐式声明这么好解决的warning就不要偷懒无视掉了。
转载:https://blog.csdn.net/weixin_43729257/article/details/101033690