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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Непонятное поведение __delay_cycles
sevstels
сообщение Jan 27 2010, 04:10
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 626
Регистрация: 3-12-07
Пользователь №: 32 910



Столкнулся с очень странным поведением __delay_cycles.
Все прерывания запрещены, ничего лишенего не работает.
Но импульс с порта С имеет совершенно разные длительности, причём разница значительна:


//если батарея подключена - можно включить питание DC/DC 3.3v
if(SYSTEM.flag_BatteryPower)
{
PORTC |= (1<<DC3v3);
__delay_cycles(_1ms); //Вот тут задержка строго равна 1ms
PORTC &=~(1<<DC3v3);

if(CHECKBIT(PINF, CameraVolt)) SYSTEM.flag_CameraPower = true;
else
{

PORTC |= (1<<DC3v3);
__delay_cycles(_1ms); //А вот тут уже 20ms
PORTC &=~(1<<DC3v3);

}
}


--------------------
Herz - дятел.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 27 2010, 09:04
Сообщение #2


Гуру
******

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



Цитата(sevstels @ Jan 27 2010, 06:10) *
Все прерывания запрещены, ничего лишенего не работает.
Но импульс с порта С имеет совершенно разные длительности, причём разница значительна:
А теперь откройте листинг и с удивлением обнаружьте, что __delay_cycles() компилируется в самый обычный цикл. Ну и как одинаковый цикл может выполняться разное время, если все прерывания запрещены? Значит не все, или с тактированием мудрите, или программа в это время дергает ногой где-то в совсем другом месте программы. Чудес не бывает.

Что за страх такой заглянуть в листинг?


--------------------
На любой вопрос даю любой ответ
"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
sevstels
сообщение Jan 27 2010, 11:21
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 626
Регистрация: 3-12-07
Пользователь №: 32 910



Поздно уже смотреть.
Вынес включение из встроенного if{} и всё заработало как надо.
Что-то видимо компилятор мудрил.
Он мне иногда например оптимизировал все задержки в одну кучу.
Из этого:
PORTC |= (1<<PIN);
__delay_cycles(_1ms);
PORTC &=~(1<<PIN);
__delay_cycles(_1ms);
PORTC |= (1<<PIN);
__delay_cycles(_1ms);
PORTC &=~(1<<PIN);

Делал:
PORTC |= (1<<PIN);
__delay_cycles(_3ms);
PORTC &=~(1<<PIN);

И в итоге пин дёргался всего 1 раз.

-


--------------------
Herz - дятел.
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Jan 27 2010, 13:39
Сообщение #4


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



PORTC должен быть объявлен как volatile, иначе получите оптимизацию по полной
Go to the top of the page
 
+Quote Post
sevstels
сообщение Jan 28 2010, 01:02
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 626
Регистрация: 3-12-07
Пользователь №: 32 910



А вот интересно, компилятор ведёт лог оптимизаций?
Чтоб можно было быстро посмотреть в текстовом виде где что он сократил?
У меня программа уже огромная и начинаю сталкиваться с проблемой непредсказуемого поведения, потому что компилятор каждый раз меняет её по разному.


--------------------
Herz - дятел.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jan 28 2010, 07:32
Сообщение #6


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(MALLOY2 @ Jan 27 2010, 15:39) *
PORTC должен быть объявлен как volatile, иначе получите оптимизацию по полной

В заголовочных файлах дивайсов в IAR порты уже объявлены volatile.
Цитата
The __io (__ext_io) memory attribute implies that objects are __no_init and volatile, and allows
objects to be accessed by use of the special I/O instructions in the AVR microcontroller.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 28 2010, 21:27
Сообщение #7


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(sevstels @ Jan 28 2010, 04:02) *
У меня программа уже огромная и начинаю сталкиваться с проблемой непредсказуемого поведения, потому что компилятор каждый раз меняет её по разному.
Вашу программу потребуется поздно или рано переписать...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
sevstels
сообщение Jan 29 2010, 00:52
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 626
Регистрация: 3-12-07
Пользователь №: 32 910



Цитата
программу потребуется поздно или рано переписать

Вы видимо хотели ответить на интересующий меня вопрос? <компилятор ведёт лог оптимизаций?>


--------------------
Herz - дятел.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jan 29 2010, 01:44
Сообщение #9


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(sevstels @ Jan 29 2010, 04:52) *
Вы видимо хотели ответить на интересующий меня вопрос? <компилятор ведёт лог оптимизаций?>

Не думаю.
Он имел ввиду, что правильно написанная программа работает как положено не зависимо от выбранного уровня оптимизации.
smile.gif
Go to the top of the page
 
+Quote Post
sevstels
сообщение Jan 29 2010, 04:15
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 626
Регистрация: 3-12-07
Пользователь №: 32 910



Сразу всё "Правильно"?!
Не думаю...

Плиз, не можете подсказать - пожалуйста не мусорите банальностями, ведите себя "правильно".


--------------------
Herz - дятел.
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Jan 29 2010, 06:38
Сообщение #11


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Цитата
В заголовочных файлах дивайсов в IAR порты уже объявлены volatile.


Может человек не с хидера взял эту переменную smile.gif, я к тому что обычно такое происходит когда переменная не volotile, компилятор оптимизирует промежуточные значения.

Цитата
программа уже огромная

я так понимаю речь идет о AVR ? так там флеша нету даже для средних программ.

Лог оптимизации ? как вы его себе его представляете ? Компилятор генерирует ассемблерные листинги, этого достаточно чтобы даже найти баги компилятора smile.gif
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 29 2010, 06:55
Сообщение #12


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(sevstels @ Jan 29 2010, 07:15) *
пожалуйста не мусорите банальностями

пожалуйста, не спрашивайте о сферическом коне в вакууме. Или проблемные куски кода - на всеобщее обозрение, или smile3046.gif самостоятельно
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 29 2010, 08:07
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(sevstels @ Jan 29 2010, 07:15) *
Плиз, не можете подсказать - пожалуйста не мусорите банальностями, ведите себя "правильно".

Подсказку еще нужно понять. Для понимания нужно не требовать неведомые "логи оптимизации", а просто уметь читать листинги и, естественно, даже для начала немного представлять, что написали. Не ведаете, что творите и не понимаете что получили? Ну тогда фрагменты этих самых листингов с неработающими после оптимизации кусками представляйте на суд. И непременно оформленные соответствующими тэгами, иначе удалять буду.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sevstels
сообщение Jan 29 2010, 08:21
Сообщение #14


Знающий
****

Группа: Участник
Сообщений: 626
Регистрация: 3-12-07
Пользователь №: 32 910



Цитата
Лог оптимизации ? как вы его себе его представляете ?

Например так:

в блоке: (файл, строка ....)
//-------------------------
1: temp |= (1<<PIN);
2: __delay_cycles(_1ms);
3: temp &=~(1<<PIN);
4: __delay_cycles(_1ms);
5: temp |= (1<<PIN);
6: __delay_cycles(_1ms);
7: temp &=~(1<<PIN);
//--------------------------

оптимизация:
1: temp |= (1<<PIN);
2: delay: циклы
3: temp &=~(1<<PIN);

Разве плохо?
Иногда ввиду работы над большим проектом (или много людей), сложно сразу написать оптимальный код.
Например одна функция сбрасывает бит, а следующая его ставит. Сразу можно увидеть.
Это была бы неплохая подсказка при поиске разных непоняток.

-

Цитата
просто уметь читать листинги

Лучшее - враг хорошего.
С вашим талантом, да до сих пор все бы на асме писали. wink.gif

и пользовались zx-spectrum


--------------------
Herz - дятел.
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Jan 29 2010, 09:06
Сообщение #15


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Цитата
Например так:

Упасть и плакать sad.gif


Цитата
Цитата
просто уметь читать листинги

Лучшее - враг хорошего.

Это не лучшее и не худшее, это необходимое.

Цитата
С вашим талантом, да до сих пор все бы на асме писали.


Если вы не умете писать на ассемблере бросьте затею с микроконтроллерами качественный продукт вы не сделаете. Я не говорю о профессиональном знании ассемблера, но знание команд и как они работают обязан знать, обязан знать какие есть регистры у процессора, какие методы адресации поддерживает, как делает переходы, как обрабатывает прерывания, как работает стек и т.д., без этих знаний:

1) Программы написанные на "С" работают очень медленно.
2) Программы написанные на "С" занимают очень много места
3) Все компиляторы глючные, и не всегда дают рабочий вариант кода кода при включенной оптимизации.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 24th June 2025 - 08:04
Рейтинг@Mail.ru


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