内存不足:声明全局2D数组问题。

3
我需要一种不会使我耗尽RAM的全局访问160 * 160位数据的不同方式。我正在尝试为160 * 160液晶黑白屏幕创建后备缓冲区。因此,160 * 10个int给我160 * 160位,因为一个int是16位。但是,我在板上运行时内存不足。有没有一种方法可以在不使用RAM的情况下完成这项工作?也许以某种方式进行分配?但我无法找到适当的二维数组分配方式。还有其他方法吗?
编辑:它是msp430 rbx430板(这里是它的图片链接http://i.ytimg.com/vi/rr18why8wzY/0.jpg),是的,这个设备上的int是16位的。长整型和双精度浮点数是32位的。该设备具有64k内存,并且我将其运行速度设置为16mhz。我要求3200字节。
关于它的意义,为什么不行呢?我有一个64k的设备,其中int是16位。我正在通过使用1和0来跟踪像素的开启或关闭状态创建160x160液晶屏幕的地图。在我打开所有想要的像素之后,我会将我的地图应用到液晶屏上。这样,我就不必先绘制到液晶屏上,然后擦除液晶屏,再重新绘制。我可以简单地绘制,然后覆盖它。这将使其不会闪烁。

有效地创建了一个背景缓冲区来绘制到液晶屏上。

static int lcdPixels[160][10];

    /*Must call this before using RBX430_graphics*/
    void initGraphics(void)
    {

        int h = 0;
        int w = 0;

        for(h=0; h < ROW_SIZE; h++)
        {
            for(w=0; w < COLUMN_SIZE; w++)
            {
                lcdPixels[h][w] = 0;
            }
        }
    }

这是剩下的部分。
void pixelOn(int posX, int posY)
{
    // first grab the right column
    int column = ( ((float)posX/16.0f) + 0.9f);
    // next grab the right bit
    int bit = posX;
    while(bit > 16)
    {
        bit = bit - 16;
    }

    //turn on the bit/pixel
    lcdPixels[posY][column] |= (1 << bit);
}

void pixelOFF(int posX, int posY)
{
    // first grab the right column
    int column = ( ((float)posX/16.0f) + 0.9f);
    // next grab the right bit
    int bit = posX;
    while(bit > 16)
    {
        bit = bit - 16;
    }

    //turn off the bit/pixel
    lcdPixels[posY][column] &= ~(1 << bit);
}

/* Call this to commit the current backBuffer to the LCD display*/
void commitBuffer(void)
{
    int h = 0;
    int w = 0;
    int k = 0;

    for(h=0; h < ROW_SIZE; h++)
    {
        for(w=0; w < COLUMN_SIZE; w++)
        {
            for(k=0; k < INT_SIZE; k++)
            {
                if((lcdPixels[h][w] & (1 << k)) >> k)
                {
                    lcd_point(((w * 16) + k), h, ON);
                }
                else
                {
                    lcd_point(((w * 16) + k), h, OFF);
                }
            }
        }
    }
}

所以我现在尝试使用malloc分配数组,但是也不行。我猜我就是做不到这个,160 * 160位数据量太大了....

@Simon - 这取决于平台。即使在桌面机上,曾经在 MS-DOS 上使用 16 位 int 是非常普遍的。我不会感到惊讶如果当前标准保证 int 的 32 位,但是当前标准并不总是当前的标准。 - user180247
这是我正在使用的板子的图片。 - WIllJBD
好的 - 也许你说得有道理,但编译器不这么认为?我刚刚查了一下板子,发现至少有两个编译器 - 德州仪器公司的编译器手册并没有明显的线索表明可能出了什么问题,尽管我显然还没有彻底阅读它。 - user180247
我正在使用基于Eclipse的Code Composer。 - WIllJBD
  1. 你的程序中几次出现了数字文字“16”。这是什么意思,是 sizeof int * CHAR_BIT 吗?
  2. 我不理解浮点数的东西。
  3. while(bit > 16) { bit = bit - 16; } 可以被 bit %= 16; 替换。
  4. 在位操作时,最好使用无符号类型。
- wildplasser
显示剩余4条评论
1个回答

2

您是否拥有64K的RAM或64K的闪存?我认为RBX430上有msp430f2274(http://www.ti.com/product/msp430f2274),它只有1K的RAM。


1
64k 闪存很可能已经足够了。所有内存位置的总大小加起来为64k。那么我需要分配它吗? - WIllJBD
1
确认处理器的型号,以便我们准确知道有多少内存可用。 - ekb
2
如果只有64k的闪存,将其用作显示器的后备缓冲区似乎是一个非常糟糕的想法。首先,对闪存的写入速度很慢,特别是在第一次写入周期之后,需要进行擦除周期。其次,闪存很快就会磨损 - 通常的数字是每个单元大约10,000次写入周期。以30帧每秒的速度计算,不到6分钟就可以杀死芯片。而且你也不可能得到30帧每秒的速度。此外,当你运行时,我期望大多数嵌入式CPU中的闪存看起来像ROM - 即它是放置代码和常量的地方,而不是变量。如果你只有1K RAM,你需要在没有后备缓冲区的情况下工作。 - user180247
1
M430F2274只有1K的RAM,这是像素缓冲区的位置。如上所述,FLASH存储器不能用于此操作。您需要管理25600个像素,如果您只分配了1位,则需要(160 * 160/8 =)3200字节,这仍然比可用RAM大。您需要直接操作显示内存。 - ekb
1
Flash是程序代码和常量所在的位置。RAM是变量所在的位置。在这些小型处理器上,RAM的节约非常重要。 - ekb
谢谢大家,我很担心这个问题。我希望我能创建自己的后备缓冲区,那会很有趣。好吧,我必须在我现有的限制内工作。谢谢大家。 - WIllJBD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接