Перейти к содержанию
    

Массив констант разместить во flash памяти.

ну и обратитесь где нибудь к нему, как к "х".

 

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

 

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

 

if (x)

{

}

 

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

 

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

Изменено пользователем Serg_el

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот назрел вопрос...

Если я хочу записать константу по определенному адресу, то я пишу следующую строку:

 

const unsigned char x @ 0x01000 = 1;

 

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

Прошу прощения за любопытство, но зачем вам такая константа?

Если необходимо значение хранящееся во флеш по фиксированному адресу, я делаю так

__no_init const unsigned int    PARAM        @  ADDRESS;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прошу прощения за любопытство, но зачем вам такая константа?

Если необходимо значение хранящееся во флеш по фиксированному адресу, я делаю так

__no_init const unsigned int    PARAM        @  ADDRESS;

 

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

 

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

Изменено пользователем Serg_el

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

В таком случае выражение вида

const unsigned char x @ 0x01000 = 1;

в корне неверно, так как вы указываете, что ваша константа никоим образом не изменяется, компилятор конежно же такую константу из памяти выкидывает и заменяет её на значения.

Используйте обьявление которое я вам привёл и наслаждайтесь программированием.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В таком случае выражение вида
const unsigned char x @ 0x01000 = 1;

в корне неверно, так как вы указываете, что ваша константа никоим образом не изменяется, компилятор конежно же такую константу из памяти выкидывает и заменяет её на значения.

Используйте обьявление которое я вам привёл и наслаждайтесь программированием.

 

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

Дальнейшее программирование этого сегмента памяти происходит косвенным способом.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Дальнейшее программирование этого сегмента памяти происходит косвенным способом.

 

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

 

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

P.S. И не забывайте про контроль целостности констант.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

P.S. И не забывайте про контроль целостности констант.

 

Запись flash:

#define SEGMENT_D 0x1000

...

 

write_flash(SEGMENT_D + offset, data);

 

offset соответственно определяет смещение относительно начала сегмента,

т.е. для x - offset =0; для y - offset = 1 и т.д.

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Запись flash:

#define SEGMENT_D 0x1000

...

 

write_flash(SEGMENT_D + offset, data);

 

offset соответственно определяет смещение относительно начала сегмента,

т.е. для x - offset =0; для y - offset = 1 и т.д.

 

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

 

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

А в чём проблема записывать константы при программировании кристалла? Или можно сделать обходным путём: брать "значения по-умолчанию" если по адресу записано FF, если, конечно, FF не входит в диапазон допустимых значений.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А в чём проблема записывать константы при программировании кристалла? Или можно сделать обходным путём: брать "значения по-умолчанию" если по адресу записано FF, если, конечно, FF не входит в диапазон допустимых значений.

 

Так я, собственно, всю проблему и описал в своем первом посте :) . По-умолчанию нельзя, т.к. "Производить инициализацию при первом включении по условию задачи нельзя."

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Производить инициализацию при первом включении по условию задачи нельзя.
Речь о IAR идет? Если да, то выделите в xcl-файле свой собственный сегмент для констант и используйте себе на здоровье в программе его адрес как значение указателя. Без вашей санкции компилятор в выделенном вами сегменте ничего размещать не будет.

Для того, чтобы определить дефолтные значения этих констант еще на этапе программирования кристалла, "пристегните" к прошивке отдельный файл с этими значениями. В последних версиях IAR есть такая опция.

post-3882-1216906180_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Речь о IAR идет? Если да, то выделите в xcl-файле свой собственный сегмент для констант и используйте себе на здоровье в программе его адрес как значение указателя. Без вашей санкции компилятор в выделенном вами сегменте ничего размещать не будет.

Для того, чтобы определить дефолтные значения этих констант еще на этапе программирования кристалла, "пристегните" к прошивке отдельный файл с этими значениями. В последних версиях IAR есть такая опция.

 

Спасибо. Это уже намного интереснее!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...