|
Про IAR компилятор С |
|
|
|
Feb 9 2007, 15:09
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Dopler @ Feb 9 2007, 13:40)  Я имел в виду, что любимой избранной функции нельзя задать жестко уровень оптимизации. Т.е. нельзя написать какую-нибудь простенькую функцию, определить для нее максимальную оптимизацию и наслаждаться, при условии, что остальной проект выполнен без оптимизации. 1. Никто не мешает для этого конкретного файла задавать собственные критерии оптимизации ( или вообще не задавать) и все разруливать прагмами. 2. А вообще все "простенькие" функции в отдельный файл и тогда как угодно и как нужно и без прагм. 3. А какого черта проекты вообще без оптимизации собирать - для того что-бы написанный левой ногой код как-то работал? За десятки лет на добром десятке компиляторов никогда не делал ничего без оптимизации. Обычно отдельные куски тупо зажимаются по размеру. Большая часть тупо по максимальной скорости и некоторые критические функции - тонкой индивидуальной подстройкой по скорости. Куски кода с разными требованиями к оптимизации в один файл не сваливаются.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Feb 9 2007, 23:21
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425

|
Вернемся к поиску оптимального кода. Приведенный выше цикл с различными уровнями оптимизации: Код // Исходный цикл for(d = 2000; d !=0; d--) __no_operation(); Код Оптимизации нет 22 for(d = 2000; d !=0; d--) \ 0000000A FA21 MOVS R1,#+250 \ 0000000C C900 LSLS R1,R1,#+3 ;; #+2000 \ 0000000E 0800 MOVS R0,R1 \ ??main_2: \ 00000010 0028 CMP R0,#+0 \ 00000012 02D0 BEQ ??main_3 23 __no_operation(); \ 00000014 C046 Nop \ 00000016 401E SUBS R0,R0,#+1 \ 00000018 FAE7 B ??main_2 Код С оптимизацией 22 for(d = 2000; d !=0; d--) \ 00000010 0C00 MOVS R4,R1 23 __no_operation(); \ ??main_2: \ 00000012 C046 Nop \ 00000014 641E SUBS R4,R4,#+1 \ 00000016 FCD1 BNE ??main_2 Очевидно, что второй код предпочтительнее, причем я на asm написал бы именно так. Единственное, что напрягает - это явно лишний Nop, попробуем от него избавится, сохраняя уровень оптимизации. Код Посто закоментировал Nop, и весь цикл улетел, попав под нож оптимизатора. for(d = 2000; d !=0; d--); // __no_operation(); Пользуемся советом Сергея, делаем d volatile Код 17 int volatile d; 20 for(d = 2000; d !=0; d--); \ 00000012 0091 STR R1,[SP, #+0] \ 00000014 02E0 B ??main_2 \ ??main_3: \ 00000016 009C LDR R4,[SP, #+0] \ 00000018 641E SUBS R4,R4,#+1 \ 0000001A 0094 STR R4,[SP, #+0] \ ??main_2: \ 0000001C 009C LDR R4,[SP, #+0] \ 0000001E 002C CMP R4,#+0 \ 00000020 F9D1 BNE ??main_3 И видим, что весь цикл, где используется d перестает оптимизироваться, более того, d из регистров попадает прямиком в стек, что еще больше раздувает код, отсюда делаю вывод, что без явных причин использовать volatile не стоит. Поэкспериментировав с различными галочками в оптимизаторе, убедился что без Code Motion цикл не пропадает, но все равно получить код как во втором примере, только без Nop не удалось.
|
|
|
|
|
Feb 20 2007, 00:07
|
Знающий
   
Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317

|
Вот что у меня получилось IAR 4.41 оптимизция полная по скорости Код void delay(long tmp) { while(--tmp); } результат Код In segment CODE, align 4, keep-with-next void delay(long tmp) { while(--tmp); delay: ??delay_0: 00000000 010050E2 SUBS R0,R0,#+1 00000004 FDFFFF1A BNE ??delay_0 } 00000008 1EFF2FE1 BX LR ;; return при этом он пытается ее инлайнить всегда, но от этого можно легко избавится при желании
|
|
|
|
|
Mar 19 2008, 07:03
|

Местный
  
Группа: Свой
Сообщений: 343
Регистрация: 24-01-07
Из: Новосибирск
Пользователь №: 24 714

|
дабы не открывать новую ветку... Помогите понять, зачем так сложно: (time описана как unsigned long) Код // 80 time++; LDI R30, time LDI R31, 0 LD R16, Z LDD R17, Z+1 LDD R18, Z+2 LDD R19, Z+3 SUBI R16, 255 SBCI R17, 255 SBCI R18, 255 SBCI R19, 255 ST Z, R16 STD Z+1, R17 STD Z+2, R18 STD Z+3, R19
|
|
|
|
|
Mar 19 2008, 08:37
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(Dopler @ Feb 9 2007, 15:36)  Просто для совсем маленьких функций накладные расходы по вызову и передаче параметров неприятны. Если бы можно было бы функцию на asm сделать inline, было бы здорово. А функцию на си можно инлайн объявить? Если да, то что мешает внутри написать asm("something asm text"); Я вот чё-то только __no_inline нашёл, то есть наоборот, запрет инлайна
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|