Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
09.08.2011, 07:32
|
|
Прохожий
Регистрация: 07.11.2009
Сообщений: 7
Сказал спасибо: 2
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Что за оптимизация такая в IAR? Или ошибка компиляции?
Пишу проект в IAR 5.50. Вот часть исходного кода на Си где возникает непонятка:
#pragma vector=TIMER0_COMP_vect
__interrupt void TIMER0_interrupt (void)
{
//asm("cli");
if ((PINC & (1‹‹ PC0)) == 1) num1++;
if ((PINC & (1‹‹ PC1)) == 1) num2++;
if ((PINC & (1‹‹ PC2)) == 1) num3++;
if ((PINC & (1‹‹ PC3)) == 1) num4++;
if ((PINC & (1‹‹ PC4)) == 1) num5++;
if ((PINC & (1‹‹ PC5)) == 1) num6++;
...
А вот то, что я вижу в AVR Studio при отладке:
389: if ((PINC & (1‹‹ PC0)) == 1) num1++;
LDS R16,0x0707
INC R16
STS 0x0707,R16
390: if ((PINC & (1‹‹ PC1)) == 1) num2++;
IN R17,0x06
391: if ((PINC & (1‹‹ PC2)) == 1) num3++;
IN R18,0x06
392: if ((PINC & (1‹‹ PC3)) == 1) num4++;
IN R19,0x06
393: if ((PINC & (1‹‹ PC4)) == 1) num5++;
IN R20,0x06
394: if ((PINC & (1‹‹ PC5)) == 1) num6++;
IN R21,0x06
Как видно производится обработка только первой проверки if ((PINC & (1‹‹ PC0)) == 1), остальные же ничего не делают...в чем дело?
Последний раз редактировалось Arxi; 09.08.2011 в 07:37.
|
|
|
|
09.08.2011, 08:15
|
|
Гражданин KAZUS.RU
Регистрация: 03.12.2004
Сообщений: 932
Сказал спасибо: 824
Сказали Спасибо 609 раз(а) в 216 сообщении(ях)
|
Re: Что за оптимизация такая в IAR? Или ошибка компиляции?
((PINC & (1‹‹ PC0)) == 1)
неверна конструкция
а почему нельзя обратиться непосредственно к нужному пину?
типа PINC.1 = 1 ?
(если позволяет компилятор так сделать)
|
|
|
Сказали "Спасибо" aleksandr-zh
|
|
|
09.08.2011, 08:20
|
|
Прохожий
Регистрация: 07.11.2009
Сообщений: 7
Сказал спасибо: 2
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: Что за оптимизация такая в IAR? Или ошибка компиляции?
Сообщение от aleksandr-zh
|
((PINC & (1‹‹ PC0)) == 1)
неверна конструкция
а почему нельзя обратиться непосредственно к нужному пину?
типа PINC.1 = 1 ?
(если позволяет компилятор так сделать)
|
А в чем она неверная? Как раз проверка PC0 работает, а проверка остальных пинов - нет. PCO (PC1, PC2...) дефайном меняются на 0 (1,2...). Таким образом сравнивается регистр PINC (доступный для чтения) и маска нужного бита.
|
|
|
|
09.08.2011, 08:28
|
|
Прохожий
Регистрация: 07.11.2009
Сообщений: 7
Сказал спасибо: 2
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: Что за оптимизация такая в IAR? Или ошибка компиляции?
Так...эту проблему решил как подсказали...
Заменил мою писанину на if (PINC_BitX). Теперь ничего не выкидывает.
Еще возник вопрос. Про инклуды.
Когда я в main.c пишу if (PINC_Bit0) num1++ то все работает. Но как только данную проверку переношу в функцию, которая находится в другом файле, то начинаются проблемы. Сначала IAR ругается что "PINC_Bit0" не объявлена. Ок...добавлю нужные *.h файлы (которые уже добавлены в main.c). Теперь он начинает ругаться на эти *.h файлы, якобы в другом месте уже все объявлено... как быть?
Последний раз редактировалось Arxi; 09.08.2011 в 08:47.
|
|
|
|
09.08.2011, 08:43
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Что за оптимизация такая в IAR? Или ошибка компиляции?
Сообщение от Arxi
|
Так...эту проблему решил как подсказали...
Заменил мою писанину на if (PORTC_BitX). Теперь ничего не выкидывает.
Еще возник вопрос. Про инклуды.
Когда я в main.c пишу if (PORTC_Bit0) num1++ то все работает. Но как только данную проверку переношу в функцию, которая находится в другом файле, то начинаются проблемы. Сначала IAR ругается что "PORTC_Bit0" не объявлена. Ок...добавлю нужные *.h файлы (которые уже добавлены в main.c). Теперь он начинает ругаться на эти *.h файлы, якобы в другом месте уже все объявлено... как быть?
|
В хидерном файле, который многократно инклудится, ввести защиту от дублирования:
Код:
|
#ifndef _myheader_h_
#define _myheader_h_
#define...
#define...
#define...
#endif |
|
|
|
Эти 2 пользователя(ей) сказали Спасибо ut1wpr за это сообщение:
|
|
|
09.08.2011, 08:54
|
|
Прохожий
Регистрация: 07.11.2009
Сообщений: 7
Сказал спасибо: 2
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: Что за оптимизация такая в IAR? Или ошибка компиляции?
To ut1wpr
Хм...так получается если я один хэйдер уже куда то включил (в файл main.c например), вызвал в main функцию opros(), которая объявлена в другом файле (например в func.c), то если хэйдер нужен и в main.c и в func.c то как быть? Если я его включаю только в один из них то возникает ошибки...
|
|
|
|
09.08.2011, 09:22
|
|
Прописка
Регистрация: 26.01.2009
Сообщений: 249
Сказал спасибо: 23
Сказали Спасибо 102 раз(а) в 61 сообщении(ях)
|
Re: Что за оптимизация такая в IAR? Или ошибка компиляции?
Сообщение от Arxi
|
А в чем она неверная? Как раз проверка PC0 работает, а проверка остальных пинов - нет. PCO (PC1, PC2...) дефайном меняются на 0 (1,2...). Таким образом сравнивается регистр PINC (доступный для чтения) и маска нужного бита.
|
Вот она у Вас и работает только для PC0, т.к. там будет результат либо 0x00, либо 0x01. А для, например, PC1 результат будет либо 0x00, либо 0x02. Т.к. он однозначно никогда не будет равен 1, то компилятор выкидывает все из if'а. Просто можно было убрать == из условия:
Код:
|
if (PINC & (1‹‹ PC0)) num1++;
if (PINC & (1‹‹ PC1)) num2++;
... |
|
|
|
Сказали "Спасибо" testerplus
|
|
|
09.08.2011, 10:55
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Что за оптимизация такая в IAR? Или ошибка компиляции?
Сообщение от Arxi
|
А в чем она неверная? Как раз проверка PC0 работает....
|
Как раз для PC0 она и верная, а для остальных - неверная. Но умный компилятор выбросил чушь, что вы написали, как никогда не выполняющуюся. При этом он сообщил вам, что "оператор не имеет смысла"...
Разберём почему она никогда не исполнится и как надо переписать, чтобы всё было нормально. Итак конструкция вида ...
((PINC & (1‹‹ PC1)) == 1) к примеру....
Мы видим что берутся пины порта C и делается логическое & с (1‹‹PC1) то есть с 0b00000010 или с 2. Таким образом результат этой операции будет либо 0 либо 2.... "1" не будет НИКОГДА. Аналогично для PC2 результат будет либо 0 либо 4 и так далее ...
====
Итак что надо было написать, чтобы данная конструкция работала?
Ответ очевиден ...
((PINC & (1‹‹ PC1)) != 0)
И всё будет компилироваться ... ))))
|
|
|
Сказали "Спасибо" SasaVitebsk
|
|
|
09.08.2011, 11:30
|
|
Прохожий
Регистрация: 07.11.2009
Сообщений: 7
Сказал спасибо: 2
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: Что за оптимизация такая в IAR? Или ошибка компиляции?
SasaVitebsk, testerplus, спасибо! Не доглядел
|
|
|
|
09.08.2011, 12:03
|
|
Прохожий
Регистрация: 07.11.2009
Сообщений: 7
Сказал спасибо: 2
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: Что за оптимизация такая в IAR? Или ошибка компиляции?
Тогда еще продолжу бой с IAR... Почему он убирает строчки:
//массивы для хранения текста
INT8S d[5]; //день
INT8S m[5]; //месяц
INT8S y[7]; //год
INT8S razd[] = ":";
INT8S toch[] = ".";
в дефайнах "typedef signed char INT8S;"
В чем тут дело?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:39.
|
|