реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как сделать чтоб часть кода кампилятор не оптимизировал.
alexdos
сообщение Dec 16 2013, 23:49
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 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.

Подскажите неучу, как правильно сделать чтоб работало и не было предупреждений.
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Dec 17 2013, 04:11
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



убери const
Go to the top of the page
 
+Quote Post
fatlortroll
сообщение Dec 17 2013, 05:52
Сообщение #3


Участник
*

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



Скопируй ту переменную в оперативку, и изменяй её, как хочешь. И, кстати, используется встроенная flash-память контроллера, как я понимаю? Она, разве, позволяет изменять данные меньше, чем страницей?
Go to the top of the page
 
+Quote Post
alexdos
сообщение Dec 17 2013, 06:53
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 339
Регистрация: 10-07-08
Из: Херсон
Пользователь №: 38 856



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

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

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

Убирание const ситуацию не изменило, предупреждение выскакивает по прежнему.
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 17 2013, 06:54
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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


Update: добавил const
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Dec 17 2013, 07:13
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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

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

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

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

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

Go to the top of the page
 
+Quote Post
alexdos
сообщение Dec 17 2013, 07:21
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Dec 17 2013, 08:08
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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

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

Go to the top of the page
 
+Quote Post
редактор
сообщение Dec 17 2013, 08:14
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315



не втему

Сообщение отредактировал редактор - Dec 17 2013, 08:18


--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post
alexdos
сообщение Dec 17 2013, 08:25
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Dec 17 2013, 09:02
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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


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

но с другой стороны при перепрошивке, я настройки не теряю.
Go to the top of the page
 
+Quote Post
alexdos
сообщение Dec 17 2013, 09:48
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 11:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.01592 секунд с 7
ELECTRONIX ©2004-2016