Вопросы по С/С++ (СИ)
Re: Вопросы по С/С++ (СИ)
Есть структура в IAR FLASH (ARM) с конфигурацией(+калибровка) объемом в 300 байт, надо сделать считывание и перезапись её.
Это надо для того что после калибровки, решили добавить новую фичу, или нашелся мелкий баг. И так как после исправления прошивки, калибровочные значения слетят, надо их сохранить и потом восстановить.
Так вот как правильно выравнять структуру что бы её можно было считать, что бы потом её можно было КОРРЕКТНО восстановить.
а то я боюсь что после исправления бага(без изменения структуры), компилятор может её выровнять чуть по другому, и восстановление произойдет не правильно, даже если CRC совпадет.
Это надо для того что после калибровки, решили добавить новую фичу, или нашелся мелкий баг. И так как после исправления прошивки, калибровочные значения слетят, надо их сохранить и потом восстановить.
Так вот как правильно выравнять структуру что бы её можно было считать, что бы потом её можно было КОРРЕКТНО восстановить.
а то я боюсь что после исправления бага(без изменения структуры), компилятор может её выровнять чуть по другому, и восстановление произойдет не правильно, даже если CRC совпадет.
- Реклама
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
Как же вы с такой кашей в голове живёте? Вы не знаете как расположить структуру по фиксированному адресу в памяти? В чём вопрос то?
В IAR это делается так. В программе
В .icf
В IAR это делается так. В программе
Код: Выделить всё
#pragma location = ".ethernet"
uint8_t rx0_frames[ETH_RX_FRAME_SIZE*ETH_RX_FRAMES_NB] @ ".ethernet";
Код: Выделить всё
define block ETHERNET with alignment = 0x100000, size = 0x100000 { section .ethernet};
place at address mem:0x27F00000 { block ETHERNET };
Re: Вопросы по С/С++ (СИ)
Что бы после повторной компиляции, порядок остался точно такой же и не каких, лишних( новых байтов), между полями не добавилось и не убралось.Так вот как правильно выравнять структуру что бы её можно было считать, что бы потом её можно было КОРРЕКТНО восстановить.
(естественно что изменения над структурой не происходило)
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
А чего бы ему, порядку, поменяться, если изменений структуры не происходило? Для надёжности #pragma pack(1) сделайте и спите спокойно.
Re: Вопросы по С/С++ (СИ)
На #pragma pack(1) IAR ARM ругается что не оптимальная работа со структурой идет 
- Реклама
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
Вам шашечки или ехать?
Re: Вопросы по С/С++ (СИ)
И то и то 
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
pokk, задачу опишите более внятно, а не отрывками мыслей. Ничего не понятно. Калибровки, фичи, баги, ...
Из Вашего поста понятно лишь одно - Вы боитесь, что компилятор, при очередном перекомпилированияя, испортит структуру. С какой стати ему это делать, если Вы не меняли эту структуру ?
Из Вашего поста понятно лишь одно - Вы боитесь, что компилятор, при очередном перекомпилированияя, испортит структуру. С какой стати ему это делать, если Вы не меняли эту структуру ?
Re: Вопросы по С/С++ (СИ)
[uquote="pokk",url="/forum/viewtopic.php?p=3446429#p3446429"]И то и то
[/uquote]
pokk,
pokk, а вообще отделяйте "мух от котлет": у Вас есть отдельная задача сохранение/восстановление конфигурационных параметров. Структура c параметрами для работы - это одно, напрмер
Есть функции чтения/записи конфигурации:
А во флеше/eeprom/файле/сети... формат данных может быть совершенно другой. Хоть в тексте, в вида пар параметр=значение, хоть в xml, хоть в бинарном виде.... Все зависит от того, что Вам необходимо. Можно реализовать все, что угодно: резервные копии, на случай повреждения (например, если при записи конфигурации было отключено питание), ...
pokk,
С очень большой вероятностью ничего он (компилятор) по-другому выравнивать не будет. Потенциально такое возможно, если Вы поменяете компилятор/версию компилятора. Но это маловероятно, и кто мешает Вам проверить после компиляции новой ревизии, что размер структуры не изменился?da-nie писал(а):компилятор может её выровнять чуть по другому, и восстановление произойдет не правильно, даже если 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);
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Вопросы по С/С++ (СИ)
Вам нужно чтобы эти данные лежали всегда в одном месте, чтобы после перепрошивки можно было эти данные залить тем же проограмматором в ту же память или что?pokk писал(а):Так вот как правильно выравнять структуру что бы её можно было считать, что бы потом её можно было КОРРЕКТНО восстановить.
Создайте в скрипте линкера отдельный регион и ничего не размещайте там кроме этой структуры. В принципе можно и другие данные туда же добавит (другие структуры или переменные). Все определения переменных для этого региона делайте в одном файле и добавление новых переменных в этот регион дописывайте после ранее определенных. Наверное надо наругаться на оптимизатор словом volatile. После компиляции проверять в map файле что куда улеглось.
Вот еще. Где-то видел в настройках что при прошивке можно не стирать все страницы флеша.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
Ему нужно чтобы упаковка не менялась. Но pack(1) не любо.
-
technik-1017
- Открыл глаза
- Сообщения: 42
- Зарегистрирован: Вс сен 03, 2017 19:43:57
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Тогда может попробовать так:
Вряд ли компилятор будет менять последовательность элементов в массиве
Код: Выделить всё
typedef struct
{
int param_1;
int param_2;
} _device_config_t;
_device_config_t cfg[1];
...
cfg[0].param_1 = 55;- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Вычистил весь срач, начиная от первого провакационного вопроса про goto и до конца.
- 2sandro
- Первый раз сказал Мяу!
- Сообщения: 20
- Зарегистрирован: Ср май 17, 2017 08:34:57
- Откуда: Никополь
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Здравствуйте товарищи!
Немножко информации: На мк STM32 читаю файл построчно, есть строка в текстовом файле со значением "4", читаю эту строку в массив из uint8_t:
Естественно в len получаю "4" но в коде ASCII, т.е. 52
Вопрос: Как 52 перевести конкретно в 4, что бы использовать это значение как переменную, например здесь:
Исходя из этого мне нужно прочитать 4 строки, а не 52... 
Немножко информации: На мк STM32 читаю файл построчно, есть строка в текстовом файле со значением "4", читаю эту строку в массив из uint8_t:
Код: Выделить всё
uint8_t rtext[100];
f_gets((TCHAR*)rtext, sizeof(rtext), &MyFile);
uint8_t len = rtext[0];
Вопрос: Как 52 перевести конкретно в 4, что бы использовать это значение как переменную, например здесь:
Код: Выделить всё
for (int i=0; i<len; i++) {
f_gets((TCHAR*)rtext, sizeof(rtext), &MyFile);
}- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
есть функция sscanf для этого - самый простой, но ресурсоемкий вариант.
есть функция atoi - вариант попроще и менее ресурсоемкий.
если слишком сложно, то просто используйте тот факт, что если от кода ЦИФРОВГО символа отнять код символа НОЛЬ, получится числовое значение
то есть
есть функция atoi - вариант попроще и менее ресурсоемкий.
если слишком сложно, то просто используйте тот факт, что если от кода ЦИФРОВГО символа отнять код символа НОЛЬ, получится числовое значение
то есть
Код: Выделить всё
uint8_t number = rtext[0] - '0';если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Вопросы по С/С++ (СИ)
[uquote="2sandro",url="/forum/viewtopic.php?p=3463709#p3463709"]Здравствуйте товарищи!
Немножко информации: На мк STM32 читаю файл построчно, есть строка в текстовом файле со значением "4", читаю эту строку в массив из uint8_t:
Естественно в len получаю "4" но в коде ASCII, т.е. 52[/uquote]
Всегда конвертилось туда-сюда добавлением/вычитанием кода '0' (48dec 30hex)
"4" это строка, один символ '4'
И сразу - а если в ваших манипуляциях будут числа больше 9????????
Немножко информации: На мк STM32 читаю файл построчно, есть строка в текстовом файле со значением "4", читаю эту строку в массив из uint8_t:
Код: Выделить всё
uint8_t rtext[100];
f_gets((TCHAR*)rtext, sizeof(rtext), &MyFile);
uint8_t len = rtext[0];
Всегда конвертилось туда-сюда добавлением/вычитанием кода '0' (48dec 30hex)
"4" это строка, один символ '4'
И сразу - а если в ваших манипуляциях будут числа больше 9????????
- 2sandro
- Первый раз сказал Мяу!
- Сообщения: 20
- Зарегистрирован: Ср май 17, 2017 08:34:57
- Откуда: Никополь
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
[uquote="dosikus",url="/forum/viewtopic.php?p=3463734#p3463734"]И сразу - а если в ваших манипуляциях будут числа больше 9????????[/uquote]
Хороший вопрос...
Да, вот по поводу >9-ти немного озадачен... Но попробую решить, основной ответ на вопрос получил...
ЗЫ.: да, я не знал про "0"
ибо никогда не работал с ascii, поэтому то и спросил...
Хороший вопрос...
Спасибо.ARV писал(а): если слишком сложно, то просто используйте тот факт, что если от кода ЦИФРОВГО символа отнять код символа НОЛЬ, получится числовое значение![]()
Да, вот по поводу >9-ти немного озадачен... Но попробую решить, основной ответ на вопрос получил...
ЗЫ.: да, я не знал про "0"
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Так Вы же сами написали - код 52.2sandro писал(а):ибо никогда не работал с ascii
А нужно 4. Значит разница - 48. Вот и вся арифметика
По поводу выхода символа из диапазона. Просто сделайте проверку обычным условием.
Re: Вопросы по С/С++ (СИ)
[uquote="Аlex",url="/forum/viewtopic.php?p=3463763#p3463763"]По поводу выхода символа из диапазона. Просто сделайте проверку обычным условием.[/uquote]
Проще пусть озвучит что за строки парсит...
Проще пусть озвучит что за строки парсит...
Re: Вопросы по С/С++ (СИ)
Можно ли c помощью #error выдать define ?
В общем есть define который рассчитываться, и хотелось бы после компиляции по смотреть что он там насчитал, и как округлил.
В общем есть define который рассчитываться, и хотелось бы после компиляции по смотреть что он там насчитал, и как округлил.



