Flash ECC алгоритм на STM32L1xx - PullRequest
0 голосов
/ 29 мая 2018

Как работает алгоритм Flash ECC (код исправления ошибок Flash), реализованный на STM32L1xx?

Справочная информация. Я хочу выполнить несколько инкрементных записей в одно слово в программной флэш-памяти микроконтроллера STM32L151 без выполнения страницыстереть между.Без ECC можно устанавливать биты постепенно, например, сначала 0x00, затем 0x01, затем 0x03 (STM32L1 стирает биты в 0, а не в 1) и т. Д. Поскольку STM32L1 имеет 8-битный ECC на слово, этот метод не работает.Однако, если бы мы знали алгоритм ECC, мы могли бы легко найти короткую последовательность значений, которая могла бы записываться постепенно, без нарушения ECC.

Мы могли бы просто попробовать различные последовательности значений и посмотреть, какие из них работают (однотакая последовательность 0x0000001, 0x00000101, 0x00030101, 0x03030101), но если мы не знаем алгоритм ECC, мы не можем проверить, нарушает ли последовательность ECC, и в этом случае исправление ошибок не будет работать, если биты будут повреждены.

[Edit] Функциональность должна использоваться для реализации простой файловой системы, использующей внутреннюю программную память STM32L1.Куски данных помечаются заголовком, который содержит состояние.Несколько кусков могут находиться на одной странице.Состояние может меняться со временем (сначала «новый», затем «использованный», затем «удаленный» и т. Д.).Количество состояний невелико, но это значительно упростило бы ситуацию, если бы мы могли перезаписать предыдущее состояние без необходимости сначала удалять всю страницу.

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Интересный вопрос.

Сначала я должен сказать, что даже если вы обнаружите алгоритм ECC, вы не сможете на него положиться, так как он не задокументирован и может быть изменен в любое время без уведомления.

Но выяснить, что алгоритм представляется возможным с разумным количеством тестов.
Я бы попытался построить тесты, которые начинаются с постоянного значения и затем очищают только один бит.
Когда выпрочитайте значение, и это начальное значение, ваш бит не может изменить все необходимые биты в ECC.

Например:

for <bitIdx>=0 to 31
  earse cell
  write start value, like 0xFFFFFFFF & ~(1<<testBit)
  clear bit <bitIdx> in the cell
  read the cell
next

Если вы найдете начальное значение, в котором тесты стирания работают для всех битов, то для начального значения, вероятно, установлен ECC всех битов.
Редактировать: Это должно быть верно для любого ECC, поскольку для каждого ECC всегда требуется как минимум разность в два бита для обнаружения и исправления, надежный один дефектный бит.
Поскольку первое различие в разрядах находится в самом значении,второе изменение должно быть в скрытых битах ECC, и скрытые биты будут очень ограничены.

Если вы повторите этот тест с другими начальными значениями, вы сможете собрать достаточно данных, чтобы доказать, какая именно коррекция ошибокиспользуется.

0 голосов
/ 01 июня 2018

Спасибо за любые комментарии!Поскольку пока нет ответов, я резюмирую то, что я выяснил (эмпирически и на основе комментариев к этому ответу):

  • Согласно таблице данных STM32L1 "Весь энергонезависимыйПамять встраивает функцию кода исправления ошибок (ECC). ", но в справочном руководстве ничего не говорится о ECC в памяти программ.
  • Таблица данных соответствует тому, что мы можем найти эмпирически, когда последовательно записываем несколькослова в одну и ту же папку программы без стирания промежуточной страницы.В таких случаях некоторые последовательности значений работают, а другие нет.

Ниже приведены мои личные выводы, основанные на эмпирических результатах, ограниченных исследованиях и комментариях из этой цепочки.Это не на основании официальной документации.Не создавайте на этом серьезную работу (я тоже не буду)!

  • Кажется, что ECC вычисляется и сохраняется для 32-битного слова.Если это так, ECC должен иметь длину не менее 7 бит.
  • ECC каждого слова, вероятно, записывается в тот же энергонезависимый элемент памяти, что и само слово.Поэтому применяются те же ограничения.Т.е. между стиранием могут быть установлены только дополнительные биты.Как указал Старк, мы можем перезаписывать слова в программной памяти только значениями, которые:

    • Только устанавливают дополнительные биты, но не сбрасывают биты
    • Имеют ECC, который также устанавливает толькодополнительные биты по сравнению с предыдущим ECC.
  • Если мы записываем значение, которое устанавливает только дополнительные биты, но ECC необходимо будет очищать биты (и, следовательно, не может быть написано правильно), затем:

    • Если ECC неверен на один бит, ошибка исправляется алгоритмом ECC, и записанное значение может быть прочитано правильно.Тем не менее, ECC больше не будет работать, если произойдет сбой другого бита, потому что ECC может исправлять только однобитовые ошибки.
    • Если ECC ошибочен более чем на один бит, алгоритм ECC не может исправить ошибку и чтениезначение будет неправильным.
  • Мы не можем (легко) определить эмпирически, какие последовательности значений могут быть записаны правильно, а какие нет.Если последовательность значений может быть записана и прочитана правильно, мы не будем знать, связано ли это с автоматическим исправлением однобитовых ошибок.Этот аспект является полной причиной того, что этот вопрос требует фактического алгоритма.

  • Сам алгоритм ECC кажется недокументированным.Код Хемминга, по-видимому, является широко используемым алгоритмом для ECC, и в AN4750 они пишут, что код Хемминга фактически используется для исправления ошибок в SRAM.Алгоритм может или не может использоваться для памяти программ STM32L1.

  • Справочное руководство STM32L1 , по-видимому, явно не запрещает многократную запись в память программы без стирания,но нет никаких документов, подтверждающих противоположность.Чтобы не использовать недокументированную функциональность, мы не будем использовать такую ​​функциональность в наших продуктах и ​​находим обходные пути.

...