3-13 arduino内存-3 内存优化(智能应用篇)

3-13 arduino内存-3 内存优化

ATmega328中的各类存储介质存储大小
在这里插入图片描述

这节课重点在flash及sram,学习如何优化程序,让arduino开发板发挥出其潜能
在这里插入图片描述

优化SRAM

(1)方法一(Serial.println(F(“hello-world”)))

SRAM更小,先学习如何优化SRAM
在这里插入图片描述

双引号括起来输出一串字符串(在引号里的),会将此字符串作为变量存在SRAM中
这个字符串变量是不会变化的,把一个不会变化的变量放到SRAM存储,是有些浪费SRSM空间的

我们是否可以将其放到flash(存放静态信息,无变化的如程序,而非变化的变量)中
我们可以将其修改如下
在这里插入图片描述

上面两条指令运行结果是一样的,都能在串口监视器显示出字符

只需要F()将字符串括起来,此字符串变量就会被存在flash中,不会放在SRAM中,这样大大降低了SRAM资源消耗,当我们进行大量调试使用串口监视器时这样做的作用非常大的

(2)方法2(const int PROGMEM a= 125;)

在这里插入图片描述

建立一个整数型常量,arduino运行过程中会将其放在SRAM中处理
这个常量在运行过程中是不发生任何改变的,也是属于静态信息,若将其放在SRAM存储也是一种浪费

我们应将常量信息存放在FLASH中如下,只需加入大写字母PROGMEM(program memory程序内存)

在这里插入图片描述

上面的两种方法都是将SRAM中的静态信息放到FLASH中,用flash分担SRAM的压力
在这里插入图片描述

接下来就是对SRAM中的遍量做文章了

(3)方法3尽量多使用局部变量代替全局变量

在这里插入图片描述

在这里插入图片描述

上方代码不会让arduino完成任何工作,这些代码的意义就是展示arduino处理全局、局部变量如何利用SRAM的

在这里插入图片描述

当创建全局变量时,SRAM会给出一个区域给全局变量,此空间别的不能再使用了,当建立第二个全局变量只能在剩下的空间找

全局变量一旦被占领,谁也无法再次使用了

在这里插入图片描述
在这里插入图片描述

运行到function-1中时,局部变量创建如上,创建临时空间给局部变量,当arduino执行完function-1内容后,会将其中所有局部变量空间释放,空间可被再次利用
在这里插入图片描述

在执行function_2的局部变量再次建立空间如右侧
在这里插入图片描述

局部变量占的空间会被释放

此时引出优化SRAM的第3中方法,共享局部变量,尽量多使用局部变量代替全局变量

在这里插入图片描述

(4)方法4尽量使用占用内存少的数据类型

需要注意,各个变量大小的尺寸是不成比例的,SRAM能存储多少个整数型变量,每个整数型变量在SRAM中站2个字节,BOOL型的遍历占1个字节
在这里插入图片描述

SRAM能存放1024个int类型变量,或者存放2048个布尔型变量
在这里插入图片描述

举例如下:
左侧使用布尔型变量用于逻辑判断更优化
在这里插入图片描述

Arduino有非常多的数据类型
了解其存储范围及所占字节大小

http://www.taichi-maker.com/homepage/reference-index/arduino-code-reference/

在这里插入图片描述

http://www.taichi-maker.com/homepage/reference-index/arduino-code-reference/data-types/
在这里插入图片描述

需要注意的是部分arduino开发板是8位控制器,上面的数据类型所占字节等介绍是基于8位开发板来说的,对于32位的arduino开发板上方信息就不再适应了

优化FLASH闪存

(1)代码简洁

如何写程序更加优化flash闪存,其存储静态信息,所有优化程序代码,程序代码则要更简洁,一句话能解决的就不要多句话
在这里插入图片描述

初学者很难一次搞定,要多次修改优化,此时会产生无用的程序代码,一定要删除无用代码否则其会浪费我们的资源

(2)删除无用代码

在这里插入图片描述

(2.1)删除无用库、无用变量、无用函数

在这里插入图片描述

无用的代码一定全部删除

示例程序

接下来进行实际例子
环保小夜灯示例程序-2

原始代码未优化的
运行结果如下
在这里插入图片描述

占用了10%存储空间和9%的动态内容

程序优化后的代码如下

运行结果如下
在这里插入图片描述

存储空间占用5%,而动态内存只有0%

优化哪些内容

(1)所有串行输出字符串加入F(),SRAM的静态信息移到flash闪存中

在这里插入图片描述

(2)常量加入PROGMEM,将SRAM的静态信息移到flash闪存中

在这里插入图片描述

注意这种方法只适合程序常量

(3)控制led的亮度的,是需要0255就可以了,int类型范围太大,使用byte(正好0255之间,只占用1个字节)

1个字节之差也是比较多的,尽量优化的精神
在这里插入图片描述

  • 21
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
YOLOv5 (You Only Look Once version 5) 是一种基于单阶段目标检测算法的人工智能模型,由 ultralytics 团队开发。它利用深度学习技术,在计算机视觉领域实现了高效的目标检测性能。YOLOv5 目标检测框架相较于其前代版本(如 YOLOv4),引入了一些优化策略,例如数据增强、模型结构改进以及损失函数的调整等,旨在提高检测速度和精度。 Arduino 是一种开源电子硬件平台,包含一系列基于微控制器的板卡和软体环境。Arduino 可以用于构建各种嵌入式系统,并因其易于上手的特性而受到广大开发者喜爱。Arduino 提供了简单的编程语言和图形化界面工具,使得即便是初学者也能够快速创建出功能丰富的项目。 将 YOLOv5 应用Arduino 上涉及到一些挑战和技术限制: ### 技术挑战 1. **计算能力**:Arduino 的微处理器通常比现代计算机的处理能力和内存有限得多,这限制了可以部署的复杂模型大小和速度。因此,YOLOv5 需要经过特别优化才能在 Arduino 上运行,比如使用轻量级架构或者模型量化减少浮点运算的需求。 2. **电源管理**:Arduino 使用电池供电或者外部电源,这意味着应用需要在低功耗模式下运行以延长设备使用寿命。因此,模型的功耗也是一个关键考虑因素。 3. **实时性**:在嵌入式系统中,实时性至关重要。因此,模型的推断时间需要控制在一个合理的范围内,以保证设备能够及时响应输入。 4. **资源可用性**:Arduino 资源有限,包括存储空间和RAM。所以,不仅需要对模型进行压缩和优化,还要精心管理程序代码,以确保能够在现有资源下运行。 ### 实现步骤 为了将 YOLOv5 适配到 Arduino 平台上,开发者通常会采取以下步骤: 1. **模型精简**:从原始的 YOLOv5 模型出发,使用量化、剪枝、知识蒸馏等技术减小模型体积和计算量,使其更适合在硬件资源受限的平台上运行。 2. **移植代码库**:使用针对微控制器优化的代码库(如 MicroPython 或其他专为 Arduino 设计的软件堆栈),并集成深度学习推理引擎(如 TensorFlow Lite for Microcontrollers 或其他支持 ARM Cortex-M 系列微控制器的框架)。 3. **硬件配置**:选择适合的 Arduino 板卡,如 Arduino Nano 33 IOT 或者 ESP32-CAM,后者内置摄像头,适合图像识别任务。此外,还需要考虑是否使用外接摄像头或其他传感器。 4. **训练和测试**:对优化后的模型进行本地训练(如果可能的话),并在 Arduino 上进行测试,评估模型在实际应用场景下的性能和稳定性。 5. **调试与优化**:根据实际运行效果进行进一步的调试和优化,比如调整模型参数、优化传感器读取频率等。 将 YOLOv5 与 Arduino 结合是一个创新的跨平台应用尝试,适用于物联网(IoT)设备、安全监控、机器人等领域的小型设备。然而,实现过程充满了技术和工程挑战,需要对深度学习、嵌入式系统及 Arduino 开发有深入理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吾名招财

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值