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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Массив констант разместить во flash памяти.
Serg_el
сообщение Jul 24 2008, 11:43
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 302
Регистрация: 13-12-06
Из: Togliatti
Пользователь №: 23 473



Цитата(VAI @ Jul 24 2008, 15:08) *
ну и обратитесь где нибудь к нему, как к "х".


А если у меня таких констант десятки и я косвенно к ним обращаюсь через, например, инкремент какой-либо переменной?

Нашел один способ:

if (x)
{
}

компилятор игнорирует этот код, но flash заполняет константами .

Но это как-то не очень красиво. Может есть другие способы?

Сообщение отредактировал Serg_el - Jul 24 2008, 11:43
Go to the top of the page
 
+Quote Post
msalov
сообщение Jul 24 2008, 12:27
Сообщение #17


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Цитата(Serg_el @ Jul 24 2008, 13:01) *
Вот назрел вопрос...
Если я хочу записать константу по определенному адресу, то я пишу следующую строку:

const unsigned char x @ 0x01000 = 1;

Но, если я не использую "x" далее в программе, а обращаюсь к адресу 0x01000 другими способами, то компилятор не записывает 1 по этому адресу. Как это обойти?

Прошу прощения за любопытство, но зачем вам такая константа?
Если необходимо значение хранящееся во флеш по фиксированному адресу, я делаю так
Код
__no_init const unsigned int    PARAM        @  ADDRESS;
Go to the top of the page
 
+Quote Post
Serg_el
сообщение Jul 24 2008, 12:40
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 302
Регистрация: 13-12-06
Из: Togliatti
Пользователь №: 23 473



Цитата(gotty @ Jul 24 2008, 16:27) *
Прошу прощения за любопытство, но зачем вам такая константа?
Если необходимо значение хранящееся во флеш по фиксированному адресу, я делаю так
Код
__no_init const unsigned int    PARAM        @  ADDRESS;


Я инициализирую устройство константами, затем во время работы они изменяются. Но обращаюсь я к ним не через имя константы.

Нужны известные фиксированные адреса, например, чтобы туда записывать серийный номер при программировании.

Сообщение отредактировал Serg_el - Jul 24 2008, 12:42
Go to the top of the page
 
+Quote Post
msalov
сообщение Jul 24 2008, 12:43
Сообщение #19


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Цитата(Serg_el @ Jul 24 2008, 15:40) *
Я инициализирую устройство константами, затем во время работы они изменяются. Но обращаюсь я к ним не через имя константы.

В таком случае выражение вида
Код
const unsigned char x @ 0x01000 = 1;
в корне неверно, так как вы указываете, что ваша константа никоим образом не изменяется, компилятор конежно же такую константу из памяти выкидывает и заменяет её на значения.
Используйте обьявление которое я вам привёл и наслаждайтесь программированием.
Go to the top of the page
 
+Quote Post
Serg_el
сообщение Jul 24 2008, 12:52
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 302
Регистрация: 13-12-06
Из: Togliatti
Пользователь №: 23 473



Цитата(gotty @ Jul 24 2008, 16:43) *
В таком случае выражение вида
Код
const unsigned char x @ 0x01000 = 1;
в корне неверно, так как вы указываете, что ваша константа никоим образом не изменяется, компилятор конежно же такую константу из памяти выкидывает и заменяет её на значения.
Используйте обьявление которое я вам привёл и наслаждайтесь программированием.


Ну почему же неверно? Я указываю, что ячейка flash памяти с адресом 0x1000 содержит значение 1. Компилятор понимает, что ее использовать в его нуждах нельзя.
Дальнейшее программирование этого сегмента памяти происходит косвенным способом.

Ваш способ не позволяет инициализировать данную ячейку памяти каким-либо значением. Это только лишь запрет для компилятора на ее использование.
Go to the top of the page
 
+Quote Post
msalov
сообщение Jul 24 2008, 12:58
Сообщение #21


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Цитата(Serg_el @ Jul 24 2008, 15:52) *
Ну почему же неверно? Я указываю, что ячейка flash памяти с адресом 0x1000 содержит значение 1. Компилятор понимает, что ее использовать в его нуждах нельзя.
Дальнейшее программирование этого сегмента памяти происходит косвенным способом.

Ваш способ не позволяет инициализировать данную ячейку памяти каким-либо значением. Это только лишь запрет для компилятора на ее использование.


Вы же сами написали что значение будет время от времени изменяться. А как Вы планируете это делать? Так вот тем же самым способом и инициализируются константы.
P.S. И не забывайте про контроль целостности констант.
Go to the top of the page
 
+Quote Post
Serg_el
сообщение Jul 24 2008, 13:07
Сообщение #22


Местный
***

Группа: Свой
Сообщений: 302
Регистрация: 13-12-06
Из: Togliatti
Пользователь №: 23 473



Цитата(gotty @ Jul 24 2008, 16:58) *
Вы же сами написали что значение будет время от времени изменяться. А как Вы планируете это делать? Так вот тем же самым способом и инициализируются константы.
P.S. И не забывайте про контроль целостности констант.


Запись flash:
#define SEGMENT_D 0x1000
...

write_flash(SEGMENT_D + offset, data);

offset соответственно определяет смещение относительно начала сегмента,
т.е. для x - offset =0; для y - offset = 1 и т.д.

Т.е. нет смысла при записи использовать какие-либо имена, имея фиксированные адреса.

Производить инициализацию при первом включении по условию задачи нельзя.
Go to the top of the page
 
+Quote Post
msalov
сообщение Jul 24 2008, 13:12
Сообщение #23


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Цитата(Serg_el @ Jul 24 2008, 16:07) *
Запись flash:
#define SEGMENT_D 0x1000
...

write_flash(SEGMENT_D + offset, data);

offset соответственно определяет смещение относительно начала сегмента,
т.е. для x - offset =0; для y - offset = 1 и т.д.

Т.е. нет смысла при записи использовать какие-либо имена, имея фиксированные адреса.

Производить инициализацию при первом включении по условию задачи нельзя.

А в чём проблема записывать константы при программировании кристалла? Или можно сделать обходным путём: брать "значения по-умолчанию" если по адресу записано FF, если, конечно, FF не входит в диапазон допустимых значений.
Go to the top of the page
 
+Quote Post
Serg_el
сообщение Jul 24 2008, 13:17
Сообщение #24


Местный
***

Группа: Свой
Сообщений: 302
Регистрация: 13-12-06
Из: Togliatti
Пользователь №: 23 473



Цитата(gotty @ Jul 24 2008, 17:12) *
А в чём проблема записывать константы при программировании кристалла? Или можно сделать обходным путём: брать "значения по-умолчанию" если по адресу записано FF, если, конечно, FF не входит в диапазон допустимых значений.


Так я, собственно, всю проблему и описал в своем первом посте smile.gif . По-умолчанию нельзя, т.к. "Производить инициализацию при первом включении по условию задачи нельзя."
Go to the top of the page
 
+Quote Post
rezident
сообщение Jul 24 2008, 13:31
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Serg_el @ Jul 24 2008, 19:07) *
Производить инициализацию при первом включении по условию задачи нельзя.
Речь о IAR идет? Если да, то выделите в xcl-файле свой собственный сегмент для констант и используйте себе на здоровье в программе его адрес как значение указателя. Без вашей санкции компилятор в выделенном вами сегменте ничего размещать не будет.
Для того, чтобы определить дефолтные значения этих констант еще на этапе программирования кристалла, "пристегните" к прошивке отдельный файл с этими значениями. В последних версиях IAR есть такая опция.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Serg_el
сообщение Jul 24 2008, 13:56
Сообщение #26


Местный
***

Группа: Свой
Сообщений: 302
Регистрация: 13-12-06
Из: Togliatti
Пользователь №: 23 473



Цитата(rezident @ Jul 24 2008, 17:31) *
Речь о IAR идет? Если да, то выделите в xcl-файле свой собственный сегмент для констант и используйте себе на здоровье в программе его адрес как значение указателя. Без вашей санкции компилятор в выделенном вами сегменте ничего размещать не будет.
Для того, чтобы определить дефолтные значения этих констант еще на этапе программирования кристалла, "пристегните" к прошивке отдельный файл с этими значениями. В последних версиях IAR есть такая опция.


Спасибо. Это уже намного интереснее!
Go to the top of the page
 
+Quote Post

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

 


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


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