Tello talent无人机扩展模块库分析(default.ino)
这个地方把ino后缀改成是cpp,不影响
Ardunio的编程语言,原型是wring
这个是官网的文章
https://github.com/arduino/arduino-cli
http://wiring.org.co/reference/
https://blog.csdn.net/u011000290/article/details/50850171?utm_medium=distribute.pc_relevant.none-task-blog-title-6&spm=1001.2101.3001.4242
https://arduino.github.io/arduino-cli/latest/sketch-build-process
虽然有注释,但是有点少.而且宏都是大写
一眼也看不出来,我处理一下
处理好了
这个地方是一些宏定义,在预编译阶段处理
首先是__name__这样的叫私有变量名,这里是开启esp32的uart0做debug用
具体这个我需要查esp32的资料
可以看到是串口1做了这个工作
这个SDK的版本是哪里
键盘双击的间隔时间
两个函数声明
控制LED屏幕还是灯的一个参数
查一下这个SDK的版本是什么意思
去到了官网,现在做的真漂亮
我们找ESP32,32的开发没有non-os,比较不开心
下文是具体的地址
https://github.com/espressif/esp-idf/releases/tag/v1.0
一直翻,到18年才是有了sdk1.0
所以我觉得不是这个版本号
可以稍微的看一眼日志
我们来找一下sdk_version的出现的位置,这个是第二次出现
是打印这个版本的信息。
这个地方是第三次打印,是在一个串口的一个循环里面会
这个地方是最后的一次出现
最左边出现这个红色的小杠,点一下。
会出现源码里面做出更改的地方
我这里用SI打开这个源码
起一个名字
然后选择源码的位置
选择Add Tree选择一下
此时这个地方显示ino文件
检测成了一个文本文件
改成cpp后缀,在文章的最前面我就说过了。
可以看到已经检测到了
有所有的函数列表
tof飞行距离一开始设置为0
这个程序写的还是有点东西的
一开始是一堆函数原型
而且在写法上面用空行分隔
对8x8的屏幕
tof传感器
版本函数
普通的函数
未知的版本
总之就是一堆回调函数,现在就是看个函数名字也不知道是什么,
继续分析会知道
这几个函数看不懂
这个是创建几个对象
RGB上面哪个灯
就是这个!
灯,矩阵灯
游戏手柄
Tof传感器
配对模式
可以用SDK去控制飞机飞行
到现在为止就创建了这么多的“对象”~~~
配对任务句柄
任务句柄
tof传感器电池读取的任务句柄
BLE低功率蓝牙的任务句柄
一个容纳128个值得数组
这个函数会返回传感器的距离
void IRAM_ATTR key_doubleclick()
{
static uint32_t last_press_time = 0, now_press_time = 0;
static uint8_t key_toggle = 0;
uint32_t interval;
if (digitalRead(34) != 0)
{
return;
}
if (last_press_time == 0)
{
last_press_time = millis();
}
now_press_time = millis();
interval = now_press_time - last_press_time;
if ((interval > 50) && (interval < DOUBLECLICK_INTTERVAL_TIME))
{
if (!key_toggle)
{
CommonSerial.printf("[TELLO] motoron");
#ifdef __DEFAULT_LOG__
Serial.printf("[TELLO] motoron");
#endif
}
else
{
CommonSerial.printf("[TELLO] motoroff");
#ifdef __DEFAULT_LOG__
Serial.printf("[TELLO] motoroff");
#endif
}
key_toggle = !key_toggle;
}
last_press_time = now_press_time;
}
这个程序比较长,我直接
先缩进看一看
键双击?
什么时候使用iram_attr
你提出了一个很好的问题。这是我的理解,其中可能包含错误或不完整,是纠正我自己思想的机会。
ESP32基于哈佛架构,这意味着有两条总线...一条用于指令,一条用于数据。松散地,从数据总线获取0x4000 0000以南的地址空间,而从0x4000 0000到0x4FFF FFFF的地址空间(如果我没记错的话)来自指令总线。
现在想象一下一个64K页面的RAM。与其他环境中的那一页RAM“仅存在”在固定地址空间位置的环境不同,在ESP32上,我们具有MMU(内存映射单元),可以使64K页的真实RAM映射到不同的地址位置。这意味着我们可以拥有可以从数据总线读取的RAM或可以从指令总线读取的RAM。
这就引出了一个问题,您将把什么放入可从指令总线读取的RAM?答案是(如果我理解正确的话)...指令(可执行代码)。
当我们编译C源文件时,我们最终得到一个目标文件,然后将其链接以生成可执行文件。在编译期间,已编译的C的不同“部分”将放置在目标文件的不同“部分”中。例如,代码进入“ .text”部分,而初始化数据进入“ .data”部分。通过用“ IRAM_ATTR”标记一段代码,我们声明编译后的代码将放置在一个名为“ .dram.text”的部分中(我正在做这个,因为我没有手工引用)。这意味着,除了具有“ .text”和“ .data”部分的可执行文件之外,还有其他部分。ESP32引导加载程序在启动时将复制那些“ .dram.text” 在启动对应用程序的控制之前,在启动时将它们放入真正的RAM中。然后将RAM映射到指令区地址空间(> 0x4000 0000)。这意味着可以将控件从正常运行的应用程序中传递给此代码(通常),并且它将“起作用”,因为该代码位于指令总线地址空间中。
现在剩下的就是“为什么”要这样做?答案是考虑替代方案。如果您要运行的代码不在RAM中,那么它还能在哪里?答案是“闪存”……如果它在闪存中,则当接收到执行该代码的请求时,必须从那里执行该代码。ESP32上的Flash比RAM访问慢得多...因此有一个内存缓存可用于解决其中的某些问题...但是我们无法确定当我们跳转到一段代码时它会存在于缓存中,因此可能需要从闪存缓慢加载。
现在我们开始讨论……如果我们要运行的代码是中断服务程序(ISR),我们总是希望尽快进入和退出它。如果我们必须在ISR中“等待”闪存中的负载,那么事情将会变得非常错误。通过将某个功能标记为存在于RAM中,我们就可以有效地牺牲宝贵的RAM,因为它知道对它的访问将是最佳的并且是恒定的。
分析的已经很明白了,还有一小点。我们分析完这个函数就到此为止。
这段也简单,我就写个注释。不分析了
这个是i2c的初始化是没有初始化的~
这个判断的有点奇怪。这个写法emmmmm
初始化
自己看吧
作用域符号::的前面一般是类名称,后面一般是该类的成员名称
Initialize the Matrix and show a TT Logo,初始化矩阵和显示一个TT Logo
开始显示图案
调用的是I2C总线