01.02.2013, 16:21
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от TAutomatic
|
Все эти Ваши выкладки ничего не стоят, если Вы не понимаете, как выполняется и чем заканчивается статическая оптимизация.
И я ничего по этому вопросу не путаю, как бы Вам хотелось.
Самый простой пример статической оптимизации, самый первый и самый простой:
А = 0;
В = 0;
или
А = В = 0;
Проверте, как это работает, если еще не знаете.
|
А вы полагаете, что вы знаете как ЭТО работает? А заодно и как работает компилятор. Современный компилятор.
Так вот оказывается что вы в очередной раз ошиблись. Я сейчас вам приведу 3 листинга, чтобы это доказать. А потом сядьте и проверьте сами. Итак:
1. IAR 6.40.2 CPU st32f407. Оптимизация NONE. Из реальной проги.
Keil 4.13a. CPU LPC1765. Оптимизация -O0
Ваш вариант присваивания (оптимальный в вашем понимании).
Код:
|
435 MChDin-›data = MChDin-›portlink = 0; // Выкл. порт связи
\ ??MenuChanalAdd_14:
\ 0000017C 0x2000 MOVS R0,#+0
\ 0000017E 0x7628 STRB R0,[R5, #+24]
\ 00000180 0xB2C0 UXTB R0,R0 ;; ZeroExt R0,R0,#+24,#+24
\ 00000182 0xEE00 0x0A10 VMOV S0,R0
\ 00000186 0xEEB8 0x0A40 VCVT.F32.U32 S0,S0
\ 0000018A 0xED85 0x0A01 VSTR S0,[R5, #+4]
436 // MChDin-›data = 0; // Обнулить результат
// Keil
;;;188 transmite_buffer[0] = //0;//receive_buffer[0];
00001c 2000 MOVS r0,#0
00001e 1ea1 SUBS r1,r4,#2
000020 7048 STRB r0,[r1,#1]
000022 7008 STRB r0,[r1,#0]
;;;189 transmite_buffer[1] = 0;//receive_buffer[1]; |
2. IAR 6.40.2 CPU st32f407. Оптимизация NONE.
Keil 4.13a. CPU LPC1765. Оптимизация -O0.
Мой безграмотный вариант присваивания.
Код:
|
436 MChDin-›portlink = 0; // Выкл. порт связи
\ ??MenuChanalAdd_14:
\ 0000017C 0x2000 MOVS R0,#+0
\ 0000017E 0x7628 STRB R0,[R5, #+24]
437 MChDin-›data = 0; // Обнулить результат
\ 00000180 0x2000 MOVS R0,#+0
\ 00000182 0x6068 STR R0,[R5, #+4]
// Keil
;;;188 transmite_buffer[0] = 0;//receive_buffer[0];
00001c 2000 MOVS r0,#0
00001e 1ea1 SUBS r1,r4,#2
000020 7008 STRB r0,[r1,#0]
;;;189 transmite_buffer[1] = 0;//receive_buffer[1];
000022 7048 STRB r0,[r1,#1] |
2. IAR 6.40.2 CPU st32f407. Оптимизация High Speed.
Код:
|
436 MChDin-›portlink = 0; // Выкл. порт связи
\ ??MenuChanalAdd_9:
\ 00000124 0x2100 MOVS R1,#+0
\ 00000126 0x7631 STRB R1,[R6, #+24]
437 MChDin-›data = 0; // Обнулить результат
\ 00000128 0x6071 STR R1,[R6, #+4] |
Надеюсь коментарии излишни?
Цитата:
|
Затем идет оптимизация и минимизация логических выражений, выбор между конструкциями if или switch в зависимости от количества уровней выбора, прямая и обратная итерация циклов и т.д и т. п.
И заканчивается это правильной передачей параметров в функции....
|
Вы наверное думаете, что если применили конструкцию if, то компилятор вставит сравнение, а если switch, то таблицу переходов сделает? Про прямую и обратную итерацию циклов я просто молчу...
Так вот. Возьмите себя в руки, отдайте неделю и посмотрите как реально компилятся те или иные конструкции. Тем более если вы руководитель. Вы будете шокированы похоже. Например если вы позволите такую вольность себе как заведёте 4 локальных переменных с разными именами, это не значит что компилятор выделит под это 4 регистра. Он выделит столько, сколько потребуется.
Я недавно был удивлён. Один программист применил конструкцию для определения високосного года типа if(((year/4)*4 != year). Ну я несколько поиздевался и написал if(year&3). Компилятор скомпилил одинаково.
Для завершения скажу что бывают случаи, когда работа с указателями оказывается менее эффективна чем работа с массивом. Давече стлкнулся, при вылизывании фильтра на AVR.
Вы заблуждаетесь по всем пунктам перечисленным. Я больше на эту тему не пишу. А вы спокойно сядьте и разберитесь.
|
|
|
|
01.02.2013, 16:41
|
|
Временная регистрация
Регистрация: 18.07.2012
Сообщений: 73
Сказал спасибо: 4
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
To SasaVitebsk
Замечательно, Вы наконец хоть раз соизволили открыть файл листинга, посмотреть и попытаться понять смысл.
Последний раз редактировалось TAutomatic; 01.02.2013 в 17:14.
|
|
|
|
01.02.2013, 16:59
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от SasaVitebsk
|
Один программист применил конструкцию для определения високосного года типа if(((year/4)*4 != year). Ну я несколько поиздевался и написал if(year&3)
|
Классные "программисты" не знают определения високосного года.
|
|
|
|
01.02.2013, 19:15
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от SasaVitebsk
|
Один программист применил конструкцию для определения високосного года типа if(((year/4)*4 != year). Ну я несколько поиздевался и написал if(year&3). Компилятор скомпилил одинаково.
|
Если не затруднит, глянуть бы как эти варианты в ASM развернул Ваш компилятор. Что то сомнения мучают. Глянул - IAR в разное разворачивает.
|
|
|
|
01.02.2013, 19:59
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 982
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
А ничего, что каждый сотый год не високосный ?
Даже еще веселее:
Цитата:
|
год является високосным в двух случаях: либо он кратен 4, но при этом не кратен 100, либо кратен 400. Год не является високосным, если он не кратен 4, либо он кратен 100, но при этом не кратен 400.
|
Последний раз редактировалось Wiza_; 01.02.2013 в 20:02.
|
|
|
|
01.02.2013, 20:08
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Вот - правильный ответ !!!!
|
|
|
|
01.02.2013, 23:41
|
|
Вид на жительство
Регистрация: 05.09.2007
Адрес: Новороссия ЛНР Рубежное -> РФ Калуга
Сообщений: 360
Сказал спасибо: 10
Сказали Спасибо 73 раз(а) в 58 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от Boba_spb
|
Вот - правильный ответ !!!!
|
Не хватает исключения! 2000 таки високосный!
__________________
Политика России будет выглядеть неоднозначной до тех пор, пока не будет решен исход битвы.
Чем больше слёз тем больше облегчения, в слезах и заключается лечение.
Не зли меня
|
|
|
|
01.02.2013, 23:51
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от Wiza_
|
А ничего, что каждый сотый год не високосный ?
|
Сообщение от Boba_spb
|
Вот - правильный ответ !!!!
|
Не совсем так.
Исходное высказывание:
Сообщение от Wiza_
|
является високосным в двух случаях: либо он кратен 4, но при этом не кратен 100, либо кратен 400.
|
Означает такую запись:
IsLeapYear := ( (Year mod 4 = 0) and (Year mod 100 ‹› 0) ) or ( Year mod 400 = 0);
а на самом деле:
IsLeapYear := ( Year mod 4 = 0) and ( (Year mod 100 ‹› 0) or (Year mod 400 = 0) );
__________________
There's always more than one way to skin a cat.
|
|
|
|
01.02.2013, 23:52
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
2000 - правило, он кратен 400.
|
|
|
|
02.02.2013, 00:07
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от tempora
|
Не совсем так.
Исходное высказывание:
Означает такую запись:
IsLeapYear := ( (Year mod 4 = 0) and (Year mod 100 ‹› 0) ) or (Year mod 400 = 0);
а на самом деле:
IsLeapYear := (Year mod 4 = 0) and ( (Year mod 100 ‹› 0) or (Year mod 400 = 0) );
|
Это одно и то же - если год кратен 400, то он кратен и 4. Так что оба выражения эквивалентны.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:50.
|
|