|
Непонятные действия оптимизации. |
|
|
|
Dec 22 2008, 11:01
|
Знающий
   
Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709

|
Начал проект с простого (WinAVR-20070525), таймер и исключающее ИЛИ пина порта (PORTA) в обработчике прерывания этого самого таймера. На выходе ожидался генератор меандра. Загрузил, не работает. После некоторых мук определил, что виновата оптимизация, собираю проект без оптимизации всё работает. Немного расширил проект, стал работать и с оптимизацией, но всё равно некоторые важные части оптимизирует на свой лад. Я понимаю соптимизировать переменную, которая ничего кроме инвертирования не делает, но выкидывание работы с портом, этого я не понимаю. Может я и правда чего не понимаю.
|
|
|
|
|
Dec 22 2008, 11:22
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 28-09-05
Пользователь №: 9 021

|
Как на счет объявить переменные с квалификатором volatile, а ввод/вывод сделать на асме.
|
|
|
|
|
Dec 22 2008, 11:23
|

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

|
Цитата(Oleg_IT @ Dec 22 2008, 13:01)  Может я и правда чего не понимаю. А уж нам-то каково телепатировать! Показывайте код.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 22 2008, 12:54
|
Знающий
   
Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709

|
Я переменными для начала не пользовался и volatile мне не к чему. А на порт volatile ставить… В АСМе порты программировать можно, но если проект на Си, то и с портами желательно в Си работать. Простенький код Код ISR (TIMER0_COMP_vect) { TCNT0 = 0x00; PORTA ^= 1; }
int main(void) { TCCR0 = (1 << CS00); TCNT0 = 0x00; OCR0 = Dl; TIMSK |= (1 << OCIE0);
DDRA = 0xFF; PORTA = 0xFF;
sei();
while (1) { } return 0; }
|
|
|
|
|
Dec 22 2008, 13:28
|

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

|
Цитата(Сергей Борщ @ Dec 22 2008, 14:23)  А уж нам-то каково телепатировать! Показывайте код. И для какого MCU Вы компилируете вашу программу? Невозможно дать Вам совет по инициализации таймера не зная тип MCU. И ещё, хочу Вам напомнить про сторожевой таймер: Я не увидел в Вашем коде ни wdt_disable() ни wdt_reset()... Пожалуйста форматируйте код в постах (есть волшебная кнопка # над окном ввода текста сообщения).
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Dec 22 2008, 13:42
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(demiurg_spb @ Dec 22 2008, 15:28)  Я не увидел в Вашем коде ни wdt_disable() ни wdt_reset()... А зачем им там быть? Раз нет значит не используется. Цитата(_Pasha @ Dec 22 2008, 15:13)  если Вы не потрудились даже настроить таймер на работу с OCR0??? Почему же, он всего лишь не выставил CTC (WGM01), и делает сброс таймера вручную. Такой способ тоже имеет право на жизнь. OCIE0 возникнет в любом случае при достижении таймером значения OCR0. Oleg_ITВаша программа работает одинаково, как с оптимизацией, так и без нее. Уточняйте, где смотреть проблему?
|
|
|
|
|
Dec 22 2008, 16:35
|
Знающий
   
Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709

|
Цитата(_Pasha @ Dec 22 2008, 16:13)  Уважаемый, никакой Си не избавит Вас от необходимости курить мануал и думать головой.  Каким макаком у Вас будет прерывание, если Вы не потрудились даже настроить таймер на работу с OCR0??? Уважаемый, я Вас не понял. Где тут ошибка??? В регистр TCCR0 устанавливаю бит CS00, который clkI/O/(No prescaling). Не отметил, МК ATMetga32. Я же говорю, без оптимизации все работает!!! Вочдог не использую и фьюз не стоит. Цитата(demiurg_spb @ Dec 22 2008, 16:28)  Пожалуйста форматируйте код в постах (есть волшебная кнопка # над окном ввода текста сообщения). Спасибо, учту. Цитата(defunct @ Dec 22 2008, 16:42)  Ваша программа работает одинаково, как с оптимизацией, так и без нее. Уточняйте, где смотреть проблему? Увы не одинаково и не стабильно. Без оптимизации всё нормально, с –Os и до –O1 чудеса.
|
|
|
|
|
Dec 22 2008, 16:56
|

Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581

|
Цитата(Oleg_IT @ Dec 22 2008, 19:35)  В регистр TCCR0 устанавливаю бит CS00, который... Так и надо: Код TCCR0 = (1 << CS00); ? Или очепятка? Код TCCR0|= (1 << CS00);
Сообщение отредактировал Goodefine - Dec 22 2008, 16:57
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Dec 22 2008, 17:03
|
Знающий
   
Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709

|
Цитата(Goodefine @ Dec 22 2008, 19:56)  Так и надо: Код TCCR0 = (1 << CS00); ? Или очепятка? Код TCCR0|= (1 << CS00); Нет, именно так Код TCCR0 = (1 << CS00); это не очепятка  Просто в этом регистре мне ни чего не нужно кроме этого бита.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|