Jump to content

    

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

Компилятор 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.

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

Share this post


Link to post
Share on other sites

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

Share this post


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

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

 

убери const

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

Share this post


Link to post
Share on other sites

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

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

 

Update: добавил const

 

Share this post


Link to post
Share on other sites

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

#pragma

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

 

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

 

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

 

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

 

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

 

 

Share this post


Link to post
Share on other sites
Я бы не заморачивался с 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();

Edited by alexdos

Share this post


Link to post
Share on other sites

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

 

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

 

 

Share this post


Link to post
Share on other sites
const char Init_dp_E __attribute__((at(0x0800FCB0))) = {'N'};

 

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

 

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

Edited by alexdos

Share this post


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

 

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

 

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

Share this post


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

 

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

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

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

Edited by alexdos

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this