Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

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

Ср авг 29, 2018 05:07:34

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

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

Ср авг 29, 2018 05:27:03

Как же вы с такой кашей в голове живёте? Вы не знаете как расположить структуру по фиксированному адресу в памяти? В чём вопрос то?

В 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

Так вот как правильно выравнять структуру что бы её можно было считать, что бы потом её можно было КОРРЕКТНО восстановить.

Что бы после повторной компиляции, порядок остался точно такой же и не каких, лишних( новых байтов), между полями не добавилось и не убралось.
(естественно что изменения над структурой не происходило)

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

Ср авг 29, 2018 09:32:59

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

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

Ср авг 29, 2018 10:21:35

На #pragma pack(1) IAR ARM ругается что не оптимальная работа со структурой идет :(

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

Ср авг 29, 2018 10:51:44

Вам шашечки или ехать?

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

Чт авг 30, 2018 08:56:30

И то и то :)

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

Чт авг 30, 2018 14:01:30

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

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

Пт авг 31, 2018 09:46:41

И то и то :)

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

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

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

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

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

Пт авг 31, 2018 16:18:11

Ему нужно чтобы упаковка не менялась. Но pack(1) не любо.

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

Пт авг 31, 2018 17:14:15

Тогда может попробовать так:
Код:
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

Вычистил весь срач, начиная от первого провакационного вопроса про goto и до конца.

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

Пн сен 24, 2018 10:02:22

Здравствуйте товарищи!
Немножко информации: На мк 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

есть функция sscanf для этого - самый простой, но ресурсоемкий вариант.
есть функция atoi - вариант попроще и менее ресурсоемкий.
если слишком сложно, то просто используйте тот факт, что если от кода ЦИФРОВГО символа отнять код символа НОЛЬ, получится числовое значение :))
то есть
Код:
uint8_t number = rtext[0] - '0';

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

Пн сен 24, 2018 10:29:28

Здравствуйте товарищи!
Немножко информации: На мк 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????????

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

Пн сен 24, 2018 10:52:00

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

Хороший вопрос...
ARV писал(а):если слишком сложно, то просто используйте тот факт, что если от кода ЦИФРОВГО символа отнять код символа НОЛЬ, получится числовое значение :))

Спасибо.
Да, вот по поводу >9-ти немного озадачен... Но попробую решить, основной ответ на вопрос получил...
ЗЫ.: да, я не знал про "0" :)) ибо никогда не работал с ascii, поэтому то и спросил...

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

Пн сен 24, 2018 11:41:22

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

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

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

Пн сен 24, 2018 12:38:39

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



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

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

Вт окт 02, 2018 08:13:07

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