jenya7 0 17 ноября, 2016 Опубликовано 17 ноября, 2016 (изменено) · Жалоба Какая то мистика. Пробую так #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 там правда непонятно что записано. ну так считался бы мусор. Изменено 17 ноября, 2016 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 17 ноября, 2016 Опубликовано 17 ноября, 2016 (изменено) · Жалоба Попробуйте вместо memcpy(&buff, (uint8_t*)addr, 4); скормить ему memcpy(&buff[0], (uint8_t*)addr, 4); или memcpy(buff, (uint8_t*)addr, 4); :) ps А так получается, что Вы собираетесь затереть память, где расположен указатель/имя массива. Изменено 17 ноября, 2016 пользователем k155la3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 17 ноября, 2016 Опубликовано 17 ноября, 2016 · Жалоба Попробуйте вместо memcpy(&buff, (uint8_t*)addr, 4); скормить ему memcpy(&buff[0], (uint8_t*)addr, 4); или memcpy(buff, (uint8_t*)addr, 4); :) ps А так получается, что Вы собираетесь затереть память, где расположен указатель/имя массива. работают все три метода :). сегодня компайлеры наверно идут с foolproof. :) ситуация такая. может во время записи дернулось питание или что то вроде этого и в ячейках мы видим какой то мусор -- -- -- -- . но если записалось корректно то считывание проходит нормально. что же получается - если считываем битые ячейки вываливаемся в эксепшн? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVI-crak 0 17 ноября, 2016 Опубликовано 17 ноября, 2016 · Жалоба Прежде чем что-то писать/читать из флеша - нужно расставить буйки. Точнее поделить основную флешь память на две части ещё в линкере. Назначить уникальное имя для оставшейся части флеша. Создать статическую структуру с расположением в этой части флеш. Запихнуть в структуру всё что требуется, со всеми немыслимыми выкрутасами. Например это 20 копий секретной инфы, которая должна меняться при каждом важном для вас событии. Если хорошо постараться - то можно уместиться в две-три страницы. Есно структуру объединить с более простым и наглядным двойным массивом. В событии будет запись новой структуры на чистое место, или стирание страницы и записи на новое чистое место. Поиск по возрастающему номеру в записи (для каждой страницы отдельное пространство цифр, например от 1 до 10, и от 11 до 21). Проверка на ликвидность записи - по чтению копии, и сверке rcr. Битые ячейки рано или поздно появятся, это норма. Тогда можно полностью избавится от указателей, и попаданием пальцем в небо. И главное - стабильное выполнение программы в не зависимости от уровня оптимизации. И ещё, memcpy, если это ваша личная функция - то написана она явно не слишком аккуратно. Флеш память мк в принудительном режиме читается/пишется по 8-16-32-64 бита - у разных моделей по разному. Зависит от конкретной модели мк. А прямая запись с неродным размером приёмного регистра - просто не корректна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 17 ноября, 2016 Опубликовано 17 ноября, 2016 · Жалоба Прежде чем что-то писать/читать из флеша - нужно расставить буйки. Точнее поделить основную флешь память на две части ещё в линкере. Назначить уникальное имя для оставшейся части флеша. Создать статическую структуру с расположением в этой части флеш. Запихнуть в структуру всё что требуется, со всеми немыслимыми выкрутасами. Например это 20 копий секретной инфы, которая должна меняться при каждом важном для вас событии. Если хорошо постараться - то можно уместиться в две-три страницы. Есно структуру объединить с более простым и наглядным двойным массивом. В событии будет запись новой структуры на чистое место, или стирание страницы и записи на новое чистое место. Поиск по возрастающему номеру в записи (для каждой страницы отдельное пространство цифр, например от 1 до 10, и от 11 до 21). Проверка на ликвидность записи - по чтению копии, и сверке rcr. Битые ячейки рано или поздно появятся, это норма. Тогда можно полностью избавится от указателей, и попаданием пальцем в небо. И главное - стабильное выполнение программы в не зависимости от уровня оптимизации. И ещё, memcpy, если это ваша личная функция - то написана она явно не слишком аккуратно. Флеш память мк в принудительном режиме читается/пишется по 8-16-32-64 бита - у разных моделей по разному. Зависит от конкретной модели мк. А прямая запись с неродным размером приёмного регистра - просто не корректна. да но почему при чтении битых ячеек я вылетаю в эксепшен? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 66 17 ноября, 2016 Опубликовано 17 ноября, 2016 · Жалоба да но почему при чтении битых ячеек я вылетаю в эксепшен? Битые ячейки не причем. Флэш - это железяка прямая, она просто читает и выдает то что прочитала. В исключение вылетает программа, а вот почему она вылетает, тут много вариантов, один из - переполнение стека. Или где-то за границы массива вылетает и т.д. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVI-crak 0 17 ноября, 2016 Опубликовано 17 ноября, 2016 · Жалоба да но почему при чтении битых ячеек я вылетаю в эксепшен? Я не понимаю слова "эксепшен"... Читать флешь память можно двумя способами, по прямому адресу и через мапинг. Прямой адрес флеша для st - обычно висит на 0x08000000. И читается/пишется исключительно родным для этой флеши размером посылки. Каким размером читать/писать - нужно смотреть доки на конкретный чип. Первый попавшийся пример из инета http://easystm32.ru/for-beginners/38-flash-stm32 И через мапинг, с нулевого физического адреса. По этому адресу может оказаться как флеш память, так и рам память, и даже внешняя память. Всё зависит от состояния ножек boot, и регистров переадресации мапинг. В случае когда по дефолту загрузка идёт с флеша (без всяких ускорителей как M7) - то флеш становится доступной для чтения с нулевого адреса. Вот тут её можно читать как угодно, и вдоль и поперёк и по 8 бит и по 64 бита за раз - как хочется. Все эти выкрутасы обработаются системной шиной - именно она будет читать флешь память. Записать через шину не получится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 20 ноября, 2016 Опубликовано 20 ноября, 2016 · Жалоба Я не понимаю слова "эксепшен"... Читать флешь память можно двумя способами, по прямому адресу и через мапинг. Прямой адрес флеша для st - обычно висит на 0x08000000. И читается/пишется исключительно родным для этой флеши размером посылки. Каким размером читать/писать - нужно смотреть доки на конкретный чип. Первый попавшийся пример из инета http://easystm32.ru/for-beginners/38-flash-stm32 И через мапинг, с нулевого физического адреса. По этому адресу может оказаться как флеш память, так и рам память, и даже внешняя память. Всё зависит от состояния ножек boot, и регистров переадресации мапинг. В случае когда по дефолту загрузка идёт с флеша (без всяких ускорителей как M7) - то флеш становится доступной для чтения с нулевого адреса. Вот тут её можно читать как угодно, и вдоль и поперёк и по 8 бит и по 64 бита за раз - как хочется. Все эти выкрутасы обработаются системной шиной - именно она будет читать флешь память. Записать через шину не получится. у меня не STM32 а Kinetis K-70. но для чтения как мне кажется это не принципиально. чтение прозрачно - просто обращение к адресу. на картинках ясно видно что при обращении к 0x000FA000 когда там -- -- -- -- -- -- -- (вторая картинка) при чтении возникает <Exeption frame> и мы попадаем в default_isr (первая картинка). но если записались нормальные данные (третья картинка) все считывается нормально. если сам факт имеет место быть то камень надо менять. не дай бог такое произойдет в полевых условиях. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 20 ноября, 2016 Опубликовано 20 ноября, 2016 · Жалоба когда там -- -- -- -- -- -- --Но вы же сами понимаете, что данных "-- -- -- -- -- -- --" быть не может. Таким образом отладчик вам показывает, что эта область памяти недоступна для чтения. Я не знаю, по какой причине она недоступна - это должно быть описано в документации на ваш контроллер. Возможно она просто все еще выполняет предыдущую операцию стирания или записи со стиранием. В той же документации может быть написано, что попытки обращения к памяти в эти моменты вызывают исключение (мы же на русскоязычном форуме, в конце концов). В любом случае прочитать эту документацию вам придется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 20 ноября, 2016 Опубликовано 20 ноября, 2016 · Жалоба Но вы же сами понимаете, что данных "-- -- -- -- -- -- --" быть не может. Таким образом отладчик вам показывает, что эта область памяти недоступна для чтения. Я не знаю, по какой причине она недоступна - это должно быть описано в документации на ваш контроллер. Возможно она просто все еще выполняет предыдущую операцию стирания или записи со стиранием. В той же документации может быть написано, что попытки обращения к памяти в эти моменты вызывают исключение (мы же на русскоязычном форуме, в конце концов). В любом случае прочитать эту документацию вам придется. мысль конечно интересная. полез в документацию в Flash Memory Controller (FMC). в статус регистре есть флаги указывающие какие ошибки были при записи. можно держать глобальный флаг говорящий - была ошибка нельзя читать. но при перезагрузке этот флаг будет потерян. или вытащить данные до ошибки записи, стереть страницу и записать все данные повторно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 66 20 ноября, 2016 Опубликовано 20 ноября, 2016 · Жалоба мысль конечно интересная. полез в документацию в Flash Memory Controller (FMC). в статус регистре есть флаги указывающие какие ошибки были при записи. можно держать глобальный флаг говорящий - была ошибка нельзя читать. но при перезагрузке этот флаг будет потерян. или вытащить данные до ошибки записи, стереть страницу и записать все данные повторно. Значит где-то недочитали - ведь картинку с "-- -- -- -- -- -- --" как-то получили и никто не вылетел в исключение. Возможно ваша подпрограмма чтения из флеш не обрабатывает какие-то ошибки или не читает дополнительные флаги. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 20 ноября, 2016 Опубликовано 20 ноября, 2016 (изменено) · Жалоба Значит где-то недочитали - ведь картинку с "-- -- -- -- -- -- --" как-то получили и никто не вылетел в исключение. Возможно ваша подпрограмма чтения из флеш не обрабатывает какие-то ошибки или не читает дополнительные флаги. я перегрузил контроллер. поставил точку останова до чтения из адреса. посмортел что там по этому адресу - там (----------).запустил отладчик и на чтении получил исключение. так я мучался пол дня. потом решил переписать данные на странице и на нормально записанной странице все читается прекрасно. сам факт исключения при чтении из флеша мне кажется неприемлимым. ну подняли бы какой нибудь флаг в статус регистре и все. хотя я допускаю что это не аппаратное а программное исключение. тогда надо искать пути пресечения этого безобразия. Изменено 20 ноября, 2016 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVI-crak 0 20 ноября, 2016 Опубликовано 20 ноября, 2016 (изменено) · Жалоба у меня не STM32 а Kinetis K-70. Разницы нет. Карту адресов смотрят в референсе - самая жирная дока. Осталось выяснить какой именно у вас чип, иначе дальше не продвинетесь. Дока на серию http://www.nxp.com/assets/documents/data/e...56M150SF3RM.pdf 0x000FA000 - реально в молоко попали, там пусто. Изменено 20 ноября, 2016 пользователем AVI-crak Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться