|
Чтение из флеш памяти. |
|
|
|
Nov 17 2016, 13:17
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Какая то мистика. Пробую так Код #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 там правда непонятно что записано. ну так считался бы мусор.
Сообщение отредактировал Jenya7 - Nov 17 2016, 13:44
Эскизы прикрепленных изображений
|
|
|
|
|
 |
Ответов
|
Nov 17 2016, 14:03
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Попробуйте вместо memcpy(&buff, (uint8_t*)addr, 4); скормить ему memcpy(&buff[0], (uint8_t*)addr, 4); или memcpy(buff, (uint8_t*)addr, 4);  ps А так получается, что Вы собираетесь затереть память, где расположен указатель/имя массива.
Сообщение отредактировал k155la3 - Nov 17 2016, 14:06
|
|
|
|
|
Nov 17 2016, 14:16
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(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);  ps А так получается, что Вы собираетесь затереть память, где расположен указатель/имя массива. работают все три метода  . сегодня компайлеры наверно идут с foolproof.  ситуация такая. может во время записи дернулось питание или что то вроде этого и в ячейках мы видим какой то мусор -- -- -- -- . но если записалось корректно то считывание проходит нормально. что же получается - если считываем битые ячейки вываливаемся в эксепшн?
|
|
|
|
|
Nov 17 2016, 16:21
|
Частый гость
 
Группа: Участник
Сообщений: 182
Регистрация: 16-10-15
Пользователь №: 88 894

|
Прежде чем что-то писать/читать из флеша - нужно расставить буйки. Точнее поделить основную флешь память на две части ещё в линкере. Назначить уникальное имя для оставшейся части флеша. Создать статическую структуру с расположением в этой части флеш. Запихнуть в структуру всё что требуется, со всеми немыслимыми выкрутасами. Например это 20 копий секретной инфы, которая должна меняться при каждом важном для вас событии. Если хорошо постараться - то можно уместиться в две-три страницы. Есно структуру объединить с более простым и наглядным двойным массивом. В событии будет запись новой структуры на чистое место, или стирание страницы и записи на новое чистое место. Поиск по возрастающему номеру в записи (для каждой страницы отдельное пространство цифр, например от 1 до 10, и от 11 до 21). Проверка на ликвидность записи - по чтению копии, и сверке rcr. Битые ячейки рано или поздно появятся, это норма.
Тогда можно полностью избавится от указателей, и попаданием пальцем в небо. И главное - стабильное выполнение программы в не зависимости от уровня оптимизации.
И ещё, memcpy, если это ваша личная функция - то написана она явно не слишком аккуратно. Флеш память мк в принудительном режиме читается/пишется по 8-16-32-64 бита - у разных моделей по разному. Зависит от конкретной модели мк. А прямая запись с неродным размером приёмного регистра - просто не корректна.
|
|
|
|
|
Nov 17 2016, 16:39
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(AVI-crak @ Nov 17 2016, 22:21)  Прежде чем что-то писать/читать из флеша - нужно расставить буйки. Точнее поделить основную флешь память на две части ещё в линкере. Назначить уникальное имя для оставшейся части флеша. Создать статическую структуру с расположением в этой части флеш. Запихнуть в структуру всё что требуется, со всеми немыслимыми выкрутасами. Например это 20 копий секретной инфы, которая должна меняться при каждом важном для вас событии. Если хорошо постараться - то можно уместиться в две-три страницы. Есно структуру объединить с более простым и наглядным двойным массивом. В событии будет запись новой структуры на чистое место, или стирание страницы и записи на новое чистое место. Поиск по возрастающему номеру в записи (для каждой страницы отдельное пространство цифр, например от 1 до 10, и от 11 до 21). Проверка на ликвидность записи - по чтению копии, и сверке rcr. Битые ячейки рано или поздно появятся, это норма.
Тогда можно полностью избавится от указателей, и попаданием пальцем в небо. И главное - стабильное выполнение программы в не зависимости от уровня оптимизации.
И ещё, memcpy, если это ваша личная функция - то написана она явно не слишком аккуратно. Флеш память мк в принудительном режиме читается/пишется по 8-16-32-64 бита - у разных моделей по разному. Зависит от конкретной модели мк. А прямая запись с неродным размером приёмного регистра - просто не корректна. да но почему при чтении битых ячеек я вылетаю в эксепшен?
|
|
|
|
Сообщений в этой теме
Jenya7 Чтение из флеш памяти. Nov 17 2016, 13:17    AVI-crak Цитата(Jenya7 @ Nov 17 2016, 22:39) да но... Nov 17 2016, 17:51     Jenya7 Цитата(AVI-crak @ Nov 17 2016, 23:51... Nov 20 2016, 08:19      Сергей Борщ QUOTE (Jenya7 @ Nov 20 2016, 11:19) когда... Nov 20 2016, 08:59       Jenya7 Цитата(Сергей Борщ @ Nov 20 2016, 14:59) ... Nov 20 2016, 09:54        HardEgor Цитата(Jenya7 @ Nov 20 2016, 16:54) мысль... Nov 20 2016, 10:51         Jenya7 Цитата(HardEgor @ Nov 20 2016, 16:51) Зна... Nov 20 2016, 11:16      AVI-crak Цитата(Jenya7 @ Nov 20 2016, 14:19) у мен... Nov 20 2016, 12:09
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|