|
|
  |
Запись структуры во флэш. |
|
|
|
Nov 25 2014, 12:48
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(Golikov A. @ Nov 25 2014, 17:39)  Код flashParam1 = *(struct sFlashParam1*)0x0FE00000; А это по стандарту? Это как-то подменяется на memcpy неявно? у меня тоже такой вопрос возник. посмотрел в листинг но там ассемблер ничего не понятно.
|
|
|
|
|
Nov 25 2014, 14:25
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(Jenya7 @ Nov 25 2014, 10:32)  Я работаю с камнем EFM32TG842. У него есть сектор во флэше для записи данных пользователя - страница 512 байт. Я хочу записать туда свою структуру. Код void WriteToFlash(const uint32_t address, void const *data, uint32_t size) { size = 4 * ((size + 3)/4); // always divisable by 4 MSC_Init(); MSC_ErasePage((const uint32_t *)address); MSC_WriteWord((const uint32_t *)address, data, size); MSC_Deinit(); } Код WriteToFlash(USERDATA_BASE, &my_struct, sizeof(my_struct)); Не забудьте также разместить функции работы с флэш в ОЗУ (требование процессора). В библиотеке уже все подготовлено, но в среде разработки в скаттер-файле надо указать разместить секцию ram_code в ОЗУ. Для KEIL это будет модификация подсекции загрузки ОЗУ: Код RW_IRAM1 0x20000000 0x00004000 {; RW data *(ram_code, +First) ; flash erase/write functions .ANY (+RW +ZI) }
|
|
|
|
|
Nov 25 2014, 17:37
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(Jenya7 @ Nov 25 2014, 16:43)  спасибо большое за ЦУ. а __attribute__ ((section(".ram"))) не поможет? вроде как это тоже указание на размещение функции в ram. Функции работы с флэшем в библиотеке для EFM32 уже объявлены и "сложены" в именованную секцию "ram_code", поэтому нужно секцию "ram_code" лишь как-то поместить в ОЗУ. Как написано в помощи к функции WriteWord Цитата The flash must be erased prior to writing a new word. This function must be run from RAM. Failure to execute this portion of the code in RAM will result in a hardfault. For IAR, Rowley and Codesourcery this will be achieved automatically. For Keil uVision 4 you must define a section called "ram_code" and place this manually in your project's scatter file. Кстати, коль мы о секциях заговорили. Вы можете разместить структуру напрямую в пользовательской странице и работать с ней в коде программы как с нормальной константой во flash: Код const MyType MyStruct __attribute__((section("MYDATA"), used)) = {<init fields>}; В скаттере надо указать, чтобы все константы секции были размещены в пользовательской странице, то есть добавить load region Код LR_IROM_SETS (0xFE00000) 0x200 {; User settings in the user ER_IROM_SETS (0x0FE00000) 0x200 {; flash page *(MYDATA) } } В итоге, можно иметь константы, объявленные в разных участках кода, разных файлах проекта, но принадлежащие одной и той же именованной секции, как это показано выше, и пользовать их как обычные константы. А компоновщик кинет все в нужную область флэша согласно указанию из скаттера. Затем можно, например, через коммуникационный протокол модифицировать все эти константы, настраивая таким образом приложение. Например, сменить адрес узла, и т.п. И не надо хранить "копии" настроек из флэш в ОЗУ: в конце концов ОЗУ в контроллерах всегда существенно меньше, чем флэш.
Сообщение отредактировал KnightIgor - Nov 25 2014, 17:40
|
|
|
|
|
Nov 25 2014, 22:43
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(Golikov A. @ Nov 25 2014, 19:58)  Можно конечно их все объявить константами, но тогда будет не очень удобно обновлять параметры из меню пользователя или через внешний протокол... если это только константы, то да удобно. Если параметры во флэше, - а я бы назвал это настройками, - обновляются не по 10 раз в секунду, а в какие-либо ключевые моменты жизни приложения, после чего последнее пользуется результатами и делает свою работу, то почему же не удобно обновлять прямо во флэше? Например, коэффициенты коррекций и поправок в системе с ADC, и т.п. Ну, вначале, при калибровке, может и надо будет раз 20 перезаписать настройки, но потом они будут довольно долго неизменны. Или вот пример из нашей практики. Надо управлять светодиодами через ШИМ. Характеристка вход-выход выражается степенной функцией (гамма-коррекция). Если считать на лету каждый раз по формуле для нескольких каналов, можно перегрузить процессор. Можно работать и по таблице, но ее надо качать по каналу. Мы же меняем показатель (гамму) короткой командой, а процессор тут же единожды вычисляет и создает таблицу, которой потом и пользуется постоянно. Все во флэше.
|
|
|
|
|
Nov 26 2014, 04:40
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
Цитата(scifi @ Nov 25 2014, 17:00)  Вы будете смеяться, но это то же самое, что и Код flashParam1 = *(struct sFlashParam1*)0x0FE00000; это совершенно разные вещи. так структуру объявлять не правильно, тем более для 32-х разрядного проца. Нужно выравнивать к 4-ём. Чтоб не париться над выравниванием лучше в структуре сначало объявить 32-х битные переменные ,потом 16-ти, затем 8-ми.
|
|
|
|
|
Nov 26 2014, 06:26
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
да вот что-то получается что так наоборот даже более правильно чем через memcpy напрямую. Цитата то почему же не удобно обновлять прямо во флэше... ну то есть у вас в коде это константы и вы их изменить не можете из программы. И есть дополнительные функции которые просто меняют область флеши, фактически не думая что там лежит и тем самым обходят защиту const. В целом решение, проблему вижу только при изменении структуры настроек во время модификации кода, надо не забыть поправить ее в 2 местах. То есть и саму структуру и функции ее сохранения-модификации во флеше.
|
|
|
|
|
Nov 26 2014, 07:02
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(juvf @ Nov 26 2014, 09:40)  это совершенно разные вещи.
так структуру объявлять не правильно, тем более для 32-х разрядного проца. Нужно выравнивать к 4-ём. Чтоб не париться над выравниванием лучше в структуре сначало объявить 32-х битные переменные ,потом 16-ти, затем 8-ми. как я понял если не указывать явно packed компайлер по дефолту делает padding. Цитата(KnightIgor @ Nov 25 2014, 22:37)  Функции работы с флэшем в библиотеке для EFM32 уже объявлены и "сложены" в именованную секцию "ram_code", поэтому нужно секцию "ram_code" лишь как-то поместить в ОЗУ. Как написано в помощи к функции WriteWord Кстати, коль мы о секциях заговорили. Вы можете разместить структуру напрямую в пользовательской странице и работать с ней в коде программы как с нормальной константой во flash: Код const MyType MyStruct __attribute__((section("MYDATA"), used)) = {<init fields>}; В скаттере надо указать, чтобы все константы секции были размещены в пользовательской странице, то есть добавить load region Код LR_IROM_SETS (0xFE00000) 0x200 {; User settings in the user ER_IROM_SETS (0x0FE00000) 0x200 {; flash page *(MYDATA) } } В итоге, можно иметь константы, объявленные в разных участках кода, разных файлах проекта, но принадлежащие одной и той же именованной секции, как это показано выше, и пользовать их как обычные константы. А компоновщик кинет все в нужную область флэша согласно указанию из скаттера. Затем можно, например, через коммуникационный протокол модифицировать все эти константы, настраивая таким образом приложение. Например, сменить адрес узла, и т.п. И не надо хранить "копии" настроек из флэш в ОЗУ: в конце концов ОЗУ в контроллерах всегда существенно меньше, чем флэш. Я пишу в Attolic TrueStudio и я честно говоря не нашел там скаттер файл.
|
|
|
|
|
Nov 26 2014, 07:25
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Golikov A. @ Nov 26 2014, 09:26)  ну то есть у вас в коде это константы и вы их изменить не можете из программы. И есть дополнительные функции которые просто меняют область флеши, фактически не думая что там лежит и тем самым обходят защиту const. Если структура в флэш-памяти может меняться в процессе работы программы, её следует объявлять как const volatile. Цитата(Golikov A. @ Nov 26 2014, 09:26)  В целом решение, проблему вижу только при изменении структуры настроек во время модификации кода, надо не забыть поправить ее в 2 местах. То есть и саму структуру и функции ее сохранения-модификации во флеше. Эта проблема - вовсе не проблема. Для этого существует X Macro.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|