|
AVR GCC не считает a = (b * pwm_ch2);, a и b uint, pwm_ch2 uchar; что не так? |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
May 14 2012, 11:21
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(smk @ May 14 2012, 13:48)  нет. просто не считает. Вернее считает, но в студии выскакивает Not in scope в момент подсчета, а это непорядок, жди глюков. Наверное результат нигде не используется - вот он и Not in scope - компилятор a заоптимизировал. Если хотите увидеть чему равно a объявите её так: Код volatile uint a;
|
|
|
|
|
May 14 2012, 13:13
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Цитата(smk @ May 14 2012, 13:48)  Вернее считает, но в студии выскакивает Not in scope в момент подсчета, а это непорядок, жди глюков. Быстрее всего компилятор через оптимизацию засунул переменную "а" в регистр. посмотрите в ассемблере где она.
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
May 14 2012, 18:04
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (smk @ May 14 2012, 19:43)  Вот может библиотеку какую подключить? Вот может быть пора посмотреть в листинг? Даю 99%, что переменная лежит в регистре, если вообще не заоптимизирована в следующее выражение, в котором она используется. Поэтому симулятор и не может ее показать. Ну не научили пока GCC сопровождать отладочной информацией переменную в регистре и ее блуждание по регистрам. И студии, соответственно, неоткуда брать эту информацию и показать вам она ничего не может. Откройте окно дизассемблера, осмыслите код и поймёте, в каких регистрах искать вашу переменную. Хотите надавать по рукам оптимизатору и увидеть переменную явно в памяти - объявите как volatile.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 15 2012, 11:37
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата(Сергей Борщ @ May 14 2012, 21:04)  Хотите надавать по рукам оптимизатору и увидеть переменную явно в памяти - объявите как volatile. Делал ранее и еще раз проверил. Не помогает. Привожу для интереса код (ламерского качества, сам понимаю, т.к. не писался а копи-пастился). Может кто поймет в чем там дело? Код #include <avr/io.h> #include <stdint.h> #include <math.h>
volatile unsigned char pwm=0, pwm_ch1=0, pwm_ch2=255, step=0, b, flag=0; volatile unsigned int count=0, tik=0; volatile unsigned int a, c;
int main (void) { PORTB = 0x00; DDRB = 0x0F; PORTA = 0x01; DDRA = 0x00; OCR1A = 0x7F; OCR1B = 0x7F; OCR1C = 0xFF; TCCR1A = 0b10100011; TCCR1B = 0x08; //start Timer
while(1) { if(step==0) { if(count==300) { step=1; count = 0; } } if(step==1) { if(count==1) { pwm_ch1++; pwm_ch2--; count=0; } if(pwm_ch2==0) { step=2; count = 0; } } if(step==2) { if(count==300) { step=3; count = 0; } } if(step==3) { if(count==1) { pwm_ch1--; pwm_ch2++; count=0; } if(pwm_ch1==0) { step=0; count = 0; } }
if(pwm==255) {count++; tik++;} pwm++;
a = (b * (unsigned int)pwm_ch1); c = (b * (unsigned int)pwm_ch2);
OCR1A = (unsigned char)(a>>8); OCR1B = (unsigned char)(c>>8);
if(tik==1) { tik=0; if(!(PINA & (1<<0))) { if(flag==0) b++; if(b==255) flag=1; if(flag==1) b--; if(b==0) flag=0; } } } return 0; }
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
May 15 2012, 12:06
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (smk @ May 15 2012, 14:37)  Делал ранее и еще раз проверил. Не помогает. Как??? Все есть в листинге. CODE 173 .LSM39: <--------- a = (b * (unsigned int)pwm_ch1); 174 0134 2091 0000 lds r18,b 175 0138 8091 0000 lds r24,pwm_ch1 176 013c 829F mul r24,r18 177 013e C001 movw r24,r0 178 0140 1124 clr r1 179 0142 9093 0000 sts (a)+1,r25 GAS LISTING D:/Temp/ccOicLpk.s page 4
180 0146 8093 0000 sts a,r24 181 .LSM40: <--------- c = (b * (unsigned int)pwm_ch2); 182 014a 2091 0000 lds r18,b 183 014e 8091 0000 lds r24,pwm_ch2 184 0152 829F mul r24,r18 185 0154 C001 movw r24,r0 186 0156 1124 clr r1 187 0158 9093 0000 sts (c)+1,r25 188 015c 8093 0000 sts c,r24 189 .LSM41: <--------- OCR1A = (unsigned char)(a>>8); 190 0160 8091 0000 lds r24,a 191 0164 9091 0000 lds r25,(a)+1 192 0168 892F mov r24,r25 193 016a 90E0 ldi r25,lo8(0) 194 016c 9BBD out (74)+1-32,r25 195 016e 8ABD out 74-32,r24 196 .LSM42: <--------- OCR1B = (unsigned char)(c>>8); 197 0170 8091 0000 lds r24,c 198 0174 9091 0000 lds r25,(c)+1 199 0178 892F mov r24,r25 200 017a 90E0 ldi r25,lo8(0) 201 017c 99BD out (72)+1-32,r25 202 017e 88BD out 72-32,r24 А видит ли студия - не знаю. Остальные переменные видит? Расчехлил студию. Не вижу проблем:
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 15 2012, 13:06
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980

|
Цитата(smk @ May 15 2012, 14:37)  if(!(PINA & (1<<0)))  у Шуры шары Зачем сдвиг? Чтобы у компилятора шарики за ролики заехали и чтобы он ещё и в этом if-е Вам Бог знает что нагенерил? Или Вы его специально на прочность проверяете? А потом будете спрашивать, а чего оно не работает? Проще и понятнее if(!(PINA & 1)) По теме - пусть уважаемый Сергей Борщ даст свой makefile, на котором всё работает. Может ключики где-то отличаются..
Сообщение отредактировал hd44780 - May 15 2012, 13:20
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|