visht 0 14 сентября, 2018 Опубликовано 14 сентября, 2018 · Жалоба Один и тот же код выполняется с разной скоростью на 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 как так то ? чем дальше адресация флешь, тем дольще выполнение команды ? Жду ваших мнений. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 14 сентября, 2018 Опубликовано 14 сентября, 2018 · Жалоба Один и тот же код выполняется с разной скоростью на 2-х разных процессорах. И даже на одном и том же процессоре при выборе разных условий оптимизации. может есть этому научное объяснение, Объяснение этому есть и очень простое: так было задумано. "Исправить" это невозможно, а вот исправить код так, чтобы это не имело значения - это вполне возможно :) Используйте аппаратные таймеры вместо самоделок на базе пустых циклов "for". Кстати, как объявлена переменная "i"? Про volatile не забыли? Keil 3.8 Не пора ли обновить этот "антиквариат" на что-нить по-свежее? https://www.keil.com/download/product/ ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
visht 0 14 сентября, 2018 Опубликовано 14 сентября, 2018 · Жалоба Объяснение этому есть и очень простое: так было задумано. "Исправить" это невозможно, а вот исправить код так, чтобы это не имело значения - это вполне возможно :) Кстати, как объявлена переменная "i"? Про volatile не забыли? не забыл, и написал об этом... делает задержку (циклом с volatile), , и потом привел листинг ... Вопрос был не в том как сделать , а в том почему так, И вот на этот вопрос можно ли поподробнее, что же все таки было задумано ... ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 64 14 сентября, 2018 Опубликовано 14 сентября, 2018 · Жалоба И вот на этот вопрос можно ли поподробнее, что же все таки было задумано ... ? Это последствия работы Memory Accelerator Module (MAM). Скорость выполнения зависит от положения кода в памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
visht 0 14 сентября, 2018 Опубликовано 14 сентября, 2018 · Жалоба Это последствия работы Memory Accelerator Module (MAM). Скорость выполнения зависит от положения кода в памяти. мдя, отключил и все стало вменяемо, была мысль ... но как то вроде условие, должен из очереди все команды убирать в любом случае. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 14 сентября, 2018 Опубликовано 14 сентября, 2018 · Жалоба del. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться