Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 09.08.2011, 07:32  
Arxi
Прохожий
 
Регистрация: 07.11.2009
Сообщений: 7
Сказал спасибо: 2
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
Arxi на пути к лучшему
По умолчанию Что за оптимизация такая в 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.
Arxi вне форума  
Сказали "Спасибо" Arxi
warel (28.06.2019)
Непрочитано 09.08.2011, 08:15  
aleksandr-zh
Гражданин KAZUS.RU
 
Регистрация: 03.12.2004
Сообщений: 932
Сказал спасибо: 824
Сказали Спасибо 609 раз(а) в 216 сообщении(ях)
aleksandr-zh на пути к лучшему
По умолчанию Re: Что за оптимизация такая в IAR? Или ошибка компиляции?

((PINC & (1‹‹ PC0)) == 1)
неверна конструкция

а почему нельзя обратиться непосредственно к нужному пину?
типа PINC.1 = 1 ?

(если позволяет компилятор так сделать)
aleksandr-zh вне форума  
Сказали "Спасибо" aleksandr-zh
warel (28.06.2019)
Непрочитано 09.08.2011, 08:20  
Arxi
Прохожий
 
Регистрация: 07.11.2009
Сообщений: 7
Сказал спасибо: 2
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
Arxi на пути к лучшему
По умолчанию Re: Что за оптимизация такая в IAR? Или ошибка компиляции?

Сообщение от aleksandr-zh Посмотреть сообщение
((PINC & (1‹‹ PC0)) == 1)
неверна конструкция

а почему нельзя обратиться непосредственно к нужному пину?
типа PINC.1 = 1 ?

(если позволяет компилятор так сделать)
А в чем она неверная? Как раз проверка PC0 работает, а проверка остальных пинов - нет. PCO (PC1, PC2...) дефайном меняются на 0 (1,2...). Таким образом сравнивается регистр PINC (доступный для чтения) и маска нужного бита.
Arxi вне форума  
Сказали "Спасибо" Arxi
warel (28.06.2019)
Непрочитано 09.08.2011, 08:28  
Arxi
Прохожий
 
Регистрация: 07.11.2009
Сообщений: 7
Сказал спасибо: 2
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
Arxi на пути к лучшему
По умолчанию Re: Что за оптимизация такая в IAR? Или ошибка компиляции?

Так...эту проблему решил как подсказали...
Заменил мою писанину на if (PINC_BitX). Теперь ничего не выкидывает.
Еще возник вопрос. Про инклуды.
Когда я в main.c пишу if (PINC_Bit0) num1++ то все работает. Но как только данную проверку переношу в функцию, которая находится в другом файле, то начинаются проблемы. Сначала IAR ругается что "PINC_Bit0" не объявлена. Ок...добавлю нужные *.h файлы (которые уже добавлены в main.c). Теперь он начинает ругаться на эти *.h файлы, якобы в другом месте уже все объявлено... как быть?

Последний раз редактировалось Arxi; 09.08.2011 в 08:47.
Arxi вне форума  
Сказали "Спасибо" Arxi
warel (28.06.2019)
Непрочитано 09.08.2011, 08:43  
ut1wpr
Почётный гражданин KAZUS.RU
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию 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
ut1wpr вне форума  
Эти 2 пользователя(ей) сказали Спасибо ut1wpr за это сообщение:
Arxi (09.08.2011), warel (28.06.2019)
Непрочитано 09.08.2011, 08:54  
Arxi
Прохожий
 
Регистрация: 07.11.2009
Сообщений: 7
Сказал спасибо: 2
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
Arxi на пути к лучшему
По умолчанию Re: Что за оптимизация такая в IAR? Или ошибка компиляции?

To ut1wpr
Хм...так получается если я один хэйдер уже куда то включил (в файл main.c например), вызвал в main функцию opros(), которая объявлена в другом файле (например в func.c), то если хэйдер нужен и в main.c и в func.c то как быть? Если я его включаю только в один из них то возникает ошибки...
Arxi вне форума  
Сказали "Спасибо" Arxi
warel (28.06.2019)
Непрочитано 09.08.2011, 09:22  
testerplus
Прописка
 
Регистрация: 26.01.2009
Сообщений: 249
Сказал спасибо: 23
Сказали Спасибо 102 раз(а) в 61 сообщении(ях)
testerplus на пути к лучшему
По умолчанию 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 вне форума  
Сказали "Спасибо" testerplus
warel (28.06.2019)
Непрочитано 09.08.2011, 10:55  
SasaVitebsk
Гражданин KAZUS.RU
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию 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 вне форума  
Сказали "Спасибо" SasaVitebsk
warel (28.06.2019)
Непрочитано 09.08.2011, 11:30  
Arxi
Прохожий
 
Регистрация: 07.11.2009
Сообщений: 7
Сказал спасибо: 2
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
Arxi на пути к лучшему
По умолчанию Re: Что за оптимизация такая в IAR? Или ошибка компиляции?

SasaVitebsk, testerplus, спасибо! Не доглядел
Arxi вне форума  
Сказали "Спасибо" Arxi
warel (28.06.2019)
Непрочитано 09.08.2011, 12:03  
Arxi
Прохожий
 
Регистрация: 07.11.2009
Сообщений: 7
Сказал спасибо: 2
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
Arxi на пути к лучшему
По умолчанию Re: Что за оптимизация такая в IAR? Или ошибка компиляции?

Тогда еще продолжу бой с IAR... Почему он убирает строчки:

//массивы для хранения текста

INT8S d[5]; //день
INT8S m[5]; //месяц
INT8S y[7]; //год
INT8S razd[] = ":";
INT8S toch[] = ".";

в дефайнах "typedef signed char INT8S;"
В чем тут дело?
Arxi вне форума  
Сказали "Спасибо" Arxi
warel (28.06.2019)
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Эрудиция и смекалка slavar1 Отвлекитесь, эмбеддеры! 12765 06.04.2024 20:45
Дорога... vo1 Отвлекитесь, эмбеддеры! 41 28.03.2009 09:42
[Решено] Так, рассказик :)) Я долго ржал :)) DK Отвлекитесь, эмбеддеры! 7 31.08.2007 22:33
[Решено] Сборник перлов любителей кабельщины mikesmith Отвлекитесь, эмбеддеры! 135 14.08.2007 15:49


Часовой пояс GMT +4, время: 13:39.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot