Компилятор сносит не используемый массив и переносит на его место используемые переменные.
CodeVision AVR в вопросах и ответах
- Сообщения: 30
- Зарегистрирован: Вт сен 20, 2016 23:50:51
Я ж написал вопрос. Прочтите его заново.
Компилятор сносит не используемый массив и переносит на его место используемые переменные.
Компилятор сносит не используемый массив и переносит на его место используемые переменные.
- Реклама
Я читал и прекрасно понял, что у Вас не получается.
А кроме отдельного массива ничего в голову не приходит ?
Например один общий ресурс для ненужных и нужных данных ? Тот-же массив, или структура.
И что значит "неиспользуемый" ? А обмануть компиль ? Например заюзать эти данные в каком-нибудь одном месте ...
Вариантов то море. На одном том, который Вы использовали, свет клином не сошёлся. Не вижу вообще никаких проблем в Вашей ситуации
А кроме отдельного массива ничего в голову не приходит ?
И что значит "неиспользуемый" ? А обмануть компиль ? Например заюзать эти данные в каком-нибудь одном месте ...
Вариантов то море. На одном том, который Вы использовали, свет клином не сошёлся. Не вижу вообще никаких проблем в Вашей ситуации
- Сообщения: 30
- Зарегистрирован: Вт сен 20, 2016 23:50:51
Перенос переменных в структуру ровным счетом ничего не меняет.
Нормальные компиляторы только предупреждают о том, что переменная не используется и самостоятельно ее не удаляют и не переназначают адреса остальных переменных. Но это ж Codevision...
Обмануть компилятор - прочитать данные и ничего с ними не делать. Этот кусок кода компилятор так же вырежет, а вместе с ними за одно и переменную.
Прокатит только если прочитать данные и записать в другую ячейку. Этот вариант не подходит, т.к. создает задержку.
Нормальные компиляторы только предупреждают о том, что переменная не используется и самостоятельно ее не удаляют и не переназначают адреса остальных переменных. Но это ж Codevision...
Обмануть компилятор - прочитать данные и ничего с ними не делать. Этот кусок кода компилятор так же вырежет, а вместе с ними за одно и переменную.
Прокатит только если прочитать данные и записать в другую ячейку. Этот вариант не подходит, т.к. создает задержку.
В момент запуска МК ?realm писал(а):т.к. создает задержку.
Если Вы так сильно брыкаетесь, то вариант один (я уже о нём писал) - создать самому функции работы с eeprom.
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
А указать линкеру адрес начала сегмента?
А работать с адресами EEPROM вручную, задавая абсолютные адреса?
А работать с адресами EEPROM вручную, задавая абсолютные адреса?
- Реклама
В справке написано...
Таким образом, нужно просто написать @ после объявления переменной, а после @ указать адрес в шестнадцатеричном формате. Если переменную хочется проинициализировать - нужно её объявить повторно, но уже с инициализацией вместо @.
Если хотим, чтобы что-то не вырезалось при оптимизации, окружаем кусок кода такими магическими строчками, временно отключающими оптимизацию (в данном случае - по размеру):
Спойлер
Global variables can be stored at specific SRAM and EEPROM locations at design-time using the @ operator.
Example:The following procedure must be used if a global variable, placed at a specific address using the @ operator, must be initialized during declaration:Код: Выделить всё
/* 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 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 и подобные.
Ну вот, оказывается в справке всё есть. Просто кому-то лень читать её 
- Сообщения: 30
- Зарегистрирован: Вт сен 20, 2016 23:50:51
Не поверите, но именно так сейчас и работает.COKPOWEHEU писал(а):А работать с адресами EEPROM вручную, задавая абсолютные адреса?
Как только я добавлю какую ни будь переменную и забуду указать ей абсолютный адрес, она окажется в адресе 0.
Добавлено after 4 minutes 54 seconds:
Ага. Написано... Прочтите еще раз.*Trigger* писал(а):окружаем кусок кода такими магическими строчками, временно отключающими оптимизацию
#pragma optsize-
#pragma optsize_default
Для переменных не работает.
Чё, даже volatile не работает в кодвижне ? 
- Сообщения: 30
- Зарегистрирован: Вт сен 20, 2016 23:50:51
А это то тут вообще при чем... volatile работает.Аlex писал(а):Чё, даже volatile не работает в кодвижне ?
Повнимательней посмотрел справку, там есть такое:
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;
}Этот пост оказался полезен? Не поленись, нажми
слева!

Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
слева!Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
А это, уважаемый, лекарство против компиляторского произвола по выкидыванию ненужных, по его мнению, переменныхrealm писал(а):А это то тут вообще при чем...
- Сообщения: 30
- Зарегистрирован: Вт сен 20, 2016 23:50:51
#pragma keep+
#pragma keep-
Именно то, что было нужно! Я помнил, что есть на этот счет что-то но ее с #pragma optsize- перепутал.
Спасибо!
Кстати. Плюсануть сообщение не получается. Висит затемнение с кружком загрузки и больше ничего не происходит.
Добавлено after 7 minutes 36 seconds:
#pragma keep-
Именно то, что было нужно! Я помнил, что есть на этот счет что-то но ее с #pragma optsize- перепутал.
Спасибо!
Кстати. Плюсануть сообщение не получается. Висит затемнение с кружком загрузки и больше ничего не происходит.
Добавлено after 7 minutes 36 seconds:
В CV он для регистров и RAM.Аlex писал(а):А это, уважаемый, лекарство против компиляторского произвола
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Это как? Как вы пытаетесь работать с переменными по абсолютным адресам, не задавая их?Как только я добавлю какую ни будь переменную и забуду указать ей абсолютный адрес, она окажется в адресе 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); //запись из ОЗУ обратно в eeprom- Сообщения: 30
- Зарегистрирован: Вт сен 20, 2016 23:50:51
А вот так:COKPOWEHEU писал(а):Это как? Как вы пытаетесь работать с переменными по абсолютным адресам, не задавая их?
eeprom unsigned int var1[8] @0x20; // будет находиться в адресе 0x20
eeprom unsigned int var2 @0x28; //будет находиться в адресе 0x28
eeprom unsigned int var3; //будет находиться в адресе 0x00
А грозит это примерно следующим - до самого конца написания софта прийдется на каждую переменную в еепроме назначать абсолютный адрес. Извращенством не страдаю.
в собственном EEPROM работать с конкретными адресами, игнорируя сервис автоматического доступа по именам переменных - это ли не извращение? я могу бы понять, когда память внешняя извлекаемая, т.е. вставили чип в панельку и работаем с ним, но когда в своей программе надо идти против воли компилятора - этого я не понимаю...realm писал(а):Извращенством не страдаю
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Вопрос про указание начала сегмента был проигнорирован.
Раз уж занимаетесь извращениями вроде ручного назначения адресов, могу предложить еще один вариант - сделать переменные полями структуры и задать адрес только для нее.
Раз уж занимаетесь извращениями вроде ручного назначения адресов, могу предложить еще один вариант - сделать переменные полями структуры и задать адрес только для нее.
А чем так плохо ручное указание адресов в EEPROM, что это тут уже и извращением стали называть? По мне, так основное назначение EEPROM - это хранение некоторых данных (инициализация, конфиги, текстовые ресурсы) при отключениях питания. А это подразумевает фиксированную их привязку к определённым адресам.
ничуть.WiseLord писал(а):По мне, так основное назначение EEPROM - это хранение некоторых данных (инициализация, конфиги, текстовые ресурсы) при отключениях питания. А это подразумевает фиксированную их привязку к определённым адресам.
это если нет механизма автоматического контроля за местом размещения данных, тогда надо следить за адресами.
как известно, одно из прогрессивных достижений языков высокого уровня заключается как раз в том, что пользователь оперирует не абсолютными адресами ячеек памяти, а абстрактными именами переменных. зачем же отказываться от этого?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Подскажите как сделать. Есть ШИМ со стартом заполнения 50%, при нажатии на кнопку (см. код) заполнение 100%.
Не могу понять как сделать через if else.
Добавлено after 12 minutes 46 seconds:
Но все равно немного не то. А именно после нажатия кнопки нет увеличения, а сразу 100%. По крайне мере в Proteuse так. В железе не проверял.
Так работает:
Код: Выделить всё
if (PINB.3==0){
delay_ms(10);
if (OCR0A<0xff)
OCR0A=OCR0A+0x01;
}
Добавлено after 12 minutes 46 seconds:
Вроде бы что-то вроде такого решения:a.garkin писал(а):Подскажите как сделать. Есть ШИМ со стартом заполнения 50%, при нажатии на кнопку (см. код) заполнение 100%.
Не могу понять как сделать через if else.Код: Выделить всё
if (PINB.3==0){ delay_ms(10); if (OCR0A<0xff) OCR0A=OCR0A+0x01; }
Код: Выделить всё
if (PINB.3==1)
{
OCR0A=0x7f;
}
else
{
if (OCR0A<0xff)
OCR0A=OCR0A+0x01;
Так работает:
Код: Выделить всё
else
{
delay_ms(10);
if (OCR0A<0xff)
OCR0A=OCR0A+0x01;
}


