TOG 0 25 июня Опубликовано 25 июня · Жалоба Товарищи, в микроконтроллерах, в частности в 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 называется). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 25 июня Опубликовано 25 июня · Жалоба запишите (остальные все 0xFFFFFFFF ...) 1. 0х7FFFFFF 2. 0x3FFFFFF 3. 0x1FFFFFF 4. 0x0FFFFFF 5. 0x07FFFFF ... м так до конца блока Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 25 июня Опубликовано 25 июня · Жалоба 30 минут назад, TOG сказал: Мне нужно сохранять счетчик времени во внутренней флэш памяти, максимально сберегая ее ресурс. В STM32H7 запись во внутренний флэш идет блоками по 32 байта. Если например сохранять счетчик каждую минуту записывая по 32 байта, то страницы памяти 128 кБ хватит всего на ~68 часов работы. ... И все эти 5 раз система обнаруживает только Single Error и позволяет считать данные. И о чём вы беспокоитесь? Стирательного ресурса одной страницы хватит на: 68*5*10000/24/365 = ~388 лет непрерывной работы. Неужто этого вам мало??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 25 июня Опубликовано 25 июня · Жалоба 1 hour ago, jcxz said: И о чём вы беспокоитесь? Стирательного ресурса одной страницы хватит на: 68*5*10000/24/365 = ~388 лет непрерывной работы. Неужто этого вам мало??? Надо ещё лампочку приделать к прибору, а то Солнце погаснет через 20 млн. лет. Как смотреть будут показания ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Raven 11 25 июня Опубликовано 25 июня · Жалоба 6 hours ago, TOG said: Товарищи, в микроконтроллерах, в частности в STM32 производитель использует ECC(Error Correction Code) для внутренней памяти МК. Поэтому записывать во внутренний флэш без предварительного стирания не так просто как в EEPROM. И что - ЕСС нельзя отключить? По идее, должна быть такая возможность, поскольку ECC для внутренней памяти - это далеко не всегда востребовано по-настоящему. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TOG 0 26 июня Опубликовано 26 июня · Жалоба 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, ни в кэш Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleksandr Baranov 1 26 июня Опубликовано 26 июня · Жалоба 10 hours ago, TOG said: ST пишет, что отключить нельзя ни фо флэш, ни в RAM, ни в кэш Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TOG 0 27 июня Опубликовано 27 июня · Жалоба 13 hours ago, Aleksandr Baranov said: Это только включает/отключает прерывание. На саму проверку это никак не влияет. Если уж Double Error словил, то возникает исключение Bus Fault. Если обработчик Bus Fault не подключен, то Hard Fault. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleksandr Baranov 1 27 июня Опубликовано 27 июня (изменено) · Жалоба То есть, Вы проверили, что при запрещенных прерываниях Bus Fault все равно происходит? Изменено 27 июня пользователем Aleksandr Baranov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 27 июня Опубликовано 27 июня · Жалоба 6 часов назад, Aleksandr Baranov сказал: То есть, Вы проверили, что при запрещенных прерываниях Bus Fault все равно происходит? BusFault в Cortex-M - это не прерывание, а исключение. Соответственно запрет прерываний влиять на него никак не может. И при запрете какого-либо fault-а (если его возможно запретить), согласно идеологии Cortex-M, должна выполниться эскалация до HardFault. Так что - fault-а не избежать, если уж подсистема памяти решила сгенерить ошибку. Да и причём тут прерывания или fault-ы? ТС ведь нужны не прерывания, а возможность прочитать память. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleksandr Baranov 1 28 июня Опубликовано 28 июня · Жалоба Да, правильно. Как-то это в RM мутновато описано. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться