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

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

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

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

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

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

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

 
Опции темы

Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?

Непрочитано 29.06.2010, 01:37  
testerplus
Прописка
 
Регистрация: 26.01.2009
Сообщений: 249
Сказал спасибо: 23
Сказали Спасибо 102 раз(а) в 61 сообщении(ях)
testerplus на пути к лучшему
По умолчанию Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?

Сообщение от Godzilla82 Посмотреть сообщение
И как ни странно, это всё работало при всех оптимизациях
Не странно. Было бы странно, если бы это работало на всех компиляторах. Поставьте перед while строчку "pw = 1;" и соберите программу в WinAVR с оптимизацией -Os. Увидите, что будет. (Какой Вы все-таки упрямый! )
Реклама:

Последний раз редактировалось testerplus; 29.06.2010 в 01:39.
testerplus вне форума  
Непрочитано 29.06.2010, 03:17  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?

Сообщение от Godzilla82 Посмотреть сообщение
И как ни странно, это всё работало при всех оптимизациях
А в CV оптимизатора вообще нет, одно название. Я угадал с компилятором? Так что там работать будет что угодно, но медленно и печально
kison вне форума  
Непрочитано 29.06.2010, 18:14  
SasaVitebsk
Гражданин KAZUS.RUN
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?

Добавлю следующее к последним 2 постам.
Меня не устроит ситуация "может будет работать, а может нет". Я хочу, чтобы гарантировано работало. Для этого надо писать в рамках языка, чётко понимая, что я пишу и зачем. У меня нет ни времени ни желания, с помощью экспериментов и неосмысленных действий добиваться, чтобы компилятор компилировал "правильно". Я сразу исхожу из того, что компилятор всё делает грамотно. И если что-то не работает, то я ищу свой хомут. А не начинаю грешить на компилятор.
SasaVitebsk вне форума  
Сказали "Спасибо" SasaVitebsk
Vetal-soft (29.06.2010)
Непрочитано 01.07.2010, 11:07  
291066
Прописка
 
Регистрация: 05.03.2010
Сообщений: 144
Сказал спасибо: 47
Сказали Спасибо 195 раз(а) в 19 сообщении(ях)
291066 на пути к лучшему
По умолчанию Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?

Всем огромное спасибо!
Прерывания начали прерывать Ошибкой было отсутствие инициализации PCMSK. Почему то я его воспринял как регистр флагов, а не как регистр маски.
А вот с работоспособностью программы пока плохо Если раньше я мог откомпилировать без оптимизации и проверить работоспособность, то сейчас уже не помещаюсь без оптимизации в память. Так что буду отлаживаться частями.
Еще раз всем спасибо.
291066 вне форума  
Непрочитано 07.07.2010, 03:21  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?

Сообщение от kison Посмотреть сообщение
А в CV оптимизатора вообще нет, одно название. Я угадал с компилятором? Так что там работать будет что угодно, но медленно и печально
Ну давайте проверим тогда. Предлагаю простую задачу. Подсчёт импульсов двухфазного энкодера (по сути - аналогично оптодатчикам в колёсике мышки, то есть два импульса, сдвинутые по фазе друг относительно друга на 90 градусов в зависимости от угла вращения).
Первая фаза подключена к PB4, вторая - к PB5.
Никуда фактически не будем выводить данные. Просто в начале и в конце цикла подсчёта будем дёргать ногу PD0. Ну и смотреть время выполнения цикла. Ну и не будем использовать ассемблерные вставки, всё-таки компилятор проверяем.

Я предлагаю вот такой код, работающий в CodeVision:
В опциях компилятора поставлена оптимизация Speed Maximum. Но можно её почти отключить, то есть выставить в Low. Это увеличивает цикл измерения на 2 такта (200 нс).
Volatile, поставленный перед переменной count не влияет на время выполнения. Видимо, разработчики CodeVision ещё не доросли до такого уровня оптимизации.

Код:
/**************************************************  ***
Chip type           : ATtiny2313
Clock frequency     : 10,000000 MHz
Memory model        : Tiny
External SRAM size  : 0
Data Stack size     : 32
**************************************************  ***/

#include ‹tiny2313.h›

char P4;
char P5;
char a=1;
char b=0;

unsigned int count=0;

void main(void)
{
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTD=0x00;
DDRD=0x01;
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
GIMSK=0x00;
MCUCR=0x00;
TIMSK=0x00;
USICR=0x00;
ACSR=0x80;

begin:
PORTD=a;
if (PINB.4!=P4) {
                P4=PINB.4;
                if (P4!=PINB.5) count++;
                else            count--;
                }
if (PINB.5!=P5) {
                P5=PINB.5;
                if (PINB.4!=P5) count--;
                else            count++;
                }
PORTD=b;
goto begin;
}
Выкладывайте свои проекты и прошивки для WinAVR. С удовольствием протестирую их в симуляторе. Лучше всего исходник на Си.
Вложения:
Тип файла: zip main.zip (495 байт, 43 просмотров)
Godzilla82 вне форума  
Непрочитано 08.07.2010, 13:35  
SasaVitebsk
Гражданин KAZUS.RUN
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?

1) Вы с бэйсика начинали? Просто конструкцию begin-goto вижу впервые.
На си обычно выглядит так
for( ; ; )
{
}

2) Здесь volatile не нужна. Это не имеет ни малейшего смысла. Судя по всему вы либо ничего не читали, либо не поняли. У вас даже прерывания нет.

3) Качество работы оптимизатора на 3 строчках - определить сложно.

4) Программа написана чрезвычайно примитивно, что вызывает очень большие нарекания.
Например. Рассмотрим

Код:
if (PINB.4!=P4) {
                P4=PINB.4;
Посмотрите как это выглядит на ассемблере и задумайтесь, как это будет работать, если условие PINB.4!=P4 выполнится, а перед оператором P4=PINB.4; будет изменён уровень сигнала? Ну и дребезг тоже.
Чтобы такого не происходило осуществляется сэмплирование, а анализ производится с образом порта.

============================
Тем не менее я готов откомпилировать, только вы сначала выложите результаты своей компиляции, чтобы наглядный результат был.

Последний раз редактировалось SasaVitebsk; 08.07.2010 в 13:38.
SasaVitebsk вне форума  
Непрочитано 08.07.2010, 14:25  
testerplus
Прописка
 
Регистрация: 26.01.2009
Сообщений: 249
Сказал спасибо: 23
Сказали Спасибо 102 раз(а) в 61 сообщении(ях)
testerplus на пути к лучшему
По умолчанию Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?

Согласен с SasaVitebsk.
Сообщение от SasaVitebsk Посмотреть сообщение
2) Здесь volatile не нужна. Это не имеет ни малейшего смысла. Судя по всему вы либо ничего не читали, либо не поняли. У вас даже прерывания нет.
Хе-хе Штука такая, что WinAVR без volatile переменную вообще выкинет, причем именно из-за постановки задачи: "Никуда фактически не будем выводить данные." (Godzilla82)

Цитата:
Тем не менее я готов откомпилировать, только вы сначала выложите результаты своей компиляции, чтобы наглядный результат был.
Под WinAVR по-простому это не пересобрать, т.к. он не может рассматривать порт как битовую переменную (по-тупому заменить PINB.4 на (PINB & (1‹‹PB4)) не прокатит из-за операций сравнения).

Другое дело, не понятно, зачем вообще поднялась тема сравнения компиляторов? Особенно учитывая то, что, во-первых, пример крайне неудачный (очень маленький и очень простой; что там оптимизировать-то?); во-вторых, проф. уровень автора кода (не обижайтесь) не очень высок, и исходный код выглядит как-то по-студенчески. Понятно было бы, если бы производители CV и WinAVR спорили (ну, или дилеры; хотя WA - бесплатный), но с яростью отстаивать свои предпочтения - это уже ближе к холиварам.
testerplus вне форума  
Непрочитано 08.07.2010, 21:46  
SasaVitebsk
Гражданин KAZUS.RUN
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?

Сообщение от testerplus Посмотреть сообщение
Хе-хе Штука такая, что WinAVR без volatile переменную вообще выкинет, причем именно из-за постановки задачи: "Никуда фактически не будем выводить данные." (Godzilla82)
Простите - просмотрел. Так компилятор будет чертовски прав. Эта переменная действительно ненужна. Если для отладки, то тогда можно поставить volatile.

Насчёт уровня автора - это понятно. В голове - опросом смотреть энкодер, а потом что-то добавим, и цикл опроса изменится, плюс будет нерегулярным, что приведёт к полному переписыванию. Я же пишу - семплирование по таймеру, причём обслуживается сразу всё нужное количество энкодеров одновременно. При таком подходе, не имеет значения их количество и диаграмма работы не меняется при внесении изменений в голову. Максимальная частота обработки будет определяться частотой выборки.
SasaVitebsk вне форума  
Непрочитано 08.07.2010, 22:11  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?

Сообщение от SasaVitebsk Посмотреть сообщение
1) Вы с бэйсика начинали? Просто конструкцию begin-goto вижу впервые.
На си обычно выглядит так
for( ; ; )
{
}
Ну на Си проще while(1) {...}. Я поставил goto просто так, так как это абсолютно не важно, а мне не хотелось загромождать код лишними скобками

Сообщение от SasaVitebsk Посмотреть сообщение
2) Здесь volatile не нужна. Это не имеет ни малейшего смысла. Судя по всему вы либо ничего не читали, либо не поняли. У вас даже прерывания нет.
Ну здрасьте. Может вы сами не понимаете, что пишите?

Сообщение от SasaVitebsk Посмотреть сообщение
3) Качество работы оптимизатора на 3 строчках - определить сложно.
И тем не менее...

Сообщение от SasaVitebsk Посмотреть сообщение
4) Программа написана чрезвычайно примитивно, что вызывает очень большие нарекания.
Например. Рассмотрим
Код:
if (PINB.4!=P4) {
                P4=PINB.4;
Посмотрите как это выглядит на ассемблере и задумайтесь, как это будет работать, если условие PINB.4!=P4 выполнится, а перед оператором P4=PINB.4; будет изменён уровень сигнала? Ну и дребезг тоже.
Чтобы такого не происходило осуществляется сэмплирование, а анализ производится с образом порта.
Дребезг отсутствует. Сигнал снимается с датчика, на выходе которого триггер Шмидта. Смены сигнала между PINB.4!=P4 и P4=PINB.4 не должно быть, так как время цикла заведомо в несколько раз меньше периода повторения сигнала.

Сообщение от SasaVitebsk Посмотреть сообщение
только вы сначала выложите результаты своей компиляции, чтобы наглядный результат был.
Обращайте внимание на вложения

Сообщение от testerplus Посмотреть сообщение
Под WinAVR по-простому это не пересобрать, т.к. он не может рассматривать порт как битовую переменную (по-тупому заменить PINB.4 на (PINB & (1‹‹PB4)) не прокатит из-за операций сравнения).

Другое дело, не понятно, зачем вообще поднялась тема сравнения компиляторов? Особенно учитывая то, что, во-первых, пример крайне неудачный (очень маленький и очень простой; что там оптимизировать-то?); во-вторых, проф. уровень автора кода (не обижайтесь) не очень высок, и исходный код выглядит как-то по-студенчески.
Ну вот и хочется посмотреть на код профессионалов при непростой пересборке этого неудачного примера под WinAVR. А также посмотреть на время выполнения "профессионального" кода

А вот оптимизировать-то там есть чего. При различных опциях компилятора WinAVR давал период выполения цикла от 8,6 мкс (я в шоке), до 1,5 мкс.
Godzilla82 вне форума  
Непрочитано 08.07.2010, 22:19  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?

Сообщение от SasaVitebsk Посмотреть сообщение
Насчёт уровня автора - это понятно. В голове - опросом смотреть энкодер, а потом что-то добавим, и цикл опроса изменится, плюс будет нерегулярным, что приведёт к полному переписыванию. Я же пишу - семплирование по таймеру, причём обслуживается сразу всё нужное количество энкодеров одновременно. При таком подходе, не имеет значения их количество и диаграмма работы не меняется при внесении изменений в голову. Максимальная частота обработки будет определяться частотой выборки.
Это всего лишь пример Не хотелось его загромождать прерываниями. Но тем не менее, иногда бывает полезным считать в главной программе. А по прерыванию выдавать результат, например, по SPI. Не забывайте, слишком часто вызывать прерывания не получится, будете терять такты. А слишком медленно - нельзя. Например, сигнал с этого датчика может быть до 150 кГц.

P.S. Жду тайминги, тексты программ и прошивки

Последний раз редактировалось Godzilla82; 09.07.2010 в 00:06.
Godzilla82 вне форума  
 
Опции темы

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

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

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


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.