|
|
 |
Ответов
|
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 и т.д. Т.е. нет смысла при записи использовать какие-либо имена, имея фиксированные адреса. Производить инициализацию при первом включении по условию задачи нельзя.
|
|
|
|
Сообщений в этой теме
Dan_Dima Массив констант разместить во flash памяти. Feb 14 2007, 22:35 jorikdima const int arr[10] Feb 14 2007, 22:44 Dan_Dima Цитата(jorikdima @ Feb 14 2007, 22:44) co... Feb 14 2007, 23:13  rezident Цитата(Dan_Dima @ Feb 15 2007, 01:13) Цит... Feb 14 2007, 23:43 Alex11 Есть еще прямой модификатор __flash. Я только не п... Feb 15 2007, 01:19 rezident Цитата(Alex11 @ Feb 15 2007, 03:19) Есть ... Feb 15 2007, 02:07 VAI Цитата(Dan_Dima @ Feb 15 2007, 00:13) Цит... Feb 15 2007, 07:26 rvk const word mnday @0xС600 = {....}
размещает по за... Feb 15 2007, 08:44 jorikdima вы все таки наверно хотели спрость/сказать следующ... Feb 15 2007, 10:08 VAI да не переписывается он в РАМ и читается из флэшь,... Feb 15 2007, 10:48 Dan_Dima Все спасибо за помощь. Все правильно мой глюк м... Feb 15 2007, 15:31 rezident Цитата(Dan_Dima @ Feb 15 2007, 17:31) чер... Feb 15 2007, 15:42  Dan_Dima Цитата(rezident @ Feb 15 2007, 15:42) Цит... Feb 15 2007, 17:03       gotty Цитата(Serg_el @ Jul 24 2008, 16:07) Запи... Jul 24 2008, 13:12        Serg_el Цитата(gotty @ Jul 24 2008, 17:12) А в чё... Jul 24 2008, 13:17 VAI ну и обратитесь где нибудь к нему, как к "х... Jul 24 2008, 11:08 Serg_el Цитата(VAI @ Jul 24 2008, 15:08) ну и обр... Jul 24 2008, 11:43
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|