请注意,常量仍将占用RAM空间。对于大型常量数组,您可能需要考虑将它们放入程序空间(也称为Flash或非易失性空间)。以下是一个示例。
const uint8_t BitFont[] PROGMEM = {
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,2,
B10000000,B10000000,B10000000,B10000000,B10000000,B00000000,B10000000,B00000000,1,
B00000000,B00000000,B11100000,B11100000,B11100000,B00000000,B00000000,B00000000,3,
};
#define BITFONT_X_SIZE (sizeof(BitFont)/sizeof(BitFont[0]))
void setup() {
Serial.println("");
Serial.print(F("BitFont[] = "));
for(int y = 0 ; y < BITFONT_X_SIZE ; y++) {
Serial.print(pgm_read_byte_near( &(BitFont[1]) ) );
Serial.print(F(","));
}
Serial.println("");
}
请注意有三件事情正在发生。首先,avr-gcc使用PROGMEM宏将其链接到程序空间。第二,pgm_read_byte_near函数用于从程序空间读取指针。由于需要使用特殊操作码来读取程序空间。
第三个与您的示例不直接相关但相似的是在Serial.print()中使用的F()函数,它将常量字符串放入程序空间。否则,在Serial.print中的字符串将消耗静态RAM。
或者您可以创建一个矩阵(matrix)
#define BRICK_COLUMNS 9
const uint8_t BitFont[][BRICK_COLUMNS] PROGMEM = {
{B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,2},
{B10000000,B10000000,B10000000,B10000000,B10000000,B00000000,B10000000,B00000000,1},
{B00000000,B00000000,B11100000,B11100000,B11100000,B00000000,B00000000,B00000000,3}
};
#define BITFONT_X_SIZE (sizeof(BitFont)/sizeof(BitFont[0]))
void setup() {
Serial.println("");
for(int x = 0 ; x < BITFONT_X_SIZE ; x++) {
Serial.print(F("BitFont["));
Serial.print(x);
Serial.print(F("][y] = "));
for(int y = 0 ; y < BRICK_COLUMNS ; y++) {
Serial.print(pgm_read_byte_near ( &(BitFont[1]) ));
Serial.print(F(","));
}
Serial.println("");
}
Serial.println("");
}
B000
表示法来进行初始化... - merlin2011char*
数组的特定typedef
,以便它具有某种指定的范围。使用char BitFont[]
进行相同的声明就可以正常工作。 - HavenardB
前缀确实是 Arduino 的一个特性。虽然我不能确定为什么他们没有选择0b
(尽管这是 gcc 的扩展,但也值得一提)。 - dlf