前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ESP8266无人机-初始化过程

ESP8266无人机-初始化过程

作者头像
云深无际
发布2022-03-17 14:11:04
7740
发布2022-03-17 14:11:04
举报
文章被收录于专栏:云深之无迹云深之无迹

看这个宏

在这里启用

注意这种宏开关的用法,以及编译条件的使用。

使用这样的头把彼此连接在一起

在引入头的时候,利用面向对象写法,将这些组件都一一生成。

下面是:

代码语言:javascript
复制
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等的一开的电平

这是模拟的时序信号

代码语言:javascript
复制
#define GPEC ESP8266_REG(0x314)  // GPIO_ENABLE_CLR WO
代码语言:javascript
复制
#define ESP8266_REG(addr) *((volatile uint32_t *)(0x60000000 + (addr))

强制内联展开

在ARM系统下,可以给函数增加__attribute__((always_inline))属性让inline函数可以强制展开,但是仅限于ARM,因为attribute是GNU C特色之一。所以其实不太了解win系统下怎么使用强制内联展开。

代码语言:javascript
复制
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位地址

用了遍历的土办法,一个地址一个地址摸一边。

这个函数我理解不了是实现的。

停止与从机的数据传输:

代码语言:javascript
复制
Wire.endTransmission()
Wire.endTransmission(stop)

参数

stop(bool): 参数值为true时将在请求后发送停止指令并释放总线;参数值为false时将在请求后发送重新启动的指令,保持连接状态。

返回值类型:byte

返回传输的状态值:

  • 0: 成功
  • 1: 数据量超过传送缓存容纳限制
  • 2: 传送地址时收到 NACK
  • 3: 传送数据时收到 NACK
  • 4: 其它错误

如果是0,就成功:

把地址打印出来。

找到了激光传感器 ,下面的写法都一样。

最后扫尾,一个也没有找到的时候。

串口的初始化。

这里的话是串口的初始化,我不理解这种写法,不就是变参吗?

在里面的实现其实是调用了ESP8266的UART初始化,相当于在这里是包装。

这个地方很复杂我看了一下,我继续读。

这里的PinMode函数的封装我觉得很好:

大致可以看下是一个和寄存器打交道的文件。

代码语言:javascript
复制
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是无人机的精华,我写不完了。

从函数里面读取挂载的传感器:

最后绿灯亮,无异常。

如果定义了这个宏。

最后执行这个

代码语言:javascript
复制
https://blog.csdn.net/weixin_45499326/article/details/109555894
代码语言:javascript
复制
https://blog.csdn.net/m0_37616597/article/details/104138980
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-02-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云深之无迹 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 语法
  • 参数
  • 参数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档