Arduino:Примеры/EEPROMCrc

Материал из Онлайн справочника
Версия от 22:43, 13 декабря 2016; Myagkij (обсуждение | вклад) (Замена текста — «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">» на «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Проверка EEPROM-памяти по методу CRC[1]

Микроконтроллер на плате Arduino/Genuino имеет, как правило, 512 байт EEPROM-памяти (у моделей Uno и Mega ее объем составляет 1 Кб и 4 Кб соответственно) – она хранит информацию, даже если плата находится в выключенном состоянии. Другими словами, это что-то вроде крошечного жесткого диска.

CRC – это простой способ проверки, были ли данные изменены или повреждены. Это что-то вроде подписи, т.е. любое изменение CRC-значения означает, что сохраненные данные тоже изменились. Целью данного примера является показать, как объект EEPROM можно использовать в виде массива. В нем CRC-значение рассчитывается прямо на EEPROM-данных.

Необходимое оборудование

  • Плата Arduino или Genuino

Цепь

Для этого примера цепь строить не нужно.

Схема

Код

/***
    Автор – Кристофер Эндрюс (Christopher Andrews).
    CRC-алгоритм генерируется CRC-калькулятором pycrc, лицензия MIT (https://github.com/tpircher/pycrc ).

   CRC – это простой способ проверки, были ли данные изменены 
или повреждены. Целью данного примера является показать, как объект
EEPROM можно использовать в виде массива. В нем CRC-значение 
рассчитывается прямо на EEPROM-данных.

***/

#include <Arduino.h>
#include <EEPROM.h>

void setup() {

  // запускаем последовательную коммуникацию:
  Serial.begin(9600);
  while (!Serial) {
    ; // ждем подключения последовательного порта (нужно только для плат со штатным USB-портом) 
  }

  // Показываем объем данных, которые будут подвержены CRC-проверке:
  Serial.print("EEPROM length: "); // "Объем данных: "
  Serial.println(EEPROM.length());

  // Показываем результат вызова функции eeprom_crc():
  Serial.print("CRC32 of EEPROM data: 0x"); // "CRC32-значение EEPROM-данных: 0x"
  Serial.println(eeprom_crc(), HEX);
  Serial.print("\n\nDone!"); // "\n\nГотово!"

}

void loop() {
  /* пустой цикл */
}

unsigned long eeprom_crc(void) {

  const unsigned long crc_table[16] = {
    0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac,
    0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
    0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c,
    0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c
  };

  unsigned long crc = ~0L;

  for (int index = 0 ; index < EEPROM.length()  ; ++index) {
    crc = crc_table[(crc ^ EEPROM[index]) & 0x0f] ^ (crc >> 4);
    crc = crc_table[(crc ^ (EEPROM[index] >> 4)) & 0x0f] ^ (crc >> 4);
    crc = ~crc;
  }
  return crc;
}

См.также

  1. EEPROM.read()
  2. EEPROM library reference
  3. EEPROM Clear - Fills the content of the EEPROM memory with “0”.
  4. EEPROM Read – Reads values stored into EEPROM and prints them on Serial.
  5. EEPROM Write – Stores values read from A0 into EEPROM.
  6. EEPROM Iteration – Programming examples on how to go through the EEPROM memory locations.
  7. EEPROM Put – Put values in EEPROM using variable semantics (differs from EEPROM.write() ).
  8. EEPROM Get – Get values from EEPROM and prints as float on serial.
  9. EEPROM Update – Stores values read from A0 into EEPROM, writing the value only if different, to increase EEPROM life.

Внешние ссылки