Questions tagged «memory-usage»

1
我可以使用PROGMEM写入闪存吗?
在Arduino的文档中,我引用: http://playground.arduino.cc/Learning/Memory 注意:闪存(PROGMEM)存储器只能在程序刻录时填充。程序开始运行后,您将无法更改>闪存中的值。 并在PROGMEM说明中: http://arduino.cc/en/Reference/PROGMEM将 数据存储在闪存(程序)存储器中,而不是SRAM中。有Arduino板上可用的各种类型的内存的描述。 PROGMEM关键字是一个变量修饰符,仅应与pgmspace.h中定义的数据类型一起使用。它告诉编译器“将该信息放入闪存”,而不是通常存放在SRAM中。 那么我们可以还是不能?还是不一样?

1
编译代码大小概述
当我编译代码时,Arduino IDE将以字节为单位返回二进制草图大小。 有没有一种好的方法来找出(大约)什么功能或代码的哪一部分占用了闪存中的多少内存,以便让我感觉到什么功能占用了大部分宝贵的闪存,或者我可能在哪里浪费了闪存,应该开始优化?

5
高效的算法/数据结构来计算移动平均值
目前,我正在开发图形LCD系统,以显示热泵系统中的温度,流量,电压,功率和能量。使用图形LCD意味着屏幕缓冲区和字符串耗尽了我一半的SRAM和约75%的闪存。 我当前正在显示能源的最小/最大/平均数字。在午夜,当重置每日数字时,系统将检查当天的消耗量是否高于或低于先前的最小值或最大值,并存储该值。通过将累计能耗除以天数来计算平均值。 我想显示最近一周和一个月的日平均值(为简单起见,为4周),即滚动平均值。当前,这涉及维护最近28天的值数组,并计算整个数组中每月的平均值和每周的最后7天的平均值。 最初,我是使用浮点数组来完成此操作的(因为能量的形式为“ 12.12kWh”),但这使用的是28 * 4字节= 112字节(占SRAM的5.4%)。我不在乎分辨率只有一个小数点,因此我改为使用uint16_t并将该数字乘以100。这意味着12.12表示为1212,为了显示目的,我将其除以100。 数组的大小现在减少到56个字节(好多了!)。 没有简单的方法可以将图形缩小到我能看到的uint8_t。我可以忍受小数点后的损失(“ 12.1kWh”而不是“ 12.12kWh”),但是功耗通常高于25.5kWh(255是由8位无符号整数表示的最大值)。耗电量从未低于10.0kWh或高于35.0kWh,因此可以想象,我可以从存储的数据中减去10,但是我知道有一天我们会超过这些限制。 然后,我测试了将9位值打包到数组中的代码。范围为0-51.2kWh,总共使用32个字节。但是,访问这样的数组非常慢,尤其是当您必须遍历所有值以计算平均值时。 所以我的问题是-是否有更有效的方法来计算三个窗口(寿命,28天和7天)的移动平均值?效率意味着就SRAM的使用而言更小,但不会带来巨额代码的代价。我可以避免存储所有值吗?

1
有什么方法可以从RAM运行二进制代码吗?
我正在寻找一种便宜的单板计算机,该计算机可以用汇编语言进行编程,并使用有限的功能从PC和简单的I / O外围设备加载目标代码。 理想情况下,我希望能够在合理的时间内自己编写机器上的所有代码。我不希望这样的操作系统,因为我想要一个程序在RAM中写入一些代码,然后分支执行它。就适合于汇编编程的系统简单性而言,Arduino可能是我最好的选择,但是它具有哈佛架构,并且不允许我从RAM中执行。 多年前,我使用的是冯·诺依曼(Von Neumann)架构的8位CPU,它可以将执行分支到任何地址,无论它是映射到ROM,RAM还是其他任何地址。这就是我现在想做的。 我可能可以在RAM中编写和加载在RAM中编写的操作码解释器,但这是一个非常复杂且耗时的解决方案,除非已经存在这种虚拟机。 关于Arduino或我可能使用的其他微控制器的其他解决方法的任何建议吗? 谢谢! 皮埃尔

2
Arduino的OOP与内联
我已经编程了一段时间了,但是我是Arduino和AVR编程的新手。我对这些微控制器进行编程的主要问题是,在面向对象的类中设计代码与在许多示例中看​​到的更传统的嵌入式编程之间是否存在重大差异? 换句话说,在Arduino / AVR控制器世界中,使用类或反之亦然可以节省内存和性能吗? 假设我们有一个Class: class SomeClass(){ private: int x; int y; public: void foo(); void bar(); } SomeClass thisClass; thisClass.foo(); thisClass.bar(); 以更内联的方式设计程序是否会提高性能或内存,例如: int x; int y; void foo(){ /*** Do something ***/}; void bar(){ /*** Do more stuff ***/}; 我尝试在Stack Exchange和Google上进行一些搜索,但找不到完全可以找到的答案,我正在寻找的最能找到的就是此Stack Exchange问​​题。 我之所以这样问,是因为我有一个项目,它需要尽可能的轻巧,而且我不清楚在这种环境下应该如何设计程序。 编辑 谢谢您的回答,这为您提供了启示。我还不太清楚一件事。 假设您正在设计一个使用u8glib的类,如下所示: class UserInterface{ private: …

3
PROGMEM:是否必须将数据从闪存复制到RAM才能读取?
我在理解内存管理时遇到了一些困难。 Arduino文档说,可以在程序存储器中将常量(如字符串)或任何我不想更改的常量保留在程序存储器中。我认为它嵌入在代码段中的某个位置,这在von-Neumann体系结构内必须是完全可能的。我想以此来使我的UI菜单显示在LCD上。 但是,我对于那些仅从程序存储器中读取和打印数据的指令感到困惑: strcpy_P(buffer, (char*)pgm_read_word(&(string_table[i]))); // Necessary casts and dereferencing, just copy. Serial.println( buffer ); 为什么在访问前我必须将该死的内容复制到RAM?如果这是真的,那么所有代码​​会怎样?它在执行之前也已加载到RAM吗?那么仅使用2kiB RAM时如何处理代码(32kiB)?那些拿着软盘的小妖精在哪里? 更有趣的是:像这样的表达式中的文字常量会发生什么: a = 5*(10+7) 在将5、10和7加载到寄存器之前,它们真的被复制到RAM了吗?我简直不敢相信。

5
堆栈存储器如何用于功能和局部变量?
我想将一些值保存到EEPROM,还希望通过避免一些变量声明来释放SRAM,但是EEPROM存储器是按字节分配的。 如果要存储一个int值,则必须重复使用一些表达式。我以为我会为它们做一些功能。但是我担心,如果创建一个函数,它仍然会占用SRAM内存,最好声明一个int变量而不是使用EEPROM。 函数和局部变量如何存储在SRAM中?它是否仅存储闪存中功能指针的地址,还是所有变量和命令都存储在堆栈中?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.