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个字节之差也是比较多的,尽量优化的精神