我使用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数组并进行位操作来保存值:如何设置、清除和切换单个位?