Serg_el 0 24 июля, 2008 Опубликовано 24 июля, 2008 (изменено) · Жалоба ну и обратитесь где нибудь к нему, как к "х". А если у меня таких констант десятки и я косвенно к ним обращаюсь через, например, инкремент какой-либо переменной? Нашел один способ: if (x) { } компилятор игнорирует этот код, но flash заполняет константами . Но это как-то не очень красиво. Может есть другие способы? Изменено 24 июля, 2008 пользователем Serg_el Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
msalov 0 24 июля, 2008 Опубликовано 24 июля, 2008 · Жалоба Вот назрел вопрос... Если я хочу записать константу по определенному адресу, то я пишу следующую строку: const unsigned char x @ 0x01000 = 1; Но, если я не использую "x" далее в программе, а обращаюсь к адресу 0x01000 другими способами, то компилятор не записывает 1 по этому адресу. Как это обойти? Прошу прощения за любопытство, но зачем вам такая константа? Если необходимо значение хранящееся во флеш по фиксированному адресу, я делаю так __no_init const unsigned int PARAM @ ADDRESS; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serg_el 0 24 июля, 2008 Опубликовано 24 июля, 2008 (изменено) · Жалоба Прошу прощения за любопытство, но зачем вам такая константа? Если необходимо значение хранящееся во флеш по фиксированному адресу, я делаю так __no_init const unsigned int PARAM @ ADDRESS; Я инициализирую устройство константами, затем во время работы они изменяются. Но обращаюсь я к ним не через имя константы. Нужны известные фиксированные адреса, например, чтобы туда записывать серийный номер при программировании. Изменено 24 июля, 2008 пользователем Serg_el Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
msalov 0 24 июля, 2008 Опубликовано 24 июля, 2008 · Жалоба Я инициализирую устройство константами, затем во время работы они изменяются. Но обращаюсь я к ним не через имя константы. В таком случае выражение вида const unsigned char x @ 0x01000 = 1; в корне неверно, так как вы указываете, что ваша константа никоим образом не изменяется, компилятор конежно же такую константу из памяти выкидывает и заменяет её на значения. Используйте обьявление которое я вам привёл и наслаждайтесь программированием. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serg_el 0 24 июля, 2008 Опубликовано 24 июля, 2008 · Жалоба В таком случае выражение вида const unsigned char x @ 0x01000 = 1; в корне неверно, так как вы указываете, что ваша константа никоим образом не изменяется, компилятор конежно же такую константу из памяти выкидывает и заменяет её на значения. Используйте обьявление которое я вам привёл и наслаждайтесь программированием. Ну почему же неверно? Я указываю, что ячейка flash памяти с адресом 0x1000 содержит значение 1. Компилятор понимает, что ее использовать в его нуждах нельзя. Дальнейшее программирование этого сегмента памяти происходит косвенным способом. Ваш способ не позволяет инициализировать данную ячейку памяти каким-либо значением. Это только лишь запрет для компилятора на ее использование. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
msalov 0 24 июля, 2008 Опубликовано 24 июля, 2008 · Жалоба Ну почему же неверно? Я указываю, что ячейка flash памяти с адресом 0x1000 содержит значение 1. Компилятор понимает, что ее использовать в его нуждах нельзя. Дальнейшее программирование этого сегмента памяти происходит косвенным способом. Ваш способ не позволяет инициализировать данную ячейку памяти каким-либо значением. Это только лишь запрет для компилятора на ее использование. Вы же сами написали что значение будет время от времени изменяться. А как Вы планируете это делать? Так вот тем же самым способом и инициализируются константы. P.S. И не забывайте про контроль целостности констант. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serg_el 0 24 июля, 2008 Опубликовано 24 июля, 2008 · Жалоба Вы же сами написали что значение будет время от времени изменяться. А как Вы планируете это делать? Так вот тем же самым способом и инициализируются константы. P.S. И не забывайте про контроль целостности констант. Запись flash: #define SEGMENT_D 0x1000 ... write_flash(SEGMENT_D + offset, data); offset соответственно определяет смещение относительно начала сегмента, т.е. для x - offset =0; для y - offset = 1 и т.д. Т.е. нет смысла при записи использовать какие-либо имена, имея фиксированные адреса. Производить инициализацию при первом включении по условию задачи нельзя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
msalov 0 24 июля, 2008 Опубликовано 24 июля, 2008 · Жалоба Запись flash: #define SEGMENT_D 0x1000 ... write_flash(SEGMENT_D + offset, data); offset соответственно определяет смещение относительно начала сегмента, т.е. для x - offset =0; для y - offset = 1 и т.д. Т.е. нет смысла при записи использовать какие-либо имена, имея фиксированные адреса. Производить инициализацию при первом включении по условию задачи нельзя. А в чём проблема записывать константы при программировании кристалла? Или можно сделать обходным путём: брать "значения по-умолчанию" если по адресу записано FF, если, конечно, FF не входит в диапазон допустимых значений. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serg_el 0 24 июля, 2008 Опубликовано 24 июля, 2008 · Жалоба А в чём проблема записывать константы при программировании кристалла? Или можно сделать обходным путём: брать "значения по-умолчанию" если по адресу записано FF, если, конечно, FF не входит в диапазон допустимых значений. Так я, собственно, всю проблему и описал в своем первом посте :) . По-умолчанию нельзя, т.к. "Производить инициализацию при первом включении по условию задачи нельзя." Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 24 июля, 2008 Опубликовано 24 июля, 2008 · Жалоба Производить инициализацию при первом включении по условию задачи нельзя.Речь о IAR идет? Если да, то выделите в xcl-файле свой собственный сегмент для констант и используйте себе на здоровье в программе его адрес как значение указателя. Без вашей санкции компилятор в выделенном вами сегменте ничего размещать не будет. Для того, чтобы определить дефолтные значения этих констант еще на этапе программирования кристалла, "пристегните" к прошивке отдельный файл с этими значениями. В последних версиях IAR есть такая опция. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serg_el 0 24 июля, 2008 Опубликовано 24 июля, 2008 · Жалоба Речь о IAR идет? Если да, то выделите в xcl-файле свой собственный сегмент для констант и используйте себе на здоровье в программе его адрес как значение указателя. Без вашей санкции компилятор в выделенном вами сегменте ничего размещать не будет. Для того, чтобы определить дефолтные значения этих констант еще на этапе программирования кристалла, "пристегните" к прошивке отдельный файл с этими значениями. В последних версиях IAR есть такая опция. Спасибо. Это уже намного интереснее! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться