Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как сделать чтоб часть кода кампилятор не оптимизировал.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
alexdos
Компилятор 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.

Подскажите неучу, как правильно сделать чтоб работало и не было предупреждений.
alexeyv
убери const
fatlortroll
Скопируй ту переменную в оперативку, и изменяй её, как хочешь. И, кстати, используется встроенная flash-память контроллера, как я понимаю? Она, разве, позволяет изменять данные меньше, чем страницей?
alexdos
Цитата(fatlortroll @ Dec 17 2013, 08:52) *
Скопируй ту переменную в оперативку, и изменяй её, как хочешь. И, кстати, используется встроенная flash-память контроллера, как я понимаю? Она, разве, позволяет изменять данные меньше, чем страницей?

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

Цитата(alexeyv @ Dec 17 2013, 07:11) *
убери const

Убирание const ситуацию не изменило, предупреждение выскакивает по прежнему.
scifi
Я бы не заморачивался с attribute, а сделал бы обычный указатель:
Код
char volatile* const dp_E = (char volatile*)0x0800FCB0;


Update: добавил const
Golikov A.
и всегда есть универсальное средство через
#pragma
подавить варнингsm.gif, но в целом варнинг правильный.

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

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

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

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

alexdos
Цитата(scifi @ Dec 17 2013, 09:54) *
Я бы не заморачивался с 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();
Golikov A.
const char Init_dp_E __attribute__((at(0x0800FCB0))) = {'N'};

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

редактор
не втему
alexdos
Цитата(Golikov A. @ Dec 17 2013, 11:08) *
const char Init_dp_E __attribute__((at(0x0800FCB0))) = {'N'};

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


Да, именно так. Сразу при прошивке возможна конфигурация (если заранее известно). Затем дистанционно, если возникает необходимость. Это всего только один параметр, а их там достаточно. Возможно это можно сделать и по другому, но у меня пока получилось так.
Golikov A.
Цитата(alexdos @ Dec 17 2013, 12:25) *
Да, именно так. Сразу при прошивке возможна конфигурация (если заранее известно). Затем дистанционно, если возникает необходимость. Это всего только один параметр, а их там достаточно. Возможно это можно сделать и по другому, но у меня пока получилось так.


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

но с другой стороны при перепрошивке, я настройки не теряю.
alexdos
Цитата(Golikov A. @ Dec 17 2013, 12:02) *
интересно, я обычно делал структуру настроек, проверял сектор на пустоту, а структуру на целостность, и если что-то не сходилось, заполнял ее значениями по умолчанию... А оказывается это все можно сразу пробить в память...

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

У меня есть "базовая настройка", которая применяется в большинстве случаев. Но иногда нужно стартовую конфигурация поменять, есть файл config.h где хранится "профиль" конфигурации.
#define Count_Satelite_ON - в этом случае количество спутников будет передаваться , в софте при кампиляции сразу учитывается (в флеш прописывается 'Y' на стадии программирования). Если не нужно передавать количество спутников, я строку закоментировал и в этом случае в флеш прописывается 'N' на стадии программирования . В этом случае нет необходимости дистанционно включать или выключать. Конечно если вдруг назначалось для одних целей. а приходится использовать для других, и такое бывает, тогда уже дистанционно производится переконфигурация. Я пошел таким путём.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.