|
|
  |
Как сделать чтоб часть кода кампилятор не оптимизировал. |
|
|
|
Dec 16 2013, 23:49
|
Местный
  
Группа: Участник
Сообщений: 339
Регистрация: 10-07-08
Из: Херсон
Пользователь №: 38 856

|
Компилятор 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. Подскажите неучу, как правильно сделать чтоб работало и не было предупреждений.
|
|
|
|
|
Dec 17 2013, 05:52
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 16-08-13
Из: Ставрополь
Пользователь №: 77 934

|
Скопируй ту переменную в оперативку, и изменяй её, как хочешь. И, кстати, используется встроенная flash-память контроллера, как я понимаю? Она, разве, позволяет изменять данные меньше, чем страницей?
|
|
|
|
|
Dec 17 2013, 06:53
|
Местный
  
Группа: Участник
Сообщений: 339
Регистрация: 10-07-08
Из: Херсон
Пользователь №: 38 856

|
Цитата(fatlortroll @ Dec 17 2013, 08:52)  Скопируй ту переменную в оперативку, и изменяй её, как хочешь. И, кстати, используется встроенная flash-память контроллера, как я понимаю? Она, разве, позволяет изменять данные меньше, чем страницей? Это конфигурационная константа, после сброса она должна остаться в последнем состоянии. Копировать константу в ОЗУ, чтоб там использовать, на моё мнение это лишнее телодвижение. Да, данные меняются страницей. За "жизнь" устройства эти данные могут измениться несколько раз, а могут и вовсе не изменяться. Цитата(alexeyv @ Dec 17 2013, 07:11)  убери const Убирание const ситуацию не изменило, предупреждение выскакивает по прежнему.
|
|
|
|
|
Dec 17 2013, 07:13
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
и всегда есть универсальное средство через #pragma подавить варнинг  , но в целом варнинг правильный. какого вы задаете этой константе значение, если она лежит в не записываемой памяти? правильно вам говорят надо сделать указатель на константу char volatile* const dp_E = (char volatile*)0x0800FCB0; и не присваивать никаких значений, что лежит в этой ячейке, то у вас там и в переменной...
|
|
|
|
|
Dec 17 2013, 07:21
|
Местный
  
Группа: Участник
Сообщений: 339
Регистрация: 10-07-08
Из: Херсон
Пользователь №: 38 856

|
Цитата(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();
Сообщение отредактировал alexdos - Dec 17 2013, 07:29
|
|
|
|
|
Dec 17 2013, 08:25
|
Местный
  
Группа: Участник
Сообщений: 339
Регистрация: 10-07-08
Из: Херсон
Пользователь №: 38 856

|
Цитата(Golikov A. @ Dec 17 2013, 11:08)  const char Init_dp_E __attribute__((at(0x0800FCB0))) = {'N'};
а какой тайный смысл этой строчки? При прошивке в эту ячейку флэшки записывается N? Да, именно так. Сразу при прошивке возможна конфигурация (если заранее известно). Затем дистанционно, если возникает необходимость. Это всего только один параметр, а их там достаточно. Возможно это можно сделать и по другому, но у меня пока получилось так.
Сообщение отредактировал alexdos - Dec 17 2013, 08:26
|
|
|
|
|
Dec 17 2013, 09:02
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата(alexdos @ Dec 17 2013, 12:25)  Да, именно так. Сразу при прошивке возможна конфигурация (если заранее известно). Затем дистанционно, если возникает необходимость. Это всего только один параметр, а их там достаточно. Возможно это можно сделать и по другому, но у меня пока получилось так. интересно, я обычно делал структуру настроек, проверял сектор на пустоту, а структуру на целостность, и если что-то не сходилось, заполнял ее значениями по умолчанию... А оказывается это все можно сразу пробить в память... но с другой стороны при перепрошивке, я настройки не теряю.
|
|
|
|
|
Dec 17 2013, 09:48
|
Местный
  
Группа: Участник
Сообщений: 339
Регистрация: 10-07-08
Из: Херсон
Пользователь №: 38 856

|
Цитата(Golikov A. @ Dec 17 2013, 12:02)  интересно, я обычно делал структуру настроек, проверял сектор на пустоту, а структуру на целостность, и если что-то не сходилось, заполнял ее значениями по умолчанию... А оказывается это все можно сразу пробить в память...
но с другой стороны при перепрошивке, я настройки не теряю. У меня есть "базовая настройка", которая применяется в большинстве случаев. Но иногда нужно стартовую конфигурация поменять, есть файл config.h где хранится "профиль" конфигурации. #define Count_Satelite_ON - в этом случае количество спутников будет передаваться , в софте при кампиляции сразу учитывается (в флеш прописывается 'Y' на стадии программирования). Если не нужно передавать количество спутников, я строку закоментировал и в этом случае в флеш прописывается 'N' на стадии программирования . В этом случае нет необходимости дистанционно включать или выключать. Конечно если вдруг назначалось для одних целей. а приходится использовать для других, и такое бывает, тогда уже дистанционно производится переконфигурация. Я пошел таким путём.
Сообщение отредактировал alexdos - Dec 17 2013, 09:50
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|