Страница 373 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн ноя 14, 2016 21:11:32
realm
Я ж написал вопрос. Прочтите его заново.
Компилятор сносит не используемый массив и переносит на его место используемые переменные.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн ноя 14, 2016 21:18:03
Аlex
Я читал и прекрасно понял, что у Вас не получается.
А кроме отдельного массива ничего в голову не приходит ?

Например один общий ресурс для ненужных и нужных данных ? Тот-же массив, или структура.
И что значит "неиспользуемый" ? А обмануть компиль ? Например заюзать эти данные в каком-нибудь одном месте ...
Вариантов то море. На одном том, который Вы использовали, свет клином не сошёлся. Не вижу вообще никаких проблем в Вашей ситуации

Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн ноя 14, 2016 22:57:55
realm
Перенос переменных в структуру ровным счетом ничего не меняет.
Нормальные компиляторы только предупреждают о том, что переменная не используется и самостоятельно ее не удаляют и не переназначают адреса остальных переменных. Но это ж Codevision...
Обмануть компилятор - прочитать данные и ничего с ними не делать. Этот кусок кода компилятор так же вырежет, а вместе с ними за одно и переменную.
Прокатит только если прочитать данные и записать в другую ячейку. Этот вариант не подходит, т.к. создает задержку.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн ноя 14, 2016 23:13:10
Аlex
realm писал(а):т.к. создает задержку.
В момент запуска МК ?
Если Вы так сильно брыкаетесь, то вариант один (я уже о нём писал) - создать самому функции работы с eeprom.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн ноя 14, 2016 23:15:43
COKPOWEHEU
А указать линкеру адрес начала сегмента?
А работать с адресами EEPROM вручную, задавая абсолютные адреса?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн ноя 14, 2016 23:22:13
*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
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн ноя 14, 2016 23:26:23
Аlex
Ну вот, оказывается в справке всё есть. Просто кому-то лень читать её

Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн ноя 14, 2016 23:33:05
realm
COKPOWEHEU писал(а):А работать с адресами EEPROM вручную, задавая абсолютные адреса?
Не поверите, но именно так сейчас и работает.
Как только я добавлю какую ни будь переменную и забуду указать ей абсолютный адрес, она окажется в адресе 0.
Добавлено after 4 minutes 54 seconds:
*Trigger* писал(а):окружаем кусок кода такими магическими строчками, временно отключающими оптимизацию
Ага. Написано... Прочтите еще раз.
#pragma optsize-
#pragma optsize_default
Для переменных не работает.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн ноя 14, 2016 23:35:15
Аlex
Чё, даже
volatile не работает в кодвижне ?

Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн ноя 14, 2016 23:53:25
realm
Аlex писал(а):Чё, даже
volatile не работает в кодвижне ?

А это то тут вообще при чем...
volatile работает.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн ноя 14, 2016 23:54:31
*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+ позволяет запретить выкидывание неиспользуемых переменных и функций.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт ноя 15, 2016 00:07:42
Аlex
realm писал(а):А это то тут вообще при чем...
А это, уважаемый, лекарство против компиляторского произвола по выкидыванию ненужных, по его мнению, переменных

Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт ноя 15, 2016 00:36:42
realm
#pragma keep+
#pragma keep-
Именно то, что было нужно! Я помнил, что есть на этот счет что-то но ее с #pragma optsize- перепутал.
Спасибо!
Кстати. Плюсануть сообщение не получается. Висит затемнение с кружком загрузки и больше ничего не происходит.
Добавлено after 7 minutes 36 seconds:
Аlex писал(а):А это, уважаемый, лекарство против компиляторского произвола
В CV он для регистров и RAM.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт ноя 15, 2016 00:40:53
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
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт ноя 15, 2016 03:43:42
realm
COKPOWEHEU писал(а):Это как? Как вы пытаетесь работать с переменными по абсолютным адресам, не задавая их?
А вот так:
eeprom unsigned int var1[8] @0x20; // будет находиться в адресе 0x20
eeprom unsigned int var2 @0x28; //будет находиться в адресе 0x28
eeprom unsigned int var3; //будет находиться в адресе 0x00
А грозит это примерно следующим - до самого конца написания софта прийдется на каждую переменную в еепроме назначать абсолютный адрес. Извращенством не страдаю.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт ноя 15, 2016 06:57:10
ARV
realm писал(а):Извращенством не страдаю
в собственном EEPROM работать с конкретными адресами, игнорируя сервис автоматического доступа по именам переменных - это ли не извращение? я могу бы понять, когда память внешняя извлекаемая, т.е. вставили чип в панельку и работаем с ним, но когда в своей программе надо идти против воли компилятора - этого я не понимаю...
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт ноя 15, 2016 19:04:44
COKPOWEHEU
Вопрос про указание начала сегмента был проигнорирован.
Раз уж занимаетесь извращениями вроде ручного назначения адресов, могу предложить еще один вариант - сделать переменные полями структуры и задать адрес только для нее.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт ноя 15, 2016 19:39:02
WiseLord
А чем так плохо ручное указание адресов в EEPROM, что это тут уже и извращением стали называть? По мне, так основное назначение EEPROM - это хранение некоторых данных (инициализация, конфиги, текстовые ресурсы) при отключениях питания. А это подразумевает фиксированную их привязку к определённым адресам.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт ноя 15, 2016 19:42:13
ARV
WiseLord писал(а):По мне, так основное назначение EEPROM - это хранение некоторых данных (инициализация, конфиги, текстовые ресурсы) при отключениях питания. А это подразумевает фиксированную их привязку к определённым адресам.
ничуть.
это если нет механизма автоматического контроля за местом размещения данных, тогда надо следить за адресами.
как известно, одно из прогрессивных достижений языков высокого уровня заключается как раз в том, что пользователь оперирует не абсолютными адресами ячеек памяти, а абстрактными именами переменных. зачем же отказываться от этого?!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт ноя 15, 2016 20:36:43
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;
}