CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
realm
Первый раз сказал Мяу!
Сообщения: 30
Зарегистрирован: Вт сен 20, 2016 23:50:51

Re: CodeVision AVR в вопросах и ответах

Сообщение realm »

Я ж написал вопрос. Прочтите его заново.
Компилятор сносит не используемый массив и переносит на его место используемые переменные.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

Я читал и прекрасно понял, что у Вас не получается.
А кроме отдельного массива ничего в голову не приходит ? :) Например один общий ресурс для ненужных и нужных данных ? Тот-же массив, или структура.
И что значит "неиспользуемый" ? А обмануть компиль ? Например заюзать эти данные в каком-нибудь одном месте ...
Вариантов то море. На одном том, который Вы использовали, свет клином не сошёлся. Не вижу вообще никаких проблем в Вашей ситуации :dont_know:
realm
Первый раз сказал Мяу!
Сообщения: 30
Зарегистрирован: Вт сен 20, 2016 23:50:51

Re: CodeVision AVR в вопросах и ответах

Сообщение realm »

Перенос переменных в структуру ровным счетом ничего не меняет.

Нормальные компиляторы только предупреждают о том, что переменная не используется и самостоятельно ее не удаляют и не переназначают адреса остальных переменных. Но это ж Codevision...

Обмануть компилятор - прочитать данные и ничего с ними не делать. Этот кусок кода компилятор так же вырежет, а вместе с ними за одно и переменную.
Прокатит только если прочитать данные и записать в другую ячейку. Этот вариант не подходит, т.к. создает задержку.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

realm писал(а):т.к. создает задержку.
В момент запуска МК ? :)

Если Вы так сильно брыкаетесь, то вариант один (я уже о нём писал) - создать самому функции работы с eeprom.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: CodeVision AVR в вопросах и ответах

Сообщение COKPOWEHEU »

А указать линкеру адрес начала сегмента?
А работать с адресами EEPROM вручную, задавая абсолютные адреса?
Аватара пользователя
*Trigger*
Друг Кота
Сообщения: 3059
Зарегистрирован: Пн май 11, 2009 14:15:00
Откуда: СПб

Re: CodeVision AVR в вопросах и ответах

Сообщение *Trigger* »

В справке написано...
Спойлер
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 и подобные.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

Ну вот, оказывается в справке всё есть. Просто кому-то лень читать её :)
realm
Первый раз сказал Мяу!
Сообщения: 30
Зарегистрирован: Вт сен 20, 2016 23:50:51

Re: CodeVision AVR в вопросах и ответах

Сообщение realm »

COKPOWEHEU писал(а):А работать с адресами EEPROM вручную, задавая абсолютные адреса?

Не поверите, но именно так сейчас и работает.
Как только я добавлю какую ни будь переменную и забуду указать ей абсолютный адрес, она окажется в адресе 0.

Добавлено after 4 minutes 54 seconds:
*Trigger* писал(а):окружаем кусок кода такими магическими строчками, временно отключающими оптимизацию

Ага. Написано... Прочтите еще раз.

#pragma optsize-
#pragma optsize_default
Для переменных не работает.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

Чё, даже volatile не работает в кодвижне ? :)
realm
Первый раз сказал Мяу!
Сообщения: 30
Зарегистрирован: Вт сен 20, 2016 23:50:51

Re: CodeVision AVR в вопросах и ответах

Сообщение realm »

Аlex писал(а):Чё, даже volatile не работает в кодвижне ? :)

А это то тут вообще при чем... volatile работает.
Аватара пользователя
*Trigger*
Друг Кота
Сообщения: 3059
Зарегистрирован: Пн май 11, 2009 14:15:00
Откуда: СПб

Re: CodeVision AVR в вопросах и ответах

Сообщение *Trigger* »

Повнимательней посмотрел справку, там есть такое:
Спойлер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 и подобные.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

realm писал(а):А это то тут вообще при чем...
А это, уважаемый, лекарство против компиляторского произвола по выкидыванию ненужных, по его мнению, переменных :)
realm
Первый раз сказал Мяу!
Сообщения: 30
Зарегистрирован: Вт сен 20, 2016 23:50:51

Re: CodeVision AVR в вопросах и ответах

Сообщение realm »

#pragma keep+
#pragma keep-
Именно то, что было нужно! Я помнил, что есть на этот счет что-то но ее с #pragma optsize- перепутал.
Спасибо!

Кстати. Плюсануть сообщение не получается. Висит затемнение с кружком загрузки и больше ничего не происходит.

Добавлено after 7 minutes 36 seconds:
Аlex писал(а):А это, уважаемый, лекарство против компиляторского произвола

В CV он для регистров и RAM.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: CodeVision AVR в вопросах и ответах

Сообщение COKPOWEHEU »

Как только я добавлю какую ни будь переменную и забуду указать ей абсолютный адрес, она окажется в адресе 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
realm
Первый раз сказал Мяу!
Сообщения: 30
Зарегистрирован: Вт сен 20, 2016 23:50:51

Re: CodeVision AVR в вопросах и ответах

Сообщение realm »

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 в вопросах и ответах

Сообщение ARV »

realm писал(а):Извращенством не страдаю
в собственном EEPROM работать с конкретными адресами, игнорируя сервис автоматического доступа по именам переменных - это ли не извращение? я могу бы понять, когда память внешняя извлекаемая, т.е. вставили чип в панельку и работаем с ним, но когда в своей программе надо идти против воли компилятора - этого я не понимаю...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: CodeVision AVR в вопросах и ответах

Сообщение COKPOWEHEU »

Вопрос про указание начала сегмента был проигнорирован.
Раз уж занимаетесь извращениями вроде ручного назначения адресов, могу предложить еще один вариант - сделать переменные полями структуры и задать адрес только для нее.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение WiseLord »

А чем так плохо ручное указание адресов в EEPROM, что это тут уже и извращением стали называть? По мне, так основное назначение EEPROM - это хранение некоторых данных (инициализация, конфиги, текстовые ресурсы) при отключениях питания. А это подразумевает фиксированную их привязку к определённым адресам.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение ARV »

WiseLord писал(а):По мне, так основное назначение EEPROM - это хранение некоторых данных (инициализация, конфиги, текстовые ресурсы) при отключениях питания. А это подразумевает фиксированную их привязку к определённым адресам.
ничуть.
это если нет механизма автоматического контроля за местом размещения данных, тогда надо следить за адресами.
как известно, одно из прогрессивных достижений языков высокого уровня заключается как раз в том, что пользователь оперирует не абсолютными адресами ячеек памяти, а абстрактными именами переменных. зачем же отказываться от этого?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
a.garkin
Нашел транзистор. Понюхал.
Сообщения: 175
Зарегистрирован: Вт сен 29, 2009 09:28:51
Откуда: Ульяновск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение a.garkin »

Подскажите как сделать. Есть ШИМ со стартом заполнения 50%, при нажатии на кнопку (см. код) заполнение 100%.

Код: Выделить всё

      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;
     }
Ответить

Вернуться в «AVR»