Есть структура в IAR FLASH (ARM) с конфигурацией(+калибровка) объемом в 300 байт, надо сделать считывание и перезапись её.
Это надо для того что после калибровки, решили добавить новую фичу, или нашелся мелкий баг. И так как после исправления прошивки, калибровочные значения слетят, надо их сохранить и потом восстановить.
Так вот как правильно выравнять структуру что бы её можно было считать, что бы потом её можно было КОРРЕКТНО восстановить.
а то я боюсь что после исправления бага(без изменения структуры), компилятор может её выровнять чуть по другому, и восстановление произойдет не правильно, даже если CRC совпадет.
Так вот как правильно выравнять структуру что бы её можно было считать, что бы потом её можно было КОРРЕКТНО восстановить.
Что бы после повторной компиляции, порядок остался точно такой же и не каких, лишних( новых байтов), между полями не добавилось и не убралось.
(естественно что изменения над структурой не происходило)
pokk, задачу опишите более внятно, а не отрывками мыслей. Ничего не понятно. Калибровки, фичи, баги, ...
Из Вашего поста понятно лишь одно - Вы боитесь, что компилятор, при очередном перекомпилированияя, испортит структуру. С какой стати ему это делать, если Вы не меняли эту структуру ?
[uquote="pokk",url="/forum/viewtopic.php?p=3446429#p3446429"]И то и то [/uquote]
pokk,
da-nie писал(а):компилятор может её выровнять чуть по другому, и восстановление произойдет не правильно, даже если CRC совпадет.
С очень большой вероятностью ничего он (компилятор) по-другому выравнивать не будет. Потенциально такое возможно, если Вы поменяете компилятор/версию компилятора. Но это маловероятно, и кто мешает Вам проверить после компиляции новой ревизии, что размер структуры не изменился?
pokk, а вообще отделяйте "мух от котлет": у Вас есть отдельная задача сохранение/восстановление конфигурационных параметров. Структура c параметрами для работы - это одно, напрмер
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, хоть в бинарном виде.... Все зависит от того, что Вам необходимо. Можно реализовать все, что угодно: резервные копии, на случай повреждения (например, если при записи конфигурации было отключено питание), ...
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, что бы использовать это значение как переменную, например здесь:
есть функция sscanf для этого - самый простой, но ресурсоемкий вариант.
есть функция atoi - вариант попроще и менее ресурсоемкий.
если слишком сложно, то просто используйте тот факт, что если от кода ЦИФРОВГО символа отнять код символа НОЛЬ, получится числовое значение
то есть
[uquote="2sandro",url="/forum/viewtopic.php?p=3463709#p3463709"]Здравствуйте товарищи! Немножко информации: На мк STM32 читаю файл построчно, есть строка в текстовом файле со значением "4", читаю эту строку в массив из uint8_t:
[uquote="dosikus",url="/forum/viewtopic.php?p=3463734#p3463734"]И сразу - а если в ваших манипуляциях будут числа больше 9????????[/uquote]
Хороший вопрос...
ARV писал(а):
если слишком сложно, то просто используйте тот факт, что если от кода ЦИФРОВГО символа отнять код символа НОЛЬ, получится числовое значение
Спасибо.
Да, вот по поводу >9-ти немного озадачен... Но попробую решить, основной ответ на вопрос получил...
ЗЫ.: да, я не знал про "0" ибо никогда не работал с ascii, поэтому то и спросил...
[uquote="Аlex",url="/forum/viewtopic.php?p=3463763#p3463763"]По поводу выхода символа из диапазона. Просто сделайте проверку обычным условием.[/uquote]
Можно ли c помощью #error выдать define ?
В общем есть define который рассчитываться, и хотелось бы после компиляции по смотреть что он там насчитал, и как округлил.