|
Массив констант разместить во flash памяти. |
|
|
|
Jul 24 2008, 11:43
|

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

|
Цитата(VAI @ Jul 24 2008, 15:08)  ну и обратитесь где нибудь к нему, как к "х". А если у меня таких констант десятки и я косвенно к ним обращаюсь через, например, инкремент какой-либо переменной? Нашел один способ: if (x) { } компилятор игнорирует этот код, но flash заполняет константами . Но это как-то не очень красиво. Может есть другие способы?
Сообщение отредактировал Serg_el - Jul 24 2008, 11:43
|
|
|
|
|
Jul 24 2008, 12:27
|
Знающий
   
Группа: Свой
Сообщений: 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;
|
|
|
|
|
Jul 24 2008, 12:40
|

Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jul 24 2008, 12:43
|
Знающий
   
Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045

|
Цитата(Serg_el @ Jul 24 2008, 15:40)  Я инициализирую устройство константами, затем во время работы они изменяются. Но обращаюсь я к ним не через имя константы. В таком случае выражение вида Код const unsigned char x @ 0x01000 = 1; в корне неверно, так как вы указываете, что ваша константа никоим образом не изменяется, компилятор конежно же такую константу из памяти выкидывает и заменяет её на значения. Используйте обьявление которое я вам привёл и наслаждайтесь программированием.
|
|
|
|
|
Jul 24 2008, 12:52
|

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

|
Цитата(gotty @ Jul 24 2008, 16:43)  В таком случае выражение вида Код const unsigned char x @ 0x01000 = 1; в корне неверно, так как вы указываете, что ваша константа никоим образом не изменяется, компилятор конежно же такую константу из памяти выкидывает и заменяет её на значения. Используйте обьявление которое я вам привёл и наслаждайтесь программированием. Ну почему же неверно? Я указываю, что ячейка flash памяти с адресом 0x1000 содержит значение 1. Компилятор понимает, что ее использовать в его нуждах нельзя. Дальнейшее программирование этого сегмента памяти происходит косвенным способом. Ваш способ не позволяет инициализировать данную ячейку памяти каким-либо значением. Это только лишь запрет для компилятора на ее использование.
|
|
|
|
|
Jul 24 2008, 12:58
|
Знающий
   
Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045

|
Цитата(Serg_el @ Jul 24 2008, 15:52)  Ну почему же неверно? Я указываю, что ячейка flash памяти с адресом 0x1000 содержит значение 1. Компилятор понимает, что ее использовать в его нуждах нельзя. Дальнейшее программирование этого сегмента памяти происходит косвенным способом.
Ваш способ не позволяет инициализировать данную ячейку памяти каким-либо значением. Это только лишь запрет для компилятора на ее использование. Вы же сами написали что значение будет время от времени изменяться. А как Вы планируете это делать? Так вот тем же самым способом и инициализируются константы. P.S. И не забывайте про контроль целостности констант.
|
|
|
|
|
Jul 24 2008, 13:07
|

Местный
  
Группа: Свой
Сообщений: 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 и т.д. Т.е. нет смысла при записи использовать какие-либо имена, имея фиксированные адреса. Производить инициализацию при первом включении по условию задачи нельзя.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|