Отговори на тема  [ 6 мнения ] 
Оптимизация при C компилаторите 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Дек 14, 2004 1:31 pm
Мнения: 3849
Мнение Оптимизация при C компилаторите
C166 на КЕИЛ разполага с 7 нива на оптимиране в µVision2 и 8 в µVision3. Изчетох документацията, това което ме смущава е че пише само хубави неща. Bсяко ниво на оптимизация добьлва предходното с някой друг метод. Направих няколко теста, кода намаля с около 20 - 30%, явно ефект има, особено при начинаещи драскачи на код. Кьде е уловката? Случва ли се оптимизацията да огелпи кода и ако не защо са тогава всички тези различни нива. Ползвате ли оптимизация, какво трябва да се сьобразява?


Чет Апр 05, 2007 5:35 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
ами като цяло не би трябвало да има проблеми с оптимизацията. Но на практика се случва нещо да се сбъгяса при по голяма оптимизация. При IAR е рядкост да се случи но се случва все пак. При IAR за АРМ не ми се е случвало досега а специално си играх доста да го шашна :).
Ползвай си volatile за за променливите които трябва и обикновно ти е мирна главата.


Чет Апр 05, 2007 5:58 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Дек 14, 2004 1:31 pm
Мнения: 3849
Мнение 
Засега карам на следния принцип. Масивите с константни стойности ги декларирам като const, констатните фактори чрез #define и така всичко си отива в Flash-а. А static променливите и глобалните, които се ползват често ги пращам в RAM-а чрез idata, за по-бьрзо.
Този определител volatile не ми стана много ясен. В индекса на документацията на компилатора не намирам нищо, а в ANSI C пише, че един вид се използва от компилатора за оптимизация. Това означава ли, че всички променливи могат да се декларират като volatile и компилаторьт сам си решава кое кьде да прати?


Чет Апр 05, 2007 6:20 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение 
volatile е атрибут който указва, че обектът може да се променя извън скоп-а в който се ползва. Обикновено това са хардуерни регистри или променливи ползвани от няколко нишки. Ефектът, е че преди *всяко* ползване се изчита и всяка промяна се записва. Без тоя атрибут, компилаторът може, ако вече е ползвал дадата променлива и стойността й е останала в някой регистър, да ползва регистъра вместо да си изчетене наново променливата от паметта...

Никола, а това за което ти го ползваш тоя атрибут ИАР има по-добър атрибут - "__root". Тоя атрибут, указва на ИАР че ти "държиш" на тая променлива/функция и не бива да я "оптимизира", т.е. да я премахва.
Иначе с volatile го принуждаваш да прави по-неефективен код...


Чет Апр 05, 2007 6:41 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Пон Фев 21, 2005 2:14 pm
Мнения: 191
Местоположение: Varna
Мнение 
HCL написа:
Засега карам на следния принцип. Масивите с константни стойности ги декларирам като const, констатните фактори чрез #define и така всичко си отива в Flash-а. А static променливите и глобалните, които се ползват често ги пращам в RAM-а чрез idata, за по-бьрзо.
Този определител volatile не ми стана много ясен. В индекса на документацията на компилатора не намирам нищо, а в ANSI C пише, че един вид се използва от компилатора за оптимизация. Това означава ли, че всички променливи могат да се декларират като volatile и компилаторьт сам си решава кое кьде да прати?


Прикачени файлове:
Коментар на файл: Introduction to the Volatile Keyword
Introduction to the Volatile Keyword.txt [7.31 KiB]
197 пъти

_________________
Шанс едно на милион, обикновено се случва девет от десет пъти.
Чет Апр 05, 2007 7:08 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
volatile го ползвам от времето когато ползвах PIC и HiTech за тази работа. Не бях обръщал внимание че IAR има и _root специално за това. Интересно че не съм виждал това да се ползва в някой от готовите кодове които съм ползвал. Иначе щеше да ми стане интересно какво прави и щях да разбера за него :)
Мерси за съвета :)
Но на много места съм срещал точно подхода с vilatile за подобни кричтични към оптимизацията места.

например
for (int i=0; i<1000; i++);
при високите нива на оптимизация се игнорира от повечето компилатори. Просто не се генерира код за това.

подхода които работи май при всички компилатори е
for (volatile int i=0; i<1000; i++);
volatile задължава компилатора при всяко обръщение към i да я чете/пише наистина.


Чет Апр 05, 2007 9:07 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 6 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 20 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни