Есть структура в IAR FLASH (ARM) с конфигурацией(+калибровка) объемом в 300 байт, надо сделать считывание и перезапись её. Это надо для того что после калибровки, решили добавить новую фичу, или нашелся мелкий баг. И так как после исправления прошивки, калибровочные значения слетят, надо их сохранить и потом восстановить. Так вот как правильно выравнять структуру что бы её можно было считать, что бы потом её можно было КОРРЕКТНО восстановить. а то я боюсь что после исправления бага(без изменения структуры), компилятор может её выровнять чуть по другому, и восстановление произойдет не правильно, даже если CRC совпадет.
Так вот как правильно выравнять структуру что бы её можно было считать, что бы потом её можно было КОРРЕКТНО восстановить.
Что бы после повторной компиляции, порядок остался точно такой же и не каких, лишних( новых байтов), между полями не добавилось и не убралось. (естественно что изменения над структурой не происходило)
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4510 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
pokk, задачу опишите более внятно, а не отрывками мыслей. Ничего не понятно. Калибровки, фичи, баги, ... Из Вашего поста понятно лишь одно - Вы боитесь, что компилятор, при очередном перекомпилированияя, испортит структуру. С какой стати ему это делать, если Вы не меняли эту структуру ?
компилятор может её выровнять чуть по другому, и восстановление произойдет не правильно, даже если CRC совпадет.
С очень большой вероятностью ничего он (компилятор) по-другому выравнивать не будет. Потенциально такое возможно, если Вы поменяете компилятор/версию компилятора. Но это маловероятно, и кто мешает Вам проверить после компиляции новой ревизии, что размер структуры не изменился?
pokk, а вообще отделяйте "мух от котлет": у Вас есть отдельная задача сохранение/восстановление конфигурационных параметров. Структура c параметрами для работы - это одно, напрмер
Код:
struct _device_config_t { int param_1; int param_2; };
Есть функции чтения/записи конфигурации:
Код:
int device_config_save (struct _device_config_t *cfg); int device_config_restore (struct _device_config_t *cfg); void device_config_default (struct _device_config_t *cfg);
А во флеше/eeprom/файле/сети... формат данных может быть совершенно другой. Хоть в тексте, в вида пар параметр=значение, хоть в xml, хоть в бинарном виде.... Все зависит от того, что Вам необходимо. Можно реализовать все, что угодно: резервные копии, на случай повреждения (например, если при записи конфигурации было отключено питание), ...
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2694 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
pokk писал(а):
Так вот как правильно выравнять структуру что бы её можно было считать, что бы потом её можно было КОРРЕКТНО восстановить.
Вам нужно чтобы эти данные лежали всегда в одном месте, чтобы после перепрошивки можно было эти данные залить тем же проограмматором в ту же память или что?
Создайте в скрипте линкера отдельный регион и ничего не размещайте там кроме этой структуры. В принципе можно и другие данные туда же добавит (другие структуры или переменные). Все определения переменных для этого региона делайте в одном файле и добавление новых переменных в этот регион дописывайте после ранее определенных. Наверное надо наругаться на оптимизатор словом volatile. После компиляции проверять в map файле что куда улеглось.
Вот еще. Где-то видел в настройках что при прошивке можно не стирать все страницы флеша.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Здравствуйте товарищи! Немножко информации: На мк STM32 читаю файл построчно, есть строка в текстовом файле со значением "4", читаю эту строку в массив из uint8_t:
Код:
uint8_t rtext[100]; f_gets((TCHAR*)rtext, sizeof(rtext), &MyFile); uint8_t len = rtext[0];
Естественно в len получаю "4" но в коде ASCII, т.е. 52 Вопрос: Как 52 перевести конкретно в 4, что бы использовать это значение как переменную, например здесь:
Код:
for (int i=0; i<len; i++) { f_gets((TCHAR*)rtext, sizeof(rtext), &MyFile); }
Исходя из этого мне нужно прочитать 4 строки, а не 52...
есть функция sscanf для этого - самый простой, но ресурсоемкий вариант. есть функция atoi - вариант попроще и менее ресурсоемкий. если слишком сложно, то просто используйте тот факт, что если от кода ЦИФРОВГО символа отнять код символа НОЛЬ, получится числовое значение то есть
Код:
uint8_t number = rtext[0] - '0';
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Здравствуйте товарищи! Немножко информации: На мк STM32 читаю файл построчно, есть строка в текстовом файле со значением "4", читаю эту строку в массив из uint8_t:
Код:
uint8_t rtext[100]; f_gets((TCHAR*)rtext, sizeof(rtext), &MyFile); uint8_t len = rtext[0];
Естественно в len получаю "4" но в коде ASCII, т.е. 52
Всегда конвертилось туда-сюда добавлением/вычитанием кода '0' (48dec 30hex)
"4" это строка, один символ '4'
И сразу - а если в ваших манипуляциях будут числа больше 9????????
И сразу - а если в ваших манипуляциях будут числа больше 9????????
Хороший вопрос...
ARV писал(а):
если слишком сложно, то просто используйте тот факт, что если от кода ЦИФРОВГО символа отнять код символа НОЛЬ, получится числовое значение
Спасибо. Да, вот по поводу >9-ти немного озадачен... Но попробую решить, основной ответ на вопрос получил... ЗЫ.: да, я не знал про "0" ибо никогда не работал с ascii, поэтому то и спросил...
Можно ли c помощью #error выдать define ? В общем есть define который рассчитываться, и хотелось бы после компиляции по смотреть что он там насчитал, и как округлил.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения