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

How to declare and use a 2-D int array of size [16][256] in C considering the limited RAM space.?

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

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

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

您可以使用位而不是数组。你只需要 256*16 位。所以256*16/8 = 384字节就够了。您可以为此使用 char 数组并进行位操作以保存值:How do you set, clear, and toggle a single bit?

如果只想使用数组存储布尔数据,则不需要每个字段全部 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;
}