| Микроконтролери и електроника 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 ] | |||||||||||
| Заглавие: | ||||||||||||
|
||||||||||||
| Автор: | 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/ |
|