问题标签 [progmem]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1011 浏览

c++ - 使用 PROGMEM 时我缺少什么?

所以我试图在我的 Arduino 的程序内存中存储一​​个多维 CHAR 数组,但我在让它工作时遇到了问题。这就是我所拥有的...

根据 PROGMEM 文档,要获取指向 char 数据的指针,您应该使用 pgm_read_word 调用。但是,当我尝试使用此功能将其读回时...

...我得到的只是垃圾。

如果我删除 PROGMEM 行并且只使用 RGBBitmap 指针并删除 pgm_read_word,它可以工作,但是它在 RAM 中,我已经用完了。

那么我在这里错过了什么?

0 投票
1 回答
1493 浏览

c++ - C++/Arduino 将指针传递给存储在 PROGMEM 中的二维数组

我有几个 const int 二维数组全局存储在 PROGMEM 中。例如:

我想在一个函数中读出这个二维图像数组。应在参数中指定要读取的图像。

我对指针等的使用不是很熟悉,但我知道这是这样做的方法。你能告诉我如何让它工作吗?

EDIT1:我现在怎么做(它有效,但它并不优雅);我有没有任何参数的函数 printImage1(),并且在我使用的主体函数中:

读出 image1。对于 image2、image3 等。我复制函数 printImage1 并将 imgage1 从上面更改为 image2、image3 等。这是冗余编程,这就是为什么我想只使用一个函数 printImage 在参数中指定图像。

0 投票
1 回答
244 浏览

c++ - 如何防止字符串在 PROGMEM 中多次蜂鸣

我试图通过减少程序中的计数字符串来保护一些程序空间。所以我开始将所有需要多次的刺痛放入一个带有命名空间的文件中:

我通过将字符串包含到我需要它们的文件中来使用字符串,例如调用Display::out_p(1, 0) << p_strings::right_arrow;. 它从程序中读取字节并将它们放在显示器的正确位置。但是,如果我查看.Iss我发现它们仍然多次包含在 ASM 中。

所以我想这不是安全存储的正确解决方案。

我现在的问题是:

  1. 为什么它仍然多次包含(在 asm 中)?(也许我的想法有些简单的失败)
  2. 我如何创建阻止这种情况的“东西”?(我是否需要以某种方式作为参考传递的类?)

如果需要更多信息,请告诉我。

0 投票
2 回答
1247 浏览

arduino - Arduino:如何使用 PROGMEM(可读)初始化结构

我有这个:

然后是这个:-

所以我可以稍后将我的菜单传递给这样的函数:

我如何将所有这些移到 FLASH 中?

我已经尝试了一堆东西的组合,但没有什么能减少“全局变量使用 688 字节(33%)”的消息,除了这个凌乱的 kludge:

这破坏了我将可读菜单编码到源代码中的能力,并在此过程中将所有菜单工作增加了三倍......

我怎样才能以某种方式使这项工作,同时保持我的菜单行的“定义”在我的源代码中是一体的?

0 投票
1 回答
895 浏览

c++ - 在 PROGMEM 中为 arduino UNO 连接字符串

我正在尝试创建一个波形文件名称列表 soundList 以通过 arduino UNO 上的 adafruit WAV 屏蔽来播放。由于这些文件名永远不会改变,而且我的 sRam 快用完了,我想将它们存储在 PROGMEM 中,但出现错误:

我不能在 PROGMEM 中连接字符串吗?我不明白为什么。

我也很难从soundList中读取波形文件?

有什么智慧之言吗?

0 投票
1 回答
1712 浏览

c++ - 字符串的 3D 数组

我正在尝试制作一个循环显示消息组的 LCD 项目(16x2)。这个想法是它将循环浏览当前所选组中的所有消息,并且在手动更改之前不会离开该组。最初我有一个 3D 数组:级别 1 是消息组,级别 2 是要显示的消息,级别 3 是行。

};

我或多或少有这个工作,但我认为数组对于内存来说太大了,因为在第 3 组中途它停止显示消息。当我测试它时,数组索引总是正确的。我假设数组已被截断。在尝试解决这个问题时,我遇到了 PROGMEM。我尝试将位于http://www.arduino.cc/en/Reference/PROGMEM的 arduino 字符串教程 从 1D 数组转换为 3D 数组,但无法让它工作,它要么编译失败,要么返回垃圾。以下是我的一些尝试。

所以我尝试使用将原始数组直接转换为程序

但它仍然返回垃圾。所以我想我会尝试将数据转换为一维数组,并使用偏移量访问消息和行。

编辑:编辑以下代码以反映我在原始草图中使用的代码。

这是我使用的测试循环:

这导致了一个几乎可以工作的例子,但它并不完美:

您可能会注意到没有显示值 10,值 11 和 12 重复了两次,当它达到值 19 时,它就陷入了无限循环。

我想不出最终的循环应该是什么。

理想情况下,我更喜欢保留 3D 数组结构,因为我发现它更易于阅读和理解,但我对任一版本的代码的解决方案都很满意。

编辑以反映shuttle87的建议:

我得到的当前输出是:“Switchi”,没有别的,这是否意味着我的 Arduino 是因为我的代码而挂起,还是我以某种方式杀死了它?我还更新了单数组版本以反映我实际编码的方式。当我复制它时,我抄错了,它有点乱。它的工作方式更像shuttle87 的建议,但它仍然返回上面显示的错误。

编辑:刚刚意识到我错过了:

应该开始了:

对于那个很抱歉。这似乎已经解决了它。非常感谢你的帮忙 :)

谢谢。

0 投票
2 回答
1100 浏览

c - 在 Arduino/AVR 上访问 PROGMEM 中的单个字节

我已经阅读了几天来访问 PROGMEM,并梳理了其他几个问题,但我仍然无法让我的代码正常工作。任何帮助,将不胜感激。

我在下面包含了 Arduino 的完整测试草图。它的大部分工作,但是当我循环遍历“alpha”字符的每个字节时,正如“alphabytes”所指出的那样,我只是把垃圾拿出来,所以我显然没有访问正确的内存位置。问题是,我不知道如何访问该内存位置。

我已经看到了其他几个这种工作的例子,但没有一个在指针数组中具有不同大小的数据数组。

请参阅以“>>>> 问题是...”开头的行

0 投票
1 回答
1257 浏览

arduino - Arduino IDE 最大 PROGMEM 字符数组长度

我试图在我的 arduino 草图中使用单个 4KB 字符串,但这似乎总是在控制台中给出一大堆 java 错误并且永远不会编译。我相信,我正确使用它:

通过反复试验,我确定我可以成功编译的最大长度是 1104 个字符。这似乎没有多大意义。编译器中是否有一些未知的限制,或者是 IDE 的问题?我正在使用 1.0.5,但我在 1.6.5 中也得到了相同的结果。我真的不想拆分数组。在线阅读,大小限制应该是32KB,远远高于我需要的。任何帮助或解释表示赞赏,请谢谢。

0 投票
1 回答
3037 浏览

c++ - 没有 PROGMEM 的 Adafruit gfx 库 drawBitmap

所以我试图将图像的字节数组放入外部 eeprom (c24LC16B) 并使用 Adafruit gfx 库中的 drawBitmap() 函数在诺基亚 3310 LCD 上绘制它(使用 Adafruit PCD8544 库)。但问题是,drawBitmap() 只能使用静态字节 PROGMEM 数组。不好,我需要将 img 数组从 eeprom 读取到缓冲区(字节 buf[504]{}; ),然后将其绘制在显示器上。

我尝试了一些我在网上找到的修改,例如将其添加到 Adafruit_GFX.ccp:

但它仍然只显示垃圾

那么为什么对 PROGMEM 和普通数组有这么大的影响呢?PROGMEM 和 SRAM 中的字节不一样吗? 也对不起我的语法。

0 投票
1 回答
967 浏览

c - 在 Arduino 的 C 中使用 PROGMEM 中的 struct 中的函数指针

我试图从存储在 PROGMEM 中的结构中读取函数指针,然后将值(输入)传递给相应的函数并保存返回值,但我找不到正确的语法。

我得到的只是来自 Arduino IDE 1.6.5 的以下错误:

如何从 PROGMEM 读取函数并正确执行?