Перейти к содержанию
    

Как сделать чтоб часть кода кампилятор не оптимизировал.

Компилятор Kei.

В флеш памяти по определенному адресу хранится константа

 const char dp_E  __attribute__((at(0x0800FCB0))) = {'N'};

В теле программы есть где она опрашивается и принимается решение

if (dp_E ==  'Y')  set_dp();

В другой части кода есть возможность её поменять, так вот после её смены на 'Y' код не видит что она поменялась, и продолжает пропускать set_dp();

Если же написать

 volatile const char dp_E  __attribute__((at(0x0800FCB0))) = {'N'};

то всё работает как нужно, но выскакивает предупреждение

Warning: L6969W: Changing AT Section .ARM.__AT_0x0800FCB0 type from RW to RO in ER_IROM1.

Подскажите неучу, как правильно сделать чтоб работало и не было предупреждений.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скопируй ту переменную в оперативку, и изменяй её, как хочешь. И, кстати, используется встроенная flash-память контроллера, как я понимаю? Она, разве, позволяет изменять данные меньше, чем страницей?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скопируй ту переменную в оперативку, и изменяй её, как хочешь. И, кстати, используется встроенная flash-память контроллера, как я понимаю? Она, разве, позволяет изменять данные меньше, чем страницей?

Это конфигурационная константа, после сброса она должна остаться в последнем состоянии. Копировать константу в ОЗУ, чтоб там использовать, на моё мнение это лишнее телодвижение. Да, данные меняются страницей. За "жизнь" устройства эти данные могут измениться несколько раз, а могут и вовсе не изменяться.

 

убери const

Убирание const ситуацию не изменило, предупреждение выскакивает по прежнему.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я бы не заморачивался с attribute, а сделал бы обычный указатель:

char volatile* const dp_E = (char volatile*)0x0800FCB0;

 

Update: добавил const

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

и всегда есть универсальное средство через

#pragma

подавить варнинг:), но в целом варнинг правильный.

 

какого вы задаете этой константе значение, если она лежит в не записываемой памяти?

 

правильно вам говорят надо сделать указатель на константу

 

char volatile* const dp_E = (char volatile*)0x0800FCB0;

 

и не присваивать никаких значений, что лежит в этой ячейке, то у вас там и в переменной...

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я бы не заморачивался с attribute, а сделал бы обычный указатель:

char volatile* const dp_E = (char volatile*)0x0800FCB0;

 

Update: добавил const

 

Вот так работает, с начальной инициализацией. Ошибок и предупреждений нет.

const char Init_dp_E  __attribute__((at(0x0800FCB0)))  = {'N'};
char volatile* const dp_E = (char volatile*)0x0800FCB0;

if (*dp_E == 'Y')  set_dp();

Изменено пользователем alexdos

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

const char Init_dp_E __attribute__((at(0x0800FCB0))) = {'N'};

 

а какой тайный смысл этой строчки? При прошивке в эту ячейку флэшки записывается N?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

const char Init_dp_E __attribute__((at(0x0800FCB0))) = {'N'};

 

а какой тайный смысл этой строчки? При прошивке в эту ячейку флэшки записывается N?

 

Да, именно так. Сразу при прошивке возможна конфигурация (если заранее известно). Затем дистанционно, если возникает необходимость. Это всего только один параметр, а их там достаточно. Возможно это можно сделать и по другому, но у меня пока получилось так.

Изменено пользователем alexdos

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, именно так. Сразу при прошивке возможна конфигурация (если заранее известно). Затем дистанционно, если возникает необходимость. Это всего только один параметр, а их там достаточно. Возможно это можно сделать и по другому, но у меня пока получилось так.

 

интересно, я обычно делал структуру настроек, проверял сектор на пустоту, а структуру на целостность, и если что-то не сходилось, заполнял ее значениями по умолчанию... А оказывается это все можно сразу пробить в память...

 

но с другой стороны при перепрошивке, я настройки не теряю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

интересно, я обычно делал структуру настроек, проверял сектор на пустоту, а структуру на целостность, и если что-то не сходилось, заполнял ее значениями по умолчанию... А оказывается это все можно сразу пробить в память...

 

но с другой стороны при перепрошивке, я настройки не теряю.

У меня есть "базовая настройка", которая применяется в большинстве случаев. Но иногда нужно стартовую конфигурация поменять, есть файл config.h где хранится "профиль" конфигурации.

#define Count_Satelite_ON - в этом случае количество спутников будет передаваться , в софте при кампиляции сразу учитывается (в флеш прописывается 'Y' на стадии программирования). Если не нужно передавать количество спутников, я строку закоментировал и в этом случае в флеш прописывается 'N' на стадии программирования . В этом случае нет необходимости дистанционно включать или выключать. Конечно если вдруг назначалось для одних целей. а приходится использовать для других, и такое бывает, тогда уже дистанционно производится переконфигурация. Я пошел таким путём.

Изменено пользователем alexdos

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...