Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Оптимизация при C компилаторите
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=4003
Страница 1 от 1

Автор:  HCL [ Чет Апр 05, 2007 5:35 pm ]
Заглавие:  Оптимизация при C компилаторите

C166 на КЕИЛ разполага с 7 нива на оптимиране в µVision2 и 8 в µVision3. Изчетох документацията, това което ме смущава е че пише само хубави неща. Bсяко ниво на оптимизация добьлва предходното с някой друг метод. Направих няколко теста, кода намаля с около 20 - 30%, явно ефект има, особено при начинаещи драскачи на код. Кьде е уловката? Случва ли се оптимизацията да огелпи кода и ако не защо са тогава всички тези различни нива. Ползвате ли оптимизация, какво трябва да се сьобразява?

Автор:  Nikola Kirov [ Чет Апр 05, 2007 5:58 pm ]
Заглавие: 

ами като цяло не би трябвало да има проблеми с оптимизацията. Но на практика се случва нещо да се сбъгяса при по голяма оптимизация. При IAR е рядкост да се случи но се случва все пак. При IAR за АРМ не ми се е случвало досега а специално си играх доста да го шашна :).
Ползвай си volatile за за променливите които трябва и обикновно ти е мирна главата.

Автор:  HCL [ Чет Апр 05, 2007 6:20 pm ]
Заглавие: 

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

Автор:  miro_atc [ Чет Апр 05, 2007 6:41 pm ]
Заглавие: 

volatile е атрибут който указва, че обектът може да се променя извън скоп-а в който се ползва. Обикновено това са хардуерни регистри или променливи ползвани от няколко нишки. Ефектът, е че преди *всяко* ползване се изчита и всяка промяна се записва. Без тоя атрибут, компилаторът може, ако вече е ползвал дадата променлива и стойността й е останала в някой регистър, да ползва регистъра вместо да си изчетене наново променливата от паметта...

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

Автор:  Cvetanov [ Чет Апр 05, 2007 7:08 pm ]
Заглавие: 

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 пъти

Автор:  Nikola Kirov [ Чет Апр 05, 2007 9:07 pm ]
Заглавие: 

volatile го ползвам от времето когато ползвах PIC и HiTech за тази работа. Не бях обръщал внимание че IAR има и _root специално за това. Интересно че не съм виждал това да се ползва в някой от готовите кодове които съм ползвал. Иначе щеше да ми стане интересно какво прави и щях да разбера за него :)
Мерси за съвета :)
Но на много места съм срещал точно подхода с vilatile за подобни кричтични към оптимизацията места.

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

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

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/