Перейти к содержанию
    

Вопрос по Error Correction Code(SEC-DED)

Товарищи,

в микроконтроллерах, в частности в STM32 производитель использует ECC(Error Correction Code) для внутренней памяти МК.

Поэтому записывать во внутренний флэш без предварительного стирания не так просто как в EEPROM.

При чтении данных, которые были записаны без предварительного стирания могут возникать такие события:

1. "Single Error Correction" - это когда при чтении флэша система выявила одиночную ошибку, смогла ее исправить, но данные мы все-таки от нее получаем.

2.  "Double Error Detection" - это когда при чтении флэша система выявила двойную ошибку, это совсем плохо, возникает исключение Bus Error и данные мы не получаем.

Задача такая:

Мне нужно сохранять счетчик времени во внутренней флэш памяти, максимально сберегая ее ресурс.

В STM32H7 запись во внутренний флэш идет блоками по 32 байта. Если например сохранять счетчик каждую минуту записывая по 32  байта, то страницы памяти 128 кБ хватит всего на ~68 часов работы.

Однако, вот что я обнаружил. (Хотя наверно это уже давно всем известно)

Первый раз пишем такую последовательность(32 байта):

1, 2, 4, 8, 16, 32, 64, 128, 1, 2, 4, 8, 16, 32, 64, 128, 1, 2, 4, 8, 16, 32, 64, 128, 1, 2, 4, 8, 16, 32, 64, 128

Пишем поверх нее:

0, 2, 4, 8, 16, 32, 64, 128, 1, 2, 4, 8, 16, 32, 64, 128, 1, 2, 4, 8, 16, 32, 64, 128, 1, 2, 4, 8, 16, 32, 64, 128

Пишем поверх нее:

0, 0, 4, 8, 16, 32, 64, 128, 1, 2, 4, 8, 16, 32, 64, 128, 1, 2, 4, 8, 16, 32, 64, 128, 1, 2, 4, 8, 16, 32, 64, 128

Пишем поверх нее:

0, 0, 0, 8, 16, 32, 64, 128, 1, 2, 4, 8, 16, 32, 64, 128, 1, 2, 4, 8, 16, 32, 64, 128, 1, 2, 4, 8, 16, 32, 64, 128

Пишем поверх нее:

0, 0, 0, 0, 16, 32, 64, 128, 1, 2, 4, 8, 16, 32, 64, 128, 1, 2, 4, 8, 16, 32, 64, 128, 1, 2, 4, 8, 16, 32, 64, 128

Пишем поверх нее:

0, 0, 0, 0, 0, 32, 64, 128, 1, 2, 4, 8, 16, 32, 64, 128, 1, 2, 4, 8, 16, 32, 64, 128, 1, 2, 4, 8, 16, 32, 64, 128

И все эти 5 раз система обнаруживает только Single Error и позволяет считать данные. 

Однако дальше я не продвинулся. Дальше всегда у меня возникал Double Error Detection и данные считать уже не получалось.  

Хотелось бы узнать у форума, как бы вычислить заранее побольше  таких кодов, которые бы распознавались системой как одиночные ошибки, чтобы без стирания уместить в эти 32 байта как можно больше значений счетчика.

ST пишет, что сей алгоритм основан на коде Хэмминга(SEC-DED называется).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

запишите (остальные все 0xFFFFFFFF ...)
1. 0х7FFFFFF
2. 0x3FFFFFF
3. 0x1FFFFFF
4. 0x0FFFFFF
5. 0x07FFFFF
...
м так до конца блока

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

30 минут назад, TOG сказал:

Мне нужно сохранять счетчик времени во внутренней флэш памяти, максимально сберегая ее ресурс.

В STM32H7 запись во внутренний флэш идет блоками по 32 байта. Если например сохранять счетчик каждую минуту записывая по 32  байта, то страницы памяти 128 кБ хватит всего на ~68 часов работы.

...

И все эти 5 раз система обнаруживает только Single Error и позволяет считать данные. 

И о чём вы беспокоитесь? Стирательного ресурса одной страницы хватит на: 68*5*10000/24/365 = ~388 лет непрерывной работы. Неужто этого вам мало???  :shok:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, jcxz said:

И о чём вы беспокоитесь? Стирательного ресурса одной страницы хватит на: 68*5*10000/24/365 = ~388 лет непрерывной работы. Неужто этого вам мало???  :shok:

Надо ещё лампочку приделать к прибору, а то Солнце погаснет через 20 млн. лет. Как смотреть будут показания ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 hours ago, TOG said:

Товарищи,

в микроконтроллерах, в частности в STM32 производитель использует ECC(Error Correction Code) для внутренней памяти МК.

Поэтому записывать во внутренний флэш без предварительного стирания не так просто как в EEPROM.

И что - ЕСС нельзя отключить? По идее, должна быть такая возможность, поскольку ECC для внутренней памяти - это далеко не всегда востребовано по-настоящему.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 hours ago, x893 said:

запишите (остальные все 0xFFFFFFFF ...)
1. 0х7FFFFFF
2. 0x3FFFFFF
3. 0x1FFFFFF
4. 0x0FFFFFF
5. 0x07FFFFF
...
м так до конца блока

Срабатывает только на 0x7FFFFFFF, 0x3FFFFFFF,

а на 0x1FFFFFFF уже возникает Double Error Detection и "лавочка закрывается".

Сдается мне, что эти числа можно как-то рассчитать заранее, чтобы они проходили проверку ECC, либо только вызывали Single Error.

Quote

И что - ЕСС нельзя отключить? По идее, должна быть такая возможность, поскольку ECC для внутренней памяти - это далеко не всегда востребовано по-настоящему.

ST пишет, что отключить нельзя ни фо флэш, ни в RAM, ни в кэш

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 hours ago, TOG said:

ST пишет, что отключить нельзя ни фо флэш, ни в RAM, ни в кэш

image.thumb.png.5982df49c199529113a4805490956e82.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 hours ago, Aleksandr Baranov said:

image.thumb.png.5982df49c199529113a4805490956e82.png

Это только включает/отключает прерывание. На саму проверку это никак не влияет.

Если уж Double Error словил, то возникает исключение Bus Fault. Если обработчик Bus Fault не подключен, то Hard Fault.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

То есть, Вы проверили, что при запрещенных прерываниях Bus Fault все равно происходит?

Изменено пользователем Aleksandr Baranov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 часов назад, Aleksandr Baranov сказал:

То есть, Вы проверили, что при запрещенных прерываниях Bus Fault все равно происходит?

BusFault в Cortex-M - это не прерывание, а исключение. Соответственно запрет прерываний влиять на него никак не может.

И при запрете какого-либо fault-а (если его возможно запретить), согласно идеологии Cortex-M, должна выполниться эскалация до HardFault. Так что - fault-а не избежать, если уж подсистема памяти решила сгенерить ошибку.

Да и причём тут прерывания или fault-ы? ТС ведь нужны не прерывания, а возможность прочитать память.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...