alexdos 0 16 декабря, 2013 Опубликовано 16 декабря, 2013 · Жалоба Компилятор 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 0 17 декабря, 2013 Опубликовано 17 декабря, 2013 · Жалоба убери const Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fatlortroll 0 17 декабря, 2013 Опубликовано 17 декабря, 2013 · Жалоба Скопируй ту переменную в оперативку, и изменяй её, как хочешь. И, кстати, используется встроенная flash-память контроллера, как я понимаю? Она, разве, позволяет изменять данные меньше, чем страницей? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexdos 0 17 декабря, 2013 Опубликовано 17 декабря, 2013 · Жалоба Скопируй ту переменную в оперативку, и изменяй её, как хочешь. И, кстати, используется встроенная flash-память контроллера, как я понимаю? Она, разве, позволяет изменять данные меньше, чем страницей? Это конфигурационная константа, после сброса она должна остаться в последнем состоянии. Копировать константу в ОЗУ, чтоб там использовать, на моё мнение это лишнее телодвижение. Да, данные меняются страницей. За "жизнь" устройства эти данные могут измениться несколько раз, а могут и вовсе не изменяться. убери const Убирание const ситуацию не изменило, предупреждение выскакивает по прежнему. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 17 декабря, 2013 Опубликовано 17 декабря, 2013 · Жалоба Я бы не заморачивался с attribute, а сделал бы обычный указатель: char volatile* const dp_E = (char volatile*)0x0800FCB0; Update: добавил const Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 17 декабря, 2013 Опубликовано 17 декабря, 2013 · Жалоба и всегда есть универсальное средство через #pragma подавить варнинг:), но в целом варнинг правильный. какого вы задаете этой константе значение, если она лежит в не записываемой памяти? правильно вам говорят надо сделать указатель на константу char volatile* const dp_E = (char volatile*)0x0800FCB0; и не присваивать никаких значений, что лежит в этой ячейке, то у вас там и в переменной... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexdos 0 17 декабря, 2013 Опубликовано 17 декабря, 2013 (изменено) · Жалоба Я бы не заморачивался с 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(); Изменено 17 декабря, 2013 пользователем alexdos Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 17 декабря, 2013 Опубликовано 17 декабря, 2013 · Жалоба const char Init_dp_E __attribute__((at(0x0800FCB0))) = {'N'}; а какой тайный смысл этой строчки? При прошивке в эту ячейку флэшки записывается N? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edit2007 3 17 декабря, 2013 Опубликовано 17 декабря, 2013 (изменено) · Жалоба не втему Изменено 17 декабря, 2013 пользователем редактор Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexdos 0 17 декабря, 2013 Опубликовано 17 декабря, 2013 (изменено) · Жалоба const char Init_dp_E __attribute__((at(0x0800FCB0))) = {'N'}; а какой тайный смысл этой строчки? При прошивке в эту ячейку флэшки записывается N? Да, именно так. Сразу при прошивке возможна конфигурация (если заранее известно). Затем дистанционно, если возникает необходимость. Это всего только один параметр, а их там достаточно. Возможно это можно сделать и по другому, но у меня пока получилось так. Изменено 17 декабря, 2013 пользователем alexdos Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 17 декабря, 2013 Опубликовано 17 декабря, 2013 · Жалоба Да, именно так. Сразу при прошивке возможна конфигурация (если заранее известно). Затем дистанционно, если возникает необходимость. Это всего только один параметр, а их там достаточно. Возможно это можно сделать и по другому, но у меня пока получилось так. интересно, я обычно делал структуру настроек, проверял сектор на пустоту, а структуру на целостность, и если что-то не сходилось, заполнял ее значениями по умолчанию... А оказывается это все можно сразу пробить в память... но с другой стороны при перепрошивке, я настройки не теряю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexdos 0 17 декабря, 2013 Опубликовано 17 декабря, 2013 (изменено) · Жалоба интересно, я обычно делал структуру настроек, проверял сектор на пустоту, а структуру на целостность, и если что-то не сходилось, заполнял ее значениями по умолчанию... А оказывается это все можно сразу пробить в память... но с другой стороны при перепрошивке, я настройки не теряю. У меня есть "базовая настройка", которая применяется в большинстве случаев. Но иногда нужно стартовую конфигурация поменять, есть файл config.h где хранится "профиль" конфигурации. #define Count_Satelite_ON - в этом случае количество спутников будет передаваться , в софте при кампиляции сразу учитывается (в флеш прописывается 'Y' на стадии программирования). Если не нужно передавать количество спутников, я строку закоментировал и в этом случае в флеш прописывается 'N' на стадии программирования . В этом случае нет необходимости дистанционно включать или выключать. Конечно если вдруг назначалось для одних целей. а приходится использовать для других, и такое бывает, тогда уже дистанционно производится переконфигурация. Я пошел таким путём. Изменено 17 декабря, 2013 пользователем alexdos Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться