Страница 281 из 386

Re: Вопросы по С/С++ (СИ)

Добавлено: Ср авг 29, 2018 05:07:34
pokk
Есть структура в IAR FLASH (ARM) с конфигурацией(+калибровка) объемом в 300 байт, надо сделать считывание и перезапись её.
Это надо для того что после калибровки, решили добавить новую фичу, или нашелся мелкий баг. И так как после исправления прошивки, калибровочные значения слетят, надо их сохранить и потом восстановить.
Так вот как правильно выравнять структуру что бы её можно было считать, что бы потом её можно было КОРРЕКТНО восстановить.
а то я боюсь что после исправления бага(без изменения структуры), компилятор может её выровнять чуть по другому, и восстановление произойдет не правильно, даже если CRC совпадет.

Re: Вопросы по С/С++ (СИ)

Добавлено: Ср авг 29, 2018 05:27:03
VladislavS
Как же вы с такой кашей в голове живёте? Вы не знаете как расположить структуру по фиксированному адресу в памяти? В чём вопрос то?

В IAR это делается так. В программе

Код: Выделить всё

  #pragma location = ".ethernet"
  uint8_t rx0_frames[ETH_RX_FRAME_SIZE*ETH_RX_FRAMES_NB] @ ".ethernet";
В .icf

Код: Выделить всё

define block ETHERNET with alignment = 0x100000, size = 0x100000 { section .ethernet};

place at address mem:0x27F00000 { block ETHERNET };

Re: Вопросы по С/С++ (СИ)

Добавлено: Ср авг 29, 2018 07:36:56
pokk
Так вот как правильно выравнять структуру что бы её можно было считать, что бы потом её можно было КОРРЕКТНО восстановить.
Что бы после повторной компиляции, порядок остался точно такой же и не каких, лишних( новых байтов), между полями не добавилось и не убралось.
(естественно что изменения над структурой не происходило)

Re: Вопросы по С/С++ (СИ)

Добавлено: Ср авг 29, 2018 09:32:59
VladislavS
А чего бы ему, порядку, поменяться, если изменений структуры не происходило? Для надёжности #pragma pack(1) сделайте и спите спокойно.

Re: Вопросы по С/С++ (СИ)

Добавлено: Ср авг 29, 2018 10:21:35
pokk
На #pragma pack(1) IAR ARM ругается что не оптимальная работа со структурой идет :(

Re: Вопросы по С/С++ (СИ)

Добавлено: Ср авг 29, 2018 10:51:44
VladislavS
Вам шашечки или ехать?

Re: Вопросы по С/С++ (СИ)

Добавлено: Чт авг 30, 2018 08:56:30
pokk
И то и то :)

Re: Вопросы по С/С++ (СИ)

Добавлено: Чт авг 30, 2018 14:01:30
Аlex
pokk, задачу опишите более внятно, а не отрывками мыслей. Ничего не понятно. Калибровки, фичи, баги, ...
Из Вашего поста понятно лишь одно - Вы боитесь, что компилятор, при очередном перекомпилированияя, испортит структуру. С какой стати ему это делать, если Вы не меняли эту структуру ?

Re: Вопросы по С/С++ (СИ)

Добавлено: Пт авг 31, 2018 09:46:41
viiv
[uquote="pokk",url="/forum/viewtopic.php?p=3446429#p3446429"]И то и то :)[/uquote]
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);
А во флеше/eeprom/файле/сети... формат данных может быть совершенно другой. Хоть в тексте, в вида пар параметр=значение, хоть в xml, хоть в бинарном виде.... Все зависит от того, что Вам необходимо. Можно реализовать все, что угодно: резервные копии, на случай повреждения (например, если при записи конфигурации было отключено питание), ...

Re: Вопросы по С/С++ (СИ)

Добавлено: Пт авг 31, 2018 15:57:54
Z_h_e
pokk писал(а):Так вот как правильно выравнять структуру что бы её можно было считать, что бы потом её можно было КОРРЕКТНО восстановить.
Вам нужно чтобы эти данные лежали всегда в одном месте, чтобы после перепрошивки можно было эти данные залить тем же проограмматором в ту же память или что?

Создайте в скрипте линкера отдельный регион и ничего не размещайте там кроме этой структуры. В принципе можно и другие данные туда же добавит (другие структуры или переменные). Все определения переменных для этого региона делайте в одном файле и добавление новых переменных в этот регион дописывайте после ранее определенных. Наверное надо наругаться на оптимизатор словом volatile. После компиляции проверять в map файле что куда улеглось.

Вот еще. Где-то видел в настройках что при прошивке можно не стирать все страницы флеша.

Re: Вопросы по С/С++ (СИ)

Добавлено: Пт авг 31, 2018 16:18:11
VladislavS
Ему нужно чтобы упаковка не менялась. Но pack(1) не любо.

Re: Вопросы по С/С++ (СИ)

Добавлено: Пт авг 31, 2018 17:14:15
technik-1017
Тогда может попробовать так:

Код: Выделить всё

typedef struct
{
   int param_1;
   int param_2;
} _device_config_t;

_device_config_t cfg[1];

...
cfg[0].param_1 = 55;
Вряд ли компилятор будет менять последовательность элементов в массиве

Re: Вопросы по С/С++ (СИ)

Добавлено: Пт сен 14, 2018 12:18:23
Аlex
Вычистил весь срач, начиная от первого провакационного вопроса про goto и до конца.

Re: Вопросы по С/С++ (СИ)

Добавлено: Пн сен 24, 2018 10:02:22
2sandro
Здравствуйте товарищи!
Немножко информации: На мк 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... :))

Re: Вопросы по С/С++ (СИ)

Добавлено: Пн сен 24, 2018 10:22:24
ARV
есть функция sscanf для этого - самый простой, но ресурсоемкий вариант.
есть функция atoi - вариант попроще и менее ресурсоемкий.
если слишком сложно, то просто используйте тот факт, что если от кода ЦИФРОВГО символа отнять код символа НОЛЬ, получится числовое значение :))
то есть

Код: Выделить всё

uint8_t number = rtext[0] - '0';

Re: Вопросы по С/С++ (СИ)

Добавлено: Пн сен 24, 2018 10:29:28
dosikus
[uquote="2sandro",url="/forum/viewtopic.php?p=3463709#p3463709"]Здравствуйте товарищи!
Немножко информации: На мк STM32 читаю файл построчно, есть строка в текстовом файле со значением "4", читаю эту строку в массив из uint8_t:

Код: Выделить всё

uint8_t rtext[100];
f_gets((TCHAR*)rtext, sizeof(rtext), &MyFile);
uint8_t len = rtext[0];
Естественно в len получаю "4" но в коде ASCII, т.е. 52[/uquote]

Всегда конвертилось туда-сюда добавлением/вычитанием кода '0' (48dec 30hex)

"4" это строка, один символ '4'

И сразу - а если в ваших манипуляциях будут числа больше 9????????

Re: Вопросы по С/С++ (СИ)

Добавлено: Пн сен 24, 2018 10:52:00
2sandro
[uquote="dosikus",url="/forum/viewtopic.php?p=3463734#p3463734"]И сразу - а если в ваших манипуляциях будут числа больше 9????????[/uquote]
Хороший вопрос...
ARV писал(а): если слишком сложно, то просто используйте тот факт, что если от кода ЦИФРОВГО символа отнять код символа НОЛЬ, получится числовое значение :))
Спасибо.
Да, вот по поводу >9-ти немного озадачен... Но попробую решить, основной ответ на вопрос получил...
ЗЫ.: да, я не знал про "0" :)) ибо никогда не работал с ascii, поэтому то и спросил...

Re: Вопросы по С/С++ (СИ)

Добавлено: Пн сен 24, 2018 11:41:22
Аlex
2sandro писал(а):ибо никогда не работал с ascii
Так Вы же сами написали - код 52.
А нужно 4. Значит разница - 48. Вот и вся арифметика :)

По поводу выхода символа из диапазона. Просто сделайте проверку обычным условием.

Re: Вопросы по С/С++ (СИ)

Добавлено: Пн сен 24, 2018 12:38:39
dosikus
[uquote="Аlex",url="/forum/viewtopic.php?p=3463763#p3463763"]По поводу выхода символа из диапазона. Просто сделайте проверку обычным условием.[/uquote]


Проще пусть озвучит что за строки парсит...

Re: Вопросы по С/С++ (СИ)

Добавлено: Вт окт 02, 2018 08:13:07
pokk
Можно ли c помощью #error выдать define ?
В общем есть define который рассчитываться, и хотелось бы после компиляции по смотреть что он там насчитал, и как округлил.