【问题标题】:Arduino Binary Array is too LargeArduino 二进制数组太大
【发布时间】:2016-11-23 00:58:37
【问题描述】:

我有一个二进制数的三维数组,我将其用作字典并通过一个 LED 数组。该字典包含 27 个字母,每个字母包含 30x30 像素(其中每个像素为 0 或 1)。

我使用的是英特尔 Edison - 代码运行良好 - 但在将 Edison 连接到我的 PC 时遇到问题(尽管更换了一次),我放弃了它。我切换到 Arduino Uno,但现在收到数组太大的错误。

现在我将数组设置为布尔值。有没有办法通过将数组设置为位来减少数组的内存需求?该数组仅由零和一组成。

以下是代码片段:

boolean PHDict[27][30][30] = {  
/* A */ {{ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0}, /* this is one column of thirty, that show "A" as a letter */

【问题讨论】:

    标签: arrays memory binary arduino-uno


    【解决方案1】:

    你可以写成

    #include <stdint.h>
    
    //...
    
    uint32_t PHdict[27][30] = {
    { 0x00004000, ... },
    ....
    };
    

    .. 每个条目包含 30 位打包成一个 32 位数字。 大小小于 4k 字节。

    在读取数组时,您需要一些代码来解包这些位,以及生成打包值的方法(即在您的“主机”计算机上运行并为源代码生成初始化数组的程序)

    对于 AVR 处理器,还有一种方法可以告诉编译器您希望将数组存储在 PM(闪存)而不是 DM 中 - 我认为如果您在 DM 中有它,编译器将需要将初始化数据放入PM 无论如何,并在程序启动之前将其复制过来,因此最好将其显式存储在 PM 中。见https://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html#AVR-Variable-Attributes

    实际上,根据处理器中闪存的数量,将其更改为 PM 可能足以解决问题,而无需打包位。

    【讨论】:

      猜你喜欢
      • 2014-08-09
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 2011-08-04
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      相关资源
      最近更新 更多