| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?
29.06.2010, 01:37
|
|
|
Прописка
Регистрация: 26.01.2009
Сообщений: 249
Сказал спасибо: 23
Сказали Спасибо 102 раз(а) в 61 сообщении(ях)
|
Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?
Сообщение от Godzilla82
|
И как ни странно, это всё работало при всех оптимизациях
|
Не странно. Было бы странно, если бы это работало на всех компиляторах. Поставьте перед while строчку "pw = 1;" и соберите программу в WinAVR с оптимизацией -Os. Увидите, что будет. (Какой Вы все-таки упрямый!  )
Последний раз редактировалось testerplus; 29.06.2010 в 01:39.
|
|
|
|
29.06.2010, 03:17
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
|
Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?
Сообщение от Godzilla82
|
|
И как ни странно, это всё работало при всех оптимизациях
|
А в CV оптимизатора вообще нет, одно название. Я угадал с компилятором?  Так что там работать будет что угодно, но медленно и печально
|
|
|
|
29.06.2010, 18:14
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?
Добавлю следующее к последним 2 постам.
Меня не устроит ситуация "может будет работать, а может нет". Я хочу, чтобы гарантировано работало. Для этого надо писать в рамках языка, чётко понимая, что я пишу и зачем. У меня нет ни времени ни желания, с помощью экспериментов и неосмысленных действий добиваться, чтобы компилятор компилировал "правильно". Я сразу исхожу из того, что компилятор всё делает грамотно. И если что-то не работает, то я ищу свой хомут. А не начинаю грешить на компилятор.
|
|
|
|
Сказали "Спасибо" SasaVitebsk
|
|
|
01.07.2010, 11:07
|
|
|
Прописка
Регистрация: 05.03.2010
Сообщений: 144
Сказал спасибо: 47
Сказали Спасибо 195 раз(а) в 19 сообщении(ях)
|
Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?
Всем огромное спасибо!
Прерывания начали прерывать  Ошибкой было отсутствие инициализации PCMSK. Почему то я его воспринял как регистр флагов, а не как регистр маски.
А вот с работоспособностью программы пока плохо  Если раньше я мог откомпилировать без оптимизации и проверить работоспособность, то сейчас уже не помещаюсь без оптимизации в память. Так что буду отлаживаться частями.
Еще раз всем спасибо.
|
|
|
|
07.07.2010, 03:21
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
|
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. С удовольствием протестирую их в симуляторе. Лучше всего исходник на Си.
|
|
|
|
08.07.2010, 13:35
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
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.
|
|
|
|
08.07.2010, 14:25
|
|
|
Прописка
Регистрация: 26.01.2009
Сообщений: 249
Сказал спасибо: 23
Сказали Спасибо 102 раз(а) в 61 сообщении(ях)
|
Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?
Согласен с SasaVitebsk.
Сообщение от SasaVitebsk
|
|
2) Здесь volatile не нужна. Это не имеет ни малейшего смысла. Судя по всему вы либо ничего не читали, либо не поняли. У вас даже прерывания нет.
|
Хе-хе  Штука такая, что WinAVR без volatile переменную вообще выкинет, причем именно из-за постановки задачи: "Никуда фактически не будем выводить данные." (Godzilla82)
|
Цитата:
|
|
Тем не менее я готов откомпилировать, только вы сначала выложите результаты своей компиляции, чтобы наглядный результат был.
|
Под WinAVR по-простому это не пересобрать, т.к. он не может рассматривать порт как битовую переменную (по-тупому заменить PINB.4 на (PINB & (1‹‹PB4)) не прокатит из-за операций сравнения).
Другое дело, не понятно, зачем вообще поднялась тема сравнения компиляторов? Особенно учитывая то, что, во-первых, пример крайне неудачный (очень маленький и очень простой; что там оптимизировать-то?); во-вторых, проф. уровень автора кода (не обижайтесь) не очень высок, и исходный код выглядит как-то по-студенчески. Понятно было бы, если бы производители CV и WinAVR спорили (ну, или дилеры; хотя WA - бесплатный), но с яростью отстаивать свои предпочтения - это уже ближе к холиварам.
|
|
|
|
08.07.2010, 21:46
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?
Сообщение от testerplus
|
Хе-хе Штука такая, что WinAVR без volatile переменную вообще выкинет, причем именно из-за постановки задачи: "Никуда фактически не будем выводить данные." (Godzilla82)
|
Простите - просмотрел. Так компилятор будет чертовски прав. Эта переменная действительно ненужна. Если для отладки, то тогда можно поставить volatile.
Насчёт уровня автора - это понятно. В голове - опросом смотреть энкодер, а потом что-то добавим, и цикл опроса изменится, плюс будет нерегулярным, что приведёт к полному переписыванию. Я же пишу - семплирование по таймеру, причём обслуживается сразу всё нужное количество энкодеров одновременно. При таком подходе, не имеет значения их количество и диаграмма работы не меняется при внесении изменений в голову. Максимальная частота обработки будет определяться частотой выборки.
|
|
|
|
08.07.2010, 22:11
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
|
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 мкс.
|
|
|
|
08.07.2010, 22:19
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
|
Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?
Сообщение от SasaVitebsk
|
|
Насчёт уровня автора - это понятно. В голове - опросом смотреть энкодер, а потом что-то добавим, и цикл опроса изменится, плюс будет нерегулярным, что приведёт к полному переписыванию. Я же пишу - семплирование по таймеру, причём обслуживается сразу всё нужное количество энкодеров одновременно. При таком подходе, не имеет значения их количество и диаграмма работы не меняется при внесении изменений в голову. Максимальная частота обработки будет определяться частотой выборки.
|
Это всего лишь пример  Не хотелось его загромождать прерываниями. Но тем не менее, иногда бывает полезным считать в главной программе. А по прерыванию выдавать результат, например, по SPI. Не забывайте, слишком часто вызывать прерывания не получится, будете терять такты. А слишком медленно - нельзя. Например, сигнал с этого датчика может быть до 150 кГц.
P.S. Жду тайминги, тексты программ и прошивки
Последний раз редактировалось Godzilla82; 09.07.2010 в 00:06.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:56.
|
|