Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Чтение из флеш памяти.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Jenya7
Какая то мистика.

Пробую так
Код
#define PFLASH_BLOCK_BASE  0x00000000U
#define PSECTOR_SIZE               0x00001000U  /* 4 KB size */
#define USER_PAGE                   250
#define USER_PAGE_START_ADDR   (PFLASH_BLOCK_BASE + (USER_PAGE * PSECTOR_SIZE))

uint8_t buff[4];
uint32_t addr = USER_PAGE_START_ADDR;
memcpy(&buff, (uint8_t*)addr, 4);

или так
Код
uint32_t I = *((uint32_t *) addr)

в первом случае вылетает в эксепшен (на картинке). во втором брэкпоинт остается на месте и не двигается.


я думал что нет такого адреса. но
0x00000000U + (250 * 0x00001000U) = 0xFA000

там правда непонятно что записано. ну так считался бы мусор.
k155la3
Попробуйте вместо
memcpy(&buff, (uint8_t*)addr, 4);
скормить ему
memcpy(&buff[0], (uint8_t*)addr, 4);
или
memcpy(buff, (uint8_t*)addr, 4);
sm.gif
ps
А так получается, что Вы собираетесь затереть память, где расположен указатель/имя массива.
Jenya7
Цитата(k155la3 @ Nov 17 2016, 20:03) *
Попробуйте вместо
memcpy(&buff, (uint8_t*)addr, 4);
скормить ему
memcpy(&buff[0], (uint8_t*)addr, 4);
или
memcpy(buff, (uint8_t*)addr, 4);
sm.gif
ps
А так получается, что Вы собираетесь затереть память, где расположен указатель/имя массива.

работают все три метода sm.gif. сегодня компайлеры наверно идут с foolproof. sm.gif
ситуация такая. может во время записи дернулось питание или что то вроде этого и в ячейках мы видим какой то мусор -- -- -- -- . но если записалось корректно то считывание проходит нормально. что же получается - если считываем битые ячейки вываливаемся в эксепшн?
AVI-crak
Прежде чем что-то писать/читать из флеша - нужно расставить буйки. Точнее поделить основную флешь память на две части ещё в линкере. Назначить уникальное имя для оставшейся части флеша. Создать статическую структуру с расположением в этой части флеш. Запихнуть в структуру всё что требуется, со всеми немыслимыми выкрутасами. Например это 20 копий секретной инфы, которая должна меняться при каждом важном для вас событии. Если хорошо постараться - то можно уместиться в две-три страницы. Есно структуру объединить с более простым и наглядным двойным массивом. В событии будет запись новой структуры на чистое место, или стирание страницы и записи на новое чистое место. Поиск по возрастающему номеру в записи (для каждой страницы отдельное пространство цифр, например от 1 до 10, и от 11 до 21). Проверка на ликвидность записи - по чтению копии, и сверке rcr. Битые ячейки рано или поздно появятся, это норма.

Тогда можно полностью избавится от указателей, и попаданием пальцем в небо. И главное - стабильное выполнение программы в не зависимости от уровня оптимизации.

И ещё, memcpy, если это ваша личная функция - то написана она явно не слишком аккуратно. Флеш память мк в принудительном режиме читается/пишется по 8-16-32-64 бита - у разных моделей по разному. Зависит от конкретной модели мк. А прямая запись с неродным размером приёмного регистра - просто не корректна.
Jenya7
Цитата(AVI-crak @ Nov 17 2016, 22:21) *
Прежде чем что-то писать/читать из флеша - нужно расставить буйки. Точнее поделить основную флешь память на две части ещё в линкере. Назначить уникальное имя для оставшейся части флеша. Создать статическую структуру с расположением в этой части флеш. Запихнуть в структуру всё что требуется, со всеми немыслимыми выкрутасами. Например это 20 копий секретной инфы, которая должна меняться при каждом важном для вас событии. Если хорошо постараться - то можно уместиться в две-три страницы. Есно структуру объединить с более простым и наглядным двойным массивом. В событии будет запись новой структуры на чистое место, или стирание страницы и записи на новое чистое место. Поиск по возрастающему номеру в записи (для каждой страницы отдельное пространство цифр, например от 1 до 10, и от 11 до 21). Проверка на ликвидность записи - по чтению копии, и сверке rcr. Битые ячейки рано или поздно появятся, это норма.

Тогда можно полностью избавится от указателей, и попаданием пальцем в небо. И главное - стабильное выполнение программы в не зависимости от уровня оптимизации.

И ещё, memcpy, если это ваша личная функция - то написана она явно не слишком аккуратно. Флеш память мк в принудительном режиме читается/пишется по 8-16-32-64 бита - у разных моделей по разному. Зависит от конкретной модели мк. А прямая запись с неродным размером приёмного регистра - просто не корректна.

да но почему при чтении битых ячеек я вылетаю в эксепшен?
HardEgor
Цитата(Jenya7 @ Nov 17 2016, 23:39) *
да но почему при чтении битых ячеек я вылетаю в эксепшен?

Битые ячейки не причем. Флэш - это железяка прямая, она просто читает и выдает то что прочитала.
В исключение вылетает программа, а вот почему она вылетает, тут много вариантов, один из - переполнение стека. Или где-то за границы массива вылетает и т.д.
AVI-crak
Цитата(Jenya7 @ Nov 17 2016, 22:39) *
да но почему при чтении битых ячеек я вылетаю в эксепшен?


Я не понимаю слова "эксепшен"...
Читать флешь память можно двумя способами, по прямому адресу и через мапинг.
Прямой адрес флеша для st - обычно висит на 0x08000000. И читается/пишется исключительно родным для этой флеши размером посылки. Каким размером читать/писать - нужно смотреть доки на конкретный чип.
Первый попавшийся пример из инета http://easystm32.ru/for-beginners/38-flash-stm32

И через мапинг, с нулевого физического адреса. По этому адресу может оказаться как флеш память, так и рам память, и даже внешняя память. Всё зависит от состояния ножек boot, и регистров переадресации мапинг. В случае когда по дефолту загрузка идёт с флеша (без всяких ускорителей как M7) - то флеш становится доступной для чтения с нулевого адреса. Вот тут её можно читать как угодно, и вдоль и поперёк и по 8 бит и по 64 бита за раз - как хочется. Все эти выкрутасы обработаются системной шиной - именно она будет читать флешь память. Записать через шину не получится.
Jenya7
Цитата(AVI-crak @ Nov 17 2016, 23:51) *
Я не понимаю слова "эксепшен"...
Читать флешь память можно двумя способами, по прямому адресу и через мапинг.
Прямой адрес флеша для st - обычно висит на 0x08000000. И читается/пишется исключительно родным для этой флеши размером посылки. Каким размером читать/писать - нужно смотреть доки на конкретный чип.
Первый попавшийся пример из инета http://easystm32.ru/for-beginners/38-flash-stm32

И через мапинг, с нулевого физического адреса. По этому адресу может оказаться как флеш память, так и рам память, и даже внешняя память. Всё зависит от состояния ножек boot, и регистров переадресации мапинг. В случае когда по дефолту загрузка идёт с флеша (без всяких ускорителей как M7) - то флеш становится доступной для чтения с нулевого адреса. Вот тут её можно читать как угодно, и вдоль и поперёк и по 8 бит и по 64 бита за раз - как хочется. Все эти выкрутасы обработаются системной шиной - именно она будет читать флешь память. Записать через шину не получится.

у меня не STM32 а Kinetis K-70. но для чтения как мне кажется это не принципиально. чтение прозрачно - просто обращение к адресу. на картинках ясно видно что при обращении к 0x000FA000 когда там -- -- -- -- -- -- -- (вторая картинка) при чтении возникает <Exeption frame> и мы попадаем в default_isr (первая картинка).
но если записались нормальные данные (третья картинка) все считывается нормально. если сам факт имеет место быть то камень надо менять. не дай бог такое произойдет в полевых условиях.
Сергей Борщ
QUOTE (Jenya7 @ Nov 20 2016, 11:19) *
когда там -- -- -- -- -- -- --
Но вы же сами понимаете, что данных "-- -- -- -- -- -- --" быть не может. Таким образом отладчик вам показывает, что эта область памяти недоступна для чтения. Я не знаю, по какой причине она недоступна - это должно быть описано в документации на ваш контроллер. Возможно она просто все еще выполняет предыдущую операцию стирания или записи со стиранием. В той же документации может быть написано, что попытки обращения к памяти в эти моменты вызывают исключение (мы же на русскоязычном форуме, в конце концов). В любом случае прочитать эту документацию вам придется.
Jenya7
Цитата(Сергей Борщ @ Nov 20 2016, 14:59) *
Но вы же сами понимаете, что данных "-- -- -- -- -- -- --" быть не может. Таким образом отладчик вам показывает, что эта область памяти недоступна для чтения. Я не знаю, по какой причине она недоступна - это должно быть описано в документации на ваш контроллер. Возможно она просто все еще выполняет предыдущую операцию стирания или записи со стиранием. В той же документации может быть написано, что попытки обращения к памяти в эти моменты вызывают исключение (мы же на русскоязычном форуме, в конце концов). В любом случае прочитать эту документацию вам придется.

мысль конечно интересная. полез в документацию в Flash Memory Controller (FMC). в статус регистре есть флаги указывающие какие ошибки были при записи. можно держать глобальный флаг говорящий - была ошибка нельзя читать. но при перезагрузке этот флаг будет потерян. или вытащить данные до ошибки записи, стереть страницу и записать все данные повторно.
HardEgor
Цитата(Jenya7 @ Nov 20 2016, 16:54) *
мысль конечно интересная. полез в документацию в Flash Memory Controller (FMC). в статус регистре есть флаги указывающие какие ошибки были при записи. можно держать глобальный флаг говорящий - была ошибка нельзя читать. но при перезагрузке этот флаг будет потерян. или вытащить данные до ошибки записи, стереть страницу и записать все данные повторно.

Значит где-то недочитали - ведь картинку с "-- -- -- -- -- -- --" как-то получили и никто не вылетел в исключение.
Возможно ваша подпрограмма чтения из флеш не обрабатывает какие-то ошибки или не читает дополнительные флаги.
Jenya7
Цитата(HardEgor @ Nov 20 2016, 16:51) *
Значит где-то недочитали - ведь картинку с "-- -- -- -- -- -- --" как-то получили и никто не вылетел в исключение.
Возможно ваша подпрограмма чтения из флеш не обрабатывает какие-то ошибки или не читает дополнительные флаги.

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

хотя я допускаю что это не аппаратное а программное исключение. тогда надо искать пути пресечения этого безобразия.
AVI-crak
Цитата(Jenya7 @ Nov 20 2016, 14:19) *
у меня не STM32 а Kinetis K-70.

Разницы нет.
Карту адресов смотрят в референсе - самая жирная дока.
Осталось выяснить какой именно у вас чип, иначе дальше не продвинетесь.
Дока на серию http://www.nxp.com/assets/documents/data/e...56M150SF3RM.pdf

Нажмите для просмотра прикрепленного файла

0x000FA000 - реально в молоко попали, там пусто.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.