CodeVision AVR в вопросах и ответах
Re: CodeVision AVR в вопросах и ответах
Я ж написал вопрос. Прочтите его заново.
Компилятор сносит не используемый массив и переносит на его место используемые переменные.
Компилятор сносит не используемый массив и переносит на его место используемые переменные.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Я читал и прекрасно понял, что у Вас не получается.
А кроме отдельного массива ничего в голову не приходит ?
Например один общий ресурс для ненужных и нужных данных ? Тот-же массив, или структура.
И что значит "неиспользуемый" ? А обмануть компиль ? Например заюзать эти данные в каком-нибудь одном месте ...
Вариантов то море. На одном том, который Вы использовали, свет клином не сошёлся. Не вижу вообще никаких проблем в Вашей ситуации
А кроме отдельного массива ничего в голову не приходит ?
И что значит "неиспользуемый" ? А обмануть компиль ? Например заюзать эти данные в каком-нибудь одном месте ...
Вариантов то море. На одном том, который Вы использовали, свет клином не сошёлся. Не вижу вообще никаких проблем в Вашей ситуации

Re: CodeVision AVR в вопросах и ответах
Перенос переменных в структуру ровным счетом ничего не меняет.
Нормальные компиляторы только предупреждают о том, что переменная не используется и самостоятельно ее не удаляют и не переназначают адреса остальных переменных. Но это ж Codevision...
Обмануть компилятор - прочитать данные и ничего с ними не делать. Этот кусок кода компилятор так же вырежет, а вместе с ними за одно и переменную.
Прокатит только если прочитать данные и записать в другую ячейку. Этот вариант не подходит, т.к. создает задержку.
Нормальные компиляторы только предупреждают о том, что переменная не используется и самостоятельно ее не удаляют и не переназначают адреса остальных переменных. Но это ж Codevision...
Обмануть компилятор - прочитать данные и ничего с ними не делать. Этот кусок кода компилятор так же вырежет, а вместе с ними за одно и переменную.
Прокатит только если прочитать данные и записать в другую ячейку. Этот вариант не подходит, т.к. создает задержку.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
В момент запуска МК ?realm писал(а):т.к. создает задержку.
Если Вы так сильно брыкаетесь, то вариант один (я уже о нём писал) - создать самому функции работы с eeprom.
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: CodeVision AVR в вопросах и ответах
А указать линкеру адрес начала сегмента?
А работать с адресами EEPROM вручную, задавая абсолютные адреса?
А работать с адресами EEPROM вручную, задавая абсолютные адреса?
Re: CodeVision AVR в вопросах и ответах
В справке написано...
Таким образом, нужно просто написать @ после объявления переменной, а после @ указать адрес в шестнадцатеричном формате. Если переменную хочется проинициализировать - нужно её объявить повторно, но уже с инициализацией вместо @.
Если хотим, чтобы что-то не вырезалось при оптимизации, окружаем кусок кода такими магическими строчками, временно отключающими оптимизацию (в данном случае - по размеру):
Спойлер
Global variables can be stored at specific SRAM and EEPROM locations at design-time using the @ operator.
Example:Код: Выделить всё
/* the integer variable "a" is stored
in RAM at address 80h */
int a @0x80;
/* the structure "alfa" is stored
in RAM at address 90h */
struct s1 {
int a;
char c;
} alfa @0x90;
/* the float variable "b" is stored
in EEPROM at address 10h */
eeprom float b @0x10;
/* the structure "beta" is stored
in RAM at address 20h */
eeprom struct s2 {
int i;
long j;
} beta @0x20;
The following procedure must be used if a global variable, placed at a specific address using the @ operator, must be initialized during declaration:Код: Выделить всё
/* the variable will be stored in RAM at address 0x182 */
float pi @0x182;
/* and it will be initialized with the value 3.14 */
float pi=3.14;
/* the variable will be stored in EEPROM at address 0x10 */
eeprom int abc @0x10;
/* and it will be initialized with the value 123 */
eeprom int abc=123;
Таким образом, нужно просто написать @ после объявления переменной, а после @ указать адрес в шестнадцатеричном формате. Если переменную хочется проинициализировать - нужно её объявить повторно, но уже с инициализацией вместо @.
Если хотим, чтобы что-то не вырезалось при оптимизации, окружаем кусок кода такими магическими строчками, временно отключающими оптимизацию (в данном случае - по размеру):
Код: Выделить всё
#pragma optsize-
/*
тут код
*/
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
Последний раз редактировалось *Trigger* Пн ноя 14, 2016 23:26:32, всего редактировалось 1 раз.
Этот пост оказался полезен? Не поленись, нажми
слева!

Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
слева!Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Ну вот, оказывается в справке всё есть. Просто кому-то лень читать её 
Re: CodeVision AVR в вопросах и ответах
COKPOWEHEU писал(а):А работать с адресами EEPROM вручную, задавая абсолютные адреса?
Не поверите, но именно так сейчас и работает.
Как только я добавлю какую ни будь переменную и забуду указать ей абсолютный адрес, она окажется в адресе 0.
Добавлено after 4 minutes 54 seconds:
*Trigger* писал(а):окружаем кусок кода такими магическими строчками, временно отключающими оптимизацию
Ага. Написано... Прочтите еще раз.
#pragma optsize-
#pragma optsize_default
Для переменных не работает.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Чё, даже volatile не работает в кодвижне ? 
Re: CodeVision AVR в вопросах и ответах
Аlex писал(а):Чё, даже volatile не работает в кодвижне ?
А это то тут вообще при чем... volatile работает.
Re: CodeVision AVR в вопросах и ответах
Повнимательней посмотрел справку, там есть такое:
Example:
Таким образом, #pragma keep+ позволяет запретить выкидывание неиспользуемых переменных и функций.
Спойлер
The #pragma keep+ directive forces a function, global variable or global constant to be linked even if it wasn’t used anywhere in the program.Example:
Код: Выделить всё
/* force the next function to be linked even if it’s not used */
#pragma keep+
int func1(int a, int b)
{
return a+b;
}
/* the next function will not be linked if it’s not used
#pragma keep-
int func2(int a, int b)
{
return a-b;
}Таким образом, #pragma keep+ позволяет запретить выкидывание неиспользуемых переменных и функций.
Этот пост оказался полезен? Не поленись, нажми
слева!

Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
слева!Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
А это, уважаемый, лекарство против компиляторского произвола по выкидыванию ненужных, по его мнению, переменныхrealm писал(а):А это то тут вообще при чем...
Re: CodeVision AVR в вопросах и ответах
#pragma keep+
#pragma keep-
Именно то, что было нужно! Я помнил, что есть на этот счет что-то но ее с #pragma optsize- перепутал.
Спасибо!
Кстати. Плюсануть сообщение не получается. Висит затемнение с кружком загрузки и больше ничего не происходит.
Добавлено after 7 minutes 36 seconds:
В CV он для регистров и RAM.
#pragma keep-
Именно то, что было нужно! Я помнил, что есть на этот счет что-то но ее с #pragma optsize- перепутал.
Спасибо!
Кстати. Плюсануть сообщение не получается. Висит затемнение с кружком загрузки и больше ничего не происходит.
Добавлено after 7 minutes 36 seconds:
Аlex писал(а):А это, уважаемый, лекарство против компиляторского произвола
В CV он для регистров и RAM.
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: CodeVision AVR в вопросах и ответах
Это как? Как вы пытаетесь работать с переменными по абсолютным адресам, не задавая их?Как только я добавлю какую ни будь переменную и забуду указать ей абсолютный адрес, она окажется в адресе 0
Код: Выделить всё
#define ee_var_1 0x05 //абсолютный адрес переменной
#define ee_var_2 ee_var_1+2 //адрес следующей переменной
...
int v1 = eeprom_read_int(ee_var_1); //чтение из eeprom в ОЗУ
v1 = v1 + PORTB; //какие-то действия
eeprom_write_int(ee_var_1, v1); //запись из ОЗУ обратно в eepromRe: CodeVision AVR в вопросах и ответах
COKPOWEHEU писал(а):Это как? Как вы пытаетесь работать с переменными по абсолютным адресам, не задавая их?
А вот так:
eeprom unsigned int var1[8] @0x20; // будет находиться в адресе 0x20
eeprom unsigned int var2 @0x28; //будет находиться в адресе 0x28
eeprom unsigned int var3; //будет находиться в адресе 0x00
А грозит это примерно следующим - до самого конца написания софта прийдется на каждую переменную в еепроме назначать абсолютный адрес. Извращенством не страдаю.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
в собственном EEPROM работать с конкретными адресами, игнорируя сервис автоматического доступа по именам переменных - это ли не извращение? я могу бы понять, когда память внешняя извлекаемая, т.е. вставили чип в панельку и работаем с ним, но когда в своей программе надо идти против воли компилятора - этого я не понимаю...realm писал(а):Извращенством не страдаю
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: CodeVision AVR в вопросах и ответах
Вопрос про указание начала сегмента был проигнорирован.
Раз уж занимаетесь извращениями вроде ручного назначения адресов, могу предложить еще один вариант - сделать переменные полями структуры и задать адрес только для нее.
Раз уж занимаетесь извращениями вроде ручного назначения адресов, могу предложить еще один вариант - сделать переменные полями структуры и задать адрес только для нее.
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
А чем так плохо ручное указание адресов в EEPROM, что это тут уже и извращением стали называть? По мне, так основное назначение EEPROM - это хранение некоторых данных (инициализация, конфиги, текстовые ресурсы) при отключениях питания. А это подразумевает фиксированную их привязку к определённым адресам.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
ничуть.WiseLord писал(а):По мне, так основное назначение EEPROM - это хранение некоторых данных (инициализация, конфиги, текстовые ресурсы) при отключениях питания. А это подразумевает фиксированную их привязку к определённым адресам.
это если нет механизма автоматического контроля за местом размещения данных, тогда надо следить за адресами.
как известно, одно из прогрессивных достижений языков высокого уровня заключается как раз в том, что пользователь оперирует не абсолютными адресами ячеек памяти, а абстрактными именами переменных. зачем же отказываться от этого?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
a.garkin
- Нашел транзистор. Понюхал.
- Сообщения: 175
- Зарегистрирован: Вт сен 29, 2009 09:28:51
- Откуда: Ульяновск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Подскажите как сделать. Есть ШИМ со стартом заполнения 50%, при нажатии на кнопку (см. код) заполнение 100%.
Не могу понять как сделать через if else.
Добавлено after 12 minutes 46 seconds:
Вроде бы что-то вроде такого решения:
Но все равно немного не то. А именно после нажатия кнопки нет увеличения, а сразу 100%. По крайне мере в Proteuse так. В железе не проверял.
Так работает:
Код: Выделить всё
if (PINB.3==0){
delay_ms(10);
if (OCR0A<0xff)
OCR0A=OCR0A+0x01;
}
Не могу понять как сделать через if else.
Добавлено after 12 minutes 46 seconds:
a.garkin писал(а):Подскажите как сделать. Есть ШИМ со стартом заполнения 50%, при нажатии на кнопку (см. код) заполнение 100%.Код: Выделить всё
if (PINB.3==0){
delay_ms(10);
if (OCR0A<0xff)
OCR0A=OCR0A+0x01;
}
Не могу понять как сделать через if else.
Вроде бы что-то вроде такого решения:
Код: Выделить всё
if (PINB.3==1)
{
OCR0A=0x7f;
}
else
{
if (OCR0A<0xff)
OCR0A=OCR0A+0x01;
Но все равно немного не то. А именно после нажатия кнопки нет увеличения, а сразу 100%. По крайне мере в Proteuse так. В железе не проверял.
Так работает:
Код: Выделить всё
else
{
delay_ms(10);
if (OCR0A<0xff)
OCR0A=OCR0A+0x01;
}