Không gian EEPROM, như đã đề cập, sẽ hoạt động nếu không bắt buộc phải bay hơi. Tuy nhiên, bạn chưa đủ điều kiện nếu nó cần phải không biến động hay không. Nếu không thì bạn có thể sử dụng __attribution__ để xác định không gian biến không được khởi tạo. Vì SRAM trên ATmega không bị xóa bằng cách đặt lại hoặc chu kỳ nguồn. Trình biên dịch mặc định để khởi tạo chúng. Trường hợp này có thể được tắt cho mỗi biến như trong ví dụ dưới đây:
//non-initialized value
union configUnion{
uint8_t byte[6]; // match the below struct...
struct {
uint16_t value1;
uint16_t value2;
uint16_t chksum;
} val ;
} config __attribute__ ((section (".noinit")));
void setup() {
uint16_t sum;
//Initialize serial and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
// prints title with ending line break
Serial.print("Out of Reset -");
sum = getchksum();
printValues();
if (sum != config.val.chksum) {
config.val.chksum = sum;
Serial.print("chksum is incorrect setting config.val.chksum = 0x"); Serial.println(config.val.chksum, HEX);
}
config.val.value1++;
config.val.value2++;
Serial.print("setup new values - ");
printValues();
config.val.chksum = getchksum();
Serial.print("updating chksum config.val.chksum = 0x"); Serial.println(config.val.chksum, HEX);
}
int counter = 0;
void loop() {
if (counter < 200) {
Serial.print("after a while - ");
printValues();
Serial.println();
while (true) {
continue;
}
}
counter++;
}
void printValues() {
Serial.print(" value1 = 0x"); Serial.print(config.val.value1, HEX);
Serial.print(", value2 = 0x"); Serial.print(config.val.value2, HEX);
Serial.print(", sum = 0x"); Serial.print(getchksum(), HEX);
Serial.print(", chksum = 0x"); Serial.println(config.val.chksum, HEX);
}
uint16_t getchksum() {
int sum = 0;
for (int position = 0; position < (sizeof(config) - sizeof(config.val.chksum)); position++) {
sum = sum + config.byte[position];
}
return sum;
}
Đầu ra của mã trên là dưới đây. Lưu ý rằng đầu ra đầu tiên là kết quả của việc bật nguồn UNO lên với nút Reset được ấn xuống và sau đó được giải phóng sau khi cửa sổ Monitor được khởi động. Nếu không, bản in "cài đặt không chính xác" sẽ bị bỏ lỡ, trước khi cửa sổ màn hình có thể được khởi động.
Out of Reset - value1 = 0xBFED, value2 = 0xD2F9, sum = 0x377, chksum = 0xF457
chksum is incorrect setting config.val.chksum = 0x377
setup new values - value1 = 0xBFEE, value2 = 0xD2FA, sum = 0x379, chksum = 0x377
updating chksum config.val.chksum = 0x379
after a while - value1 = 0xBFEE, value2 = 0xD2FA, sum = 0x379, chksum = 0x379
Out of Reset - value1 = 0xBFEE, value2 = 0xD2FA, sum = 0x379, chksum = 0x379
setup new values - value1 = 0xBFEF, value2 = 0xD2FB, sum = 0x37B, chksum = 0x379
updating chksum config.val.chksum = 0x37B
after a while - value1 = 0xBFEF, value2 = 0xD2FB, sum = 0x37B, chksum = 0x37B
Out of Reset - value1 = 0xBFEF, value2 = 0xD2FB, sum = 0x37B, chksum = 0x37B
setup new values - value1 = 0xBFF0, value2 = 0xD2FC, sum = 0x37D, chksum = 0x37B
updating chksum config.val.chksum = 0x37D
after a while - value1 = 0xBFF0, value2 = 0xD2FC, sum = 0x37D, chksum = 0x37D
Với điều này, các biến của bạn sẽ được đặt lại. Miễn là sức mạnh không bị mất. Lưu ý ở trên, nơi bạn sẽ nhận được dữ liệu ngẫu nhiên, để bắt đầu.
Sử dụng EEPROM hoặc .noinit Tôi sẽ khuyên bạn nên kiểm tra không gian biến liên tục của mình trong khi thiết lập và nếu không chính xác, bạn có thể khởi tạo hoặc đưa ra cảnh báo.