考虑到有限的RAM空间,如何在C语言中声明和使用大小为[16][256]的二维int数组



我使用avr-8位MCU。它的RAM大小为2K。我必须声明并使用一个大小为[16][256]的int型变量。这台机器上的整型是2字节。这个数组将消耗2*16*256 = 8k。这个大小是不能接受的,因为我只有2K内存。

我必须使用这个二维数组来存储正在写入的闪存页的状态。这个数组将接受1或0个值。1表示写入flash内存中的页面,0表示未写入flash内存中的页面。

我正在寻找如何存储此状态的解决方案。不确定位域在这里是否有帮助。

如果您只想使用数组来存储布尔数据,则不需要每个字段的整个16位。

存储16*256位只需要512字节。

以下示例中的makros可用于访问16 x N缓冲区中的值:

#include <stdio.h>
#include <stdint.h>
#define BIT_ISSET(a, x, y)      ((a[x] &  (1<<y))!=0)
#define BIT_SET(a, x, y)         (a[x] |= (1<<y))
#define BIT_CLEAR(a, x, y)       (a[x] &= (1<<y)^0xffff)
int main()
{
    uint16_t values[256] = {0};
    // set some bits
    BIT_SET(values, 3, 0);
    BIT_SET(values, 3, 1);
    BIT_SET(values, 3, 2);
    BIT_SET(values, 3, 3);
    BIT_SET(values, 3, 15);
    // clear one of the previously set bits
    BIT_CLEAR(values, 3, 2);
    int i,j;
    for (i=0;i<256;i++) { // 256 rows
        for (j=0;j<16;j++) { // 16 columns
            printf("%i", BIT_ISSET(values, i, j));
        }
        printf("n");
    }
    return 0;
}

可以使用位来代替数组。你只需要256*16位。所以256*16/8 = 384字节就足够了。您可以为此使用char数组并进行位操作来保存值:如何设置、清除和切换单个位?

相关内容

  • 没有找到相关文章

最新更新