реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Keil 3.8, LPC2368, Чудеса оптимизации, помогите понять результат
andrvisht
сообщение Sep 14 2018, 07:58
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Один и тот же код выполняется с разной скоростью на 2-х разных процессорах.
И даже на одном и том же процессоре при выборе разных условий оптимизации.
может есть этому научное объяснение, хотелось бы его выслушать.

А пока факты:
программа выполняет действия:
дергает ногой
делает задержку (циклом с volatile),
дергает ногой
выполняет функцию
дергает ногой
снова задержка
дергает ногой
выполняет функцию
дергает ногой
снова задержка
дергает ногой

измеряются промежутки времени потраченные на задержку между дерганиями
для дергания ногой используется Fast метод, соотв бит установлен.

вариант 1: уровень оптимизации Level 2, time optimization - off

имеем задержки снятые ЛА 70us 195us 250us

Код
    96: ESYNC_X;
0x0000B0B4  E1D403B6  LDRH      R0,[R4,#0x36]
0x0000B0B8  E2200001  EOR       R0,R0,#0x00000001
0x0000B0BC  E1C403B6  STRH      R0,[R4,#0x36]
    97:         for (i = 0; i < 800; i++);                        // wait 70 µs
0x0000B0C0  E3A00000  MOV       R0,#task_io(0x00000000)
0x0000B0C4  E2800001  ADD       R0,R0,#0x00000001
0x0000B0C8  E3500E32  CMP       R0,#0x00000320
0x0000B0CC  3AFFFFFC  BCC       0x0000B0C4
    98: ESYNC_X;
0x0000B0D0  E1D403B6  LDRH      R0,[R4,#0x36]
0x0000B0D4  E2200001  EOR       R0,R0,#0x00000001
0x0000B0D8  E1C403B6  STRH      R0,[R4,#0x36]
    99:         write(0x6a);
0x0000B0DC  E3A0006A  MOV       R0,#0x0000006A
0x0000B0E0  EBFFFF91  BL        write(0x0000AF2C)
   100: ESYNC_X;
0x0000B0E4  E1D403B6  LDRH      R0,[R4,#0x36]
0x0000B0E8  E2200001  EOR       R0,R0,#0x00000001
0x0000B0EC  E1C403B6  STRH      R0,[R4,#0x36]
   101:         for (i = 0; i < 1600; i++);                    // wait 140 µs
0x0000B0F0  E3A00000  MOV       R0,#task_io(0x00000000)
0x0000B0F4  E2800001  ADD       R0,R0,#0x00000001
0x0000B0F8  E3500D19  CMP       R0,#0x00000640
0x0000B0FC  3AFFFFFC  BCC       0x0000B0F4
   102: ESYNC_X;
0x0000B100  E1D403B6  LDRH      R0,[R4,#0x36]
0x0000B104  E2200001  EOR       R0,R0,#0x00000001
0x0000B108  E1C403B6  STRH      R0,[R4,#0x36]
   103:         write(0x6b);
0x0000B10C  E3A0006B  MOV       R0,#0x0000006B
0x0000B110  EBFFFF85  BL        write(0x0000AF2C)
   104: ESYNC_X;
0x0000B114  E1D403B6  LDRH      R0,[R4,#0x36]
0x0000B118  E2200001  EOR       R0,R0,#0x00000001
0x0000B11C  E1C403B6  STRH      R0,[R4,#0x36]
   105:         for (i = 0; i < 1800; i++);                    // wait 250 us
0x0000B120  E59F1094  LDR       R1,[PC,#0x0094] // тут 0x708, зуб на холодец
0x0000B124  E3A00000  MOV       R0,#task_io(0x00000000)
0x0000B128  E2800001  ADD       R0,R0,#0x00000001
0x0000B12C  E1500001  CMP       R0,R1
0x0000B130  3AFFFFFC  BCC       0x0000B128
   106: ESYNC_X;
0x0000B134  E1D403B6  LDRH      R0,[R4,#0x36]
0x0000B138  E2200001  EOR       R0,R0,#0x00000001
0x0000B13C  E1C403B6  STRH      R0,[R4,#0x36]


вариант 2: уровень оптимизации Level 2, time optimization - on

имеем задержки снятые ЛА 70us 250us 157us

Код
    96: ESYNC_X;
0x0000B0DC  E1D403B6  LDRH      R0,[R4,#0x36]
0x0000B0E0  E2200001  EOR       R0,R0,#0x00000001
0x0000B0E4  E1C403B6  STRH      R0,[R4,#0x36]
    97:         for (i = 0; i < 800; i++);                        // wait 70 µs
0x0000B0E8  E3A00000  MOV       R0,#task_io(0x00000000)
0x0000B0EC  E2800001  ADD       R0,R0,#0x00000001
0x0000B0F0  E3500E32  CMP       R0,#0x00000320
0x0000B0F4  3AFFFFFC  BCC       0x0000B0EC
    98: ESYNC_X;
0x0000B0F8  E1D403B6  LDRH      R0,[R4,#0x36]
0x0000B0FC  E2200001  EOR       R0,R0,#0x00000001
0x0000B100  E1C403B6  STRH      R0,[R4,#0x36]
    99:         write(0x6a);
0x0000B104  E3A0006A  MOV       R0,#0x0000006A
0x0000B108  EBFFFF89  BL        write(0x0000AF34)
   100: ESYNC_X;
0x0000B10C  E1D403B6  LDRH      R0,[R4,#0x36]
0x0000B110  E2200001  EOR       R0,R0,#0x00000001
0x0000B114  E1C403B6  STRH      R0,[R4,#0x36]
   101:         for (i = 0; i < 1600; i++);                    // wait 140 µs
0x0000B118  E3A00000  MOV       R0,#task_io(0x00000000)
0x0000B11C  E2800001  ADD       R0,R0,#0x00000001
0x0000B120  E3500D19  CMP       R0,#0x00000640
0x0000B124  3AFFFFFC  BCC       0x0000B11C
   102: ESYNC_X;
0x0000B128  E1D403B6  LDRH      R0,[R4,#0x36]
0x0000B12C  E2200001  EOR       R0,R0,#0x00000001
0x0000B130  E1C403B6  STRH      R0,[R4,#0x36]
   103:         write(0x6b);
0x0000B134  E3A0006B  MOV       R0,#0x0000006B
0x0000B138  EBFFFF7D  BL        write(0x0000AF34)
   104: ESYNC_X;
0x0000B13C  E1D403B6  LDRH      R0,[R4,#0x36]
0x0000B140  E2200001  EOR       R0,R0,#0x00000001
0x0000B144  E1C403B6  STRH      R0,[R4,#0x36]
   105:         for (i = 0; i < 1800; i++);                    // wait 250 us
0x0000B148  E3A01FC2  MOV       R1,#0x00000308
0x0000B14C  E3A00000  MOV       R0,#task_io(0x00000000)
0x0000B150  E2811B01  ADD       R1,R1,#0x00000400
0x0000B154  E2800001  ADD       R0,R0,#0x00000001
0x0000B158  E1500001  CMP       R0,R1
0x0000B15C  3AFFFFFC  BCC       0x0000B154
   106: ESYNC_X;
0x0000B160  E1D403B6  LDRH      R0,[R4,#0x36]
0x0000B164  E2200001  EOR       R0,R0,#0x00000001
0x0000B168  E1C403B6  STRH      R0,[R4,#0x36]

и вот смотрю я на листинг, и он одинаковый, и команду те же, а задержка разная, причем первая одинаковая, а вторая увеличивается ...
и если сосредоточить внимание только на второй то имеем
Код
195us
0x0000B0F0  E3A00000  MOV       R0,#task_io(0x00000000)
0x0000B0F4  E2800001  ADD       R0,R0,#0x00000001
0x0000B0F8  E3500D19  CMP       R0,#0x00000640
0x0000B0FC  3AFFFFFC  BCC       0x0000B0F4
250us
0x0000B118  E3A00000  MOV       R0,#task_io(0x00000000)
0x0000B11C  E2800001  ADD       R0,R0,#0x00000001
0x0000B120  E3500D19  CMP       R0,#0x00000640
0x0000B124  3AFFFFFC  BCC       0x0000B11C

как так то ?
чем дальше адресация флешь, тем дольще выполнение команды ?
Жду ваших мнений.
Спасибо.
Go to the top of the page
 
+Quote Post
Forger
сообщение Sep 14 2018, 08:23
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(andrvisht @ Sep 14 2018, 10:58) *
Один и тот же код выполняется с разной скоростью на 2-х разных процессорах.
И даже на одном и том же процессоре при выборе разных условий оптимизации.
может есть этому научное объяснение,

Объяснение этому есть и очень простое: так было задумано.
"Исправить" это невозможно, а вот исправить код так, чтобы это не имело значения - это вполне возможно sm.gif
Используйте аппаратные таймеры вместо самоделок на базе пустых циклов "for".
Кстати, как объявлена переменная "i"? Про volatile не забыли?


Цитата
Keil 3.8
Не пора ли обновить этот "антиквариат" на что-нить по-свежее? https://www.keil.com/download/product/ wink.gif


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Sep 14 2018, 08:46
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(Forger @ Sep 14 2018, 11:23) *
Объяснение этому есть и очень простое: так было задумано.
"Исправить" это невозможно, а вот исправить код так, чтобы это не имело значения - это вполне возможно sm.gif
Кстати, как объявлена переменная "i"? Про volatile не забыли?

не забыл, и написал об этом...
Цитата
делает задержку (циклом с volatile),
, и потом привел листинг ...
Вопрос был не в том как сделать , а в том почему так,
И вот на этот вопрос можно ли поподробнее, что же все таки было задумано ... ?



Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 14 2018, 08:53
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(andrvisht @ Sep 14 2018, 11:46) *
И вот на этот вопрос можно ли поподробнее, что же все таки было задумано ... ?

Это последствия работы Memory Accelerator Module (MAM). Скорость выполнения зависит от положения кода в памяти.
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Sep 14 2018, 09:05
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(aaarrr @ Sep 14 2018, 11:53) *
Это последствия работы Memory Accelerator Module (MAM). Скорость выполнения зависит от положения кода в памяти.

мдя, отключил и все стало вменяемо, была мысль ... но как то вроде условие, должен из очереди все команды убирать в любом случае.
Спасибо.
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Sep 14 2018, 09:53
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



del.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th April 2024 - 21:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01433 секунд с 7
ELECTRONIX ©2004-2016