看这个宏
在这里启用
注意这种宏开关的用法,以及编译条件的使用。
使用这样的头把彼此连接在一起
在引入头的时候,利用面向对象写法,将这些组件都一一生成。
下面是:
ESPCOPTER esp;
引入的是这个头
这些都是各种输出的控制功能
如果崽深入,其实会知道到底是什么样的功能。
其实我这里想讲一下arduino.h这个神奇的头文件。
在esp8266的实现里面在这里。
上面是GCC(默认的头文件),下面都是相对文件
不要以为就是简单是调用一个函数那么简单,后面的东西是很复杂的
后面还有头文件去完成这个复杂的封装过程
这是对与一个Pinmode功能的一些封装
常见的一些换算参数
在最后是,偷偷的为你隐式的添加arduino的方法,比如你换各板子为什么就能引脚就可以变换了呢?就是这个pins的作用。
这个ESP8266的和我们别的板子不一样
目录在这里,名字叫变种。我会慢慢说清楚里面的作用。
接着是TOF传感器
全网最便宜啊,兄弟!我其实还想给相机做一个
这个的封装是一个单独的传感器
VL53L0X激光测距传感器.Arduino使用篇
VL53L0X激光测距传感器.介绍篇
VL53L0X激光测距传感器.Mind+使用篇
VL53L0X激光测距传感器.ESP32使用篇
害,早写过了(凡尔赛)不过现在的功力比以前牛逼多了,我有时间重写一下下。
无人机实现了一个功能,就是可以插各种传感器使用,而且每次插的不一样,起作用也不一样。
那么咋实现的呢?其实使用的是IIC的地址,然后就是扫描功能。
只有两个函数而已
类型上面还是进行了二次封装
IIC的初始化,其实。。。这个函数内部是跳到ESP8266的IIC的
就是这个
这些的话,函数跳转不了,看名字是RTOS的。
私有的类先说明SDA,SCL等的一开的电平
这是模拟的时序信号
强制内联展开
在ARM系统下,可以给函数增加__attribute__((always_inline))属性让inline函数可以强制展开,但是仅限于ARM,因为attribute是GNU C特色之一。所以其实不太了解win系统下怎么使用强制内联展开。
static inline __attribute__((always_inline)) void f()
慎用 inline
内联能提高函数的执行效率,为什么不把所有的函数都定义成内联函数?如果所有的函数都是内联函数,还用得着"内联"这个关键字吗?
内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。
如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。
经查阅反汇编代码后发现,可能会出现以下问题:
1、汇编代码中出现长跳转(因为代码过长),较短跳转更耗时;
2、寄存器不够,因为所有代码都在一个文件中,原本在函数中可以在栈内解决的变量需要额外寄存器。
以下情况不宜使用内联:
(1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。
(2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。
总结
内联函数并不是一个增强性能的灵丹妙药。只有当函数非常短小的时候它才能得到我们想要的效果;但是,如果函数并不是很短而且在很多地方都被调用的话,那么将会使得可执行体的体积增大。
最令人烦恼的还是当编译器拒绝内联的时候。在老的实现中,结果很不尽人意,虽然在新的实现中有很大的改善,但是仍然还是不那么完善的。一些编译器能够足够的聪明来指出哪些函数可以内联哪些不能,但是大多数编译器就不那么聪明了,因此这就需要我们的经验来判断。如果内联函数不能增强性能,就避免使用它!
在 c/c++ 中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了 inline 修饰符,表示为内联函数。
栈空间就是指放置程序的局部数据(也就是函数内数据)的内存空间。
在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足而导致程序出错的问题,如,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。
IIC这块全都使用的是强制内联
使用指定的地址开始向I2C从设备进行传输。
在调用了Wire.beginTransmission(address)函数之后,使用write()函数对要传输的字节进行队列,并通过调用endTransmission()进行传输。
Wire.beginTransmission(address)
address: 要传输数据的目的设备的7位地址
用了遍历的土办法,一个地址一个地址摸一边。
这个函数我理解不了是实现的。
停止与从机的数据传输:
Wire.endTransmission()
Wire.endTransmission(stop)
stop(bool): 参数值为true时将在请求后发送停止指令并释放总线;参数值为false时将在请求后发送重新启动的指令,保持连接状态。
返回值类型:byte
返回传输的状态值:
0: 成功
1: 数据量超过传送缓存容纳限制
2: 传送地址时收到 NACK
3: 传送数据时收到 NACK
4: 其它错误
如果是0,就成功:
把地址打印出来。
找到了激光传感器 ,下面的写法都一样。
最后扫尾,一个也没有找到的时候。
串口的初始化。
这里的话是串口的初始化,我不理解这种写法,不就是变参吗?
在里面的实现其实是调用了ESP8266的UART初始化,相当于在这里是包装。
这个地方很复杂我看了一下,我继续读。
这里的PinMode函数的封装我觉得很好:
大致可以看下是一个和寄存器打交道的文件。
volatile uint32_t *const esp8266_gpioToFn[16] PROGMEM =
{&GPF0, &GPF1, &GPF2, &GPF3,
&GPF4, &GPF5, &GPF6, &GPF7,
&GPF8, &GPF9, &GPF10, &GPF11,
&GPF12, &GPF13, &GPF14, &GPF15};
一开始就是一个数组指针。
很有结构感
继续展开:
这里我就不详细说,大致逻辑就是去匹配输入的参数,当你输出一个功能,通过位运算去操作具体的寄存器。
顺便可以把这个数字引脚的读也看了。
因为需要4PWM+3LED+1Buzzer的接口,提前这里就设置输入。
灯的引脚
对灯的管理
启用和使用的方法
内存块每次用EEPROM.begin(size)读入缓存里,读入的大小由size决定,该数值范围为(4-4096),每次读入的这个EEPROM块都是从ROM的0地址开始的。比如,你的size是1024字节,那么读入的EEROM的块地址是从0-1023这个块。所以如果就你自已用时,你爱读多少就读多少,每次都从0地址开始用。
读入缓存:
AHRS是无人机的精华,我写不完了。
从函数里面读取挂载的传感器:
最后绿灯亮,无异常。
如果定义了这个宏。
最后执行这个
https://blog.csdn.net/weixin_45499326/article/details/109555894
https://blog.csdn.net/m0_37616597/article/details/104138980