Jump to content

    

Alex_7211

Участник
  • Content Count

    5
  • Joined

  • Last visited

Community Reputation

0 Обычный
  1. Энергонезависимые настройки, которые можно поменять из программы. И новые настройки снова будут энергонезависимыми. Все же так делают, нет? Keil забивает их нулями. Проверено. Но у меня есть более гуманный к Flash вариант и я забиваю все остальные 253 0xFFFF при объявлении. Нет. Кто "оно"? Всё работает ОК. Все данные сохраняются, не переинициализируются первоначальными данными из прошивки, а сохраняются последние записанные. Вы наверное слабо представляете себе перезапись флэш из программы. Тут хрен можно сломать. Компиллятор уж точно ничего не подставит от себя. Слишком чипо-зависимо. не пользуюсь Нельзя уменьшать размер секции. 512 байт - минимальная секция для стирания. Прекрасно отдаю себе отчет. Вообще вот просто по шагам и по тактам. Не понимаете - спросите. Не сочтите за грубость, но чё-то закрадываются сомнения, что вы писали во флэш. В NXP, STM, в PIC везде есть минимальная страница стирания и очень (специально!) мудреный доступ к командам стирания/записи. В общем, вопрос исчерпан, спасибо всем за внимание.
  2. Так я же и пишу, что объявляю массив как переменную, которая получает атрибут RW, несмотря на область Flash. При этом всё работало, за исключением компрессии, которая появилась не сразу и стала портить начальные значения. Почему не 0xFFFF - потому что я инициализирую первые 6 байт при объявлении массива. В настройках программатора стоит "erase full chip". Когда я, как человек воспитанный, объявлял массив const и он получал RO, то не работало стирание из программы - всегда ошибка. Это были мои вторые грабли при работе с Flash. Первые - в модуле MCM установить Enable Stalling Flash Controller, иначе reset сразу при попытке стирания. Возможно, в этом модуле нужно было что-то еще подшаманить, чтобы const заработал, ХЗ.
  3. Спасибо Палычу, изгоняющему бесов! Всё работает.
  4. Если я ставлю const, то сектор меняет атрибут RW на RO и перестает стираться/записываться из программы (!) почему-то. Я пробовал. Если это имеет значение, то проц NXP MKE06Z64VLH4 на ядре M0+. Частичная или полная блокировка записи во флэш задается в startXXX.s и там весь флэш открыт для записи. Дальше копать не стал. Работает как переменная и ладно. Перекомпилировал. "Compressed" исчезло. Кажется это оно. Завтра перешью, проверю. Спасибо вам, добрый человек!
  5. Отгородил себе флэш для энергонезависимых настроек: uint16_t ID[256] __attribute__((at(0x00007E00))) = {0, 1, 0x05E0}; Какое-то время всё было хорошо: читалось по имени и стиралось/перезаписывалось по абсолютному адресу. Но в какой-то момент при прошивке там стало появляться такое: ID[0] = 0x1221 вместо 0 ID[1] = 0x0A01 вместо 1 ID[3] = 0xE0FF вместо 0x05E0 Перезапись из программы по абсолютным адресам работает и дальше всё ОК. Только начальные значения какие-то левые. Вот как эта секция выглядит в map-файле: Load Region LR$$.ARM.__AT_0x00007E00 (Base: 0x00007e00, Size: 0x00000200, Max: 0x00000200, ABSOLUTE, COMPRESSED[0x0000000c]) Execution Region ER$$.ARM.__AT_0x00007E00 (Exec base: 0x00007e00, Load base: 0x00007e00, Size: 0x00000200, Max: 0x00000200, ABSOLUTE, UNINIT, COMPRESSED[0x0000000c]) Exec Addr Load Addr Size Type Attr Idx E Section Name Object 0x00007e00 COMPRESSED 0x00000200 Data RW 28 .ARM.__AT_0x00007E00 bvd302main.o И вот как она выглядела, когда всё работало: Load Region LR$$.ARM.__AT_0x00007E00 (Base: 0x00007e00, Size: 0x00000200, Max: 0x00000200, ABSOLUTE) Execution Region ER$$.ARM.__AT_0x00007E00 (Exec base: 0x00007e00, Load base: 0x00007e00, Size: 0x00000200, Max: 0x00000200, ABSOLUTE, UNINIT) Exec Addr Load Addr Size Type Attr Idx E Section Name Object 0x00007e00 0x00007e00 0x00000200 Data RW 26 .ARM.__AT_0x00007E00 bvd302main.o Что нахрен за COMPRESSED появилось? Я ничо особого не делал, просто добавил немного кода, не относящегося к этой секции. Свободной флэш-памяти - процентов 80. В компиляторе пробовал менять уровни оптимизации - не помогает. Объявление volatile не помогает. Подскажите, как вернуть обратно абсолютный Load Addr и убрать этот COMPRESSED? Кажется, что дело в нем.