реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Оптимизация в WinAVR, выбрасывает if
smk
сообщение Feb 13 2008, 21:16
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Вот такой кусок кода:

uint_least8_t k = (T_TEST<<2);
for(;;)
{
//***********************************
if(ac>A_SIG)
{
a_on;
buzz_on;
}

if(ac>B_SIG)
{
b_on;
buzz_on;
}
//***********************************
if( TIFR1 & (1<<TOV1) )
{
TCNT1H = (unsigned char)((T1_DIV)>>8);
TCNT1L = (unsigned char)T1_DIV;
TIFR1 |= (1<<TOV1);
if( !--k )
break;
}
}

То, что между строками из звездочек выбрасывается из программы, а это нельзя. Что можно предпринять? Заранее спасибо!


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Feb 13 2008, 21:34
Сообщение #2


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(smk @ Feb 14 2008, 00:16) *
Вот такой кусок кода:
.......
uint_least8_t k = (T_TEST<<2);
for(;;)
{
//***********************************
if(ac>A_SIG)
{
a_on;
buzz_on;
Вы бы хоть написали что означают:
a_on
buzz_on
ac
A_SIG
B_SIG

А варнингов у Вас не выдает случаем ?
Самое вероятное ,учитывая количество инфы в Вашем посте,
у Вас ac объявленно как unsigned char, а A_SIG и B_SIG это дефайны которые получены
путем каких-то вычислений, и в результате этих вычислений A_SIG и B_SIG просто >256,
поэтому компилятор вправе a_on и buzz_on просто выкинуть.
Go to the top of the page
 
+Quote Post
smk
сообщение Feb 13 2008, 21:44
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата
Вы бы хоть написали что означают:


unsigned int ac; //глобальная
A_SIG = EEPROM_read_16 (10, 11); //тоже int читается из EEPROM
B_SIG = EEPROM_read_16 (14, 15);
#define a_on PORTA &= ~(1<<1);
#define b_on PORTA &= ~(1<<0);
#define buzz_on DDRB |= (1<<2);

Вообще-то начальное значение, например, A_SIG это 0xFF, а ac всегда инициализируется как 0. Потом конечно в прерывании от ADC значение ас меняется, пишется в EEPROM, на место, например, A_SIG. При повторном включении все повторяется, только A_SIG уже не 0xFF. Это нужно для калибровки при серии последовательных включений. Как быть?

Варнингов нет.
Спасибо, что откликнулись! Просто ума не приложу с какого конца подступиться...

Сообщение отредактировал smk - Feb 13 2008, 21:50


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Feb 13 2008, 22:24
Сообщение #4


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(smk @ Feb 14 2008, 00:44) *
unsigned int ac; //глобальная
A_SIG = EEPROM_read_16 (10, 11); //тоже int читается из EEPROM
B_SIG = EEPROM_read_16 (14, 15);
#define a_on PORTA &= ~(1<<1);
#define b_on PORTA &= ~(1<<0);
#define buzz_on DDRB |= (1<<2);

макросы написаны не очень, но в принципе криминала никакого нет,
разьве что ; где-нить уберите, или в определении или в подстановке,
хотя это тоже не криминал.
Ну и для макросов строго обязательно все заключать в скобки, те например
#define SHIFT 5
#define MYBIT (1<<SHIFT)
Если убрать скобки в определении MYBIT, будете "долго жевать сопли замоченные в сортире..." © ВВП

А зачем у Вас передается 2 числа в EEPROM_read_16 ?
Адреса ячеек ? 16 бит у Вас может храниться не в соседних ячейках ?

А по Вашей проблеме, ну... проект в студию что ли...
Выкидывать обращения к PORTA компилятор права не имеет...
Если Вы конечно его не переопределили..
Go to the top of the page
 
+Quote Post
smk
сообщение Feb 13 2008, 23:31
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Там что-то с условиями if связано. Не могу разобраться пока. А есть возможность сказать "это не трогать"?


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
smk
сообщение Feb 14 2008, 01:08
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



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

И еще...
Цитата
макросы написаны не очень

стиль не такой и т.п. А как надо? Прерывание тоже переписал, но логически суть не изменилась. Обработчик разьве что стал короче... Так какие "Правила хорошего тона для С"? Хочу научиться им.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
SSerge
сообщение Feb 14 2008, 02:05
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(smk @ Feb 14 2008, 03:44) *
Потом конечно в прерывании от ADC значение ас меняется,

а компилятор-то об этом не знает, надо ему объяснить:
volatile unsigned int ac; //глобальная


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
smk
сообщение Feb 14 2008, 07:08
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата
компилятор-то об этом не знает, надо ему объяснить:
volatile unsigned int ac; //глобальная

Сделал. На будущее - так со всеми глобальными поступать?


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 14 2008, 08:31
Сообщение #9


Гуру
******

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



Цитата(smk @ Feb 14 2008, 09:08) *
Сделал. На будущее - так со всеми глобальными поступать?
С теми, которые изменяются неизвестными компилятору способами. Он видит, что перед циклом вы ac обнулили, а в цикле не изменяете - он и считает, что она осталась равной нулю и значит ваши условия не сработают. Так зачем их проверять?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 07:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01419 секунд с 7
ELECTRONIX ©2004-2016