|
Плохой код при обмен данных между двумя структурами |
|
|
|
Aug 12 2009, 12:08
|

Частый гость
 
Группа: Участник
Сообщений: 83
Регистрация: 4-08-09
Из: Болгария / София
Пользователь №: 51 737

|
У меня есть 2 структуры out и pos которые хранят несколько байтов. Где то в коде хочу установить данные в out структуре: CODE out.shadowX1 = pos.X1; /* shadow register X1 */ out.shadowY1 = pos.Y1; /* shadow register Y1 */ out.shadowX2 = pos.X2; /* shadow register X2 */ out.shadowY2 = pos.Y2; /* shadow register Y2 */ out.shadowX1 = pos.X1; /* shadow register X1 */ Адреса всех элементов известны в момент компиляции так что я ожидал каждое присвоение потребляет 2 команды. С удивлением нашел такой код: CODE 0000B8 8160 LD R22,Z 0000BA 936C ST X,R22 out.shadowY1 = pos.Y1; /* shadow register Y1 */ 0000BC 8161 LDD R22,Z+1 0000BE EAA1 LDI R26,0xA1 0000C0 E0B1 LDI R27,0x01 0000C2 936C ST X,R22 out.shadowX2 = pos.X2; /* shadow register X2 */ 0000C4 8162 LDD R22,Z+2 0000C6 EAA2 LDI R26,0xA2 0000C8 E0B1 LDI R27,0x01 0000CA 936C ST X,R22 out.shadowY2 = pos.Y2; /* shadow register Y2 */ 0000CC 8163 LDD R22,Z+3 0000CE EAA3 LDI R26,0xA3 0000D0 E0B1 LDI R27,0x01 0000D2 936C ST X,R22 Я знаю что структуры "любят" работать с индекс регистры, но здесь нет никакой логики (оптимизация кода на макс по скорости). Попробовал поставить: CODE *(uint8_t *)(&out.shadowX1) = *(uint8_t *)(&pos.X1); но результат тот же. Как можно вразумить компилера не делать такие дурные вещи?
Сообщение отредактировал Student2 - Aug 12 2009, 12:09
|
|
|
|
|
 |
Ответов
|
Aug 12 2009, 13:00
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Что-то Вы не то делаете. Расчехлил вообще старый, 5.02. CODE ############################################################################### # # # IAR Atmel AVR C/C++ Compiler V5.02A/W32 12/Aug/2009 15:58:47 # # Copyright 1996-2007 IAR Systems. All rights reserved. # # # # Source file = E:\AVR\T22\main.c # # Command line = E:\AVR\T22\main.c --cpu=m128 -ms -o # # E:\AVR\T22\Debug\Obj\ -lCN E:\AVR\T22\Debug\List\ -y # # --initializers_in_flash -s9 --no_cross_call --debug -e # # -I D:\IAR_AVR502\avr\INC\ -I # # D:\IAR_AVR502\avr\INC\DLIB\ --eeprom_size 4096 # # --dlib_config D:\IAR_AVR502\avr\LIB\DLIB\dlAVR-3s-ec_mul # # -n.h # # List file = E:\AVR\T22\Debug\List\main.lst # # Object file = E:\AVR\T22\Debug\Obj\main.r90 # # # # # ###############################################################################
E:\AVR\T22\main.c 1 #include <stdint.h> 2 3 typedef struct 4 { 5 uint8_t status; 6 uint8_t shadowX1; 7 uint8_t shadowY1; 8 uint8_t shadowX2; 9 uint8_t shadowY2; 10 11 uint8_t shadowX1Size; 12 uint8_t shadowY1Area; 13 uint8_t shadowX2Size; 14 uint8_t shadowY2Area; 15 16 uint8_t var1; 17 uint8_t var2; 18 uint16_t var3; 19 20 uint8_t var4; 21 uint8_t var5; 22 23 uint8_t var6; 24 uint8_t var7; 25 uint8_t var8; 26 27 28 uint8_t var9; 29 uint8_t var10; 30 //eepromData_t ee; /* other structure - 56 bytes long */ 31 32 } outputData_t; 33
\ In segment NEAR_Z, align 1, keep-with-next \ 00000000 REQUIRE `?<Segment init: NEAR_Z>` 34 outputData_t out; \ `out`: \ 00000000 DS 20 35 36 typedef struct /* contains the data for reporting to the host */ 37 { 38 uint8_t X1; 39 uint8_t Y1; 40 uint8_t X2; 41 uint8_t Y2; 42 43 uint8_t dw1; 44 uint8_t dw2; 45 uint8_t dw3; 46 uint8_t dw4; 47 48 uint16_t dw5; 49 50 } reportData_t; 51 52 reportData_t pos; \ pos: \ 00000014 DS 10 53
\ In segment CODE, align 2, keep-with-next 54 __interrupt void xcopy(void) \ xcopy: 55 { \ 00000000 93FA ST -Y, R31 \ 00000002 93EA ST -Y, R30 \ 00000004 930A ST -Y, R16 56 out.shadowX1 = pos.X1; /* shadow register X1 */ \ 00000006 .... LDI R30, LOW(`out`) \ 00000008 .... LDI R31, (`out`) >> 8 \ 0000000A 8904 LDD R16, Z+20 \ 0000000C 8301 STD Z+1, R16 57 out.shadowY1 = pos.Y1; /* shadow register Y1 */ \ 0000000E 8905 LDD R16, Z+21 \ 00000010 8302 STD Z+2, R16 58 out.shadowX2 = pos.X2; /* shadow register X2 */ \ 00000012 8906 LDD R16, Z+22 \ 00000014 8303 STD Z+3, R16 59 out.shadowY2 = pos.Y2; /* shadow register Y2 */ \ 00000016 8907 LDD R16, Z+23 \ 00000018 8304 STD Z+4, R16 60 out.shadowX1 = pos.X1; /* shadow register X1 */ \ 0000001A 8904 LDD R16, Z+20 \ 0000001C 8301 STD Z+1, R16 61 } \ 0000001E 9109 LD R16, Y+ \ 00000020 91E9 LD R30, Y+ \ 00000022 91F9 LD R31, Y+ \ 00000024 9518 RETI 62
\ In segment CODE, align 2, keep-with-next 63 int main( void ) \ main: 64 { 65 return 0; \ 00000000 E000 LDI R16, 0 \ 00000002 E010 LDI R17, 0 \ 00000004 9508 RET 66 }
Точно уверены про оптимизацию? Покажите шапку листинга, там где командная строка компилятора.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
Сообщений в этой теме
Student2 Плохой код при обмен данных между двумя структурами Aug 12 2009, 12:08 Rst7 Цитатаоптимизация кода на макс по скорости
Непохо... Aug 12 2009, 12:15 Student2 Цитата(Rst7 @ Aug 12 2009, 15:11) Непохож... Aug 12 2009, 12:22 Rst7 ЦитатаОписание структуры pos:
Это описание типа. ... Aug 12 2009, 12:32 Student2 Цитата(Rst7 @ Aug 12 2009, 15:32) Это опи... Aug 12 2009, 12:43 Rst7 Давайте-ка, наверное, минимальный проект, который ... Aug 12 2009, 13:12 Student2 буду сделать паралельный проект где можно увидеть ... Aug 12 2009, 13:19  Student2 Вот проект где можно увидеть проблема! Голова ... Aug 12 2009, 15:21 IgorKossak Проблемный кусок у меня откомпилировался так (v5.3... Aug 12 2009, 16:08 Rst7 ЦитатаНе идеально.
По скорости - вроде идеально. ... Aug 12 2009, 16:19 IgorKossak Цитата(Rst7 @ Aug 12 2009, 19:19) По скор... Aug 12 2009, 16:27  Student2 Спасибо - буду обновить компилер на 5.30. Я был ош... Aug 12 2009, 18:17   Student2 Обновил компилер на 5.30.
С первого момента я был ... Aug 13 2009, 04:03 IgorKossak Немного изменил текст. Оптимизация максимальная по... Aug 12 2009, 16:23 Rst7 Ойойой... Дома нашелся 5.20. Действительно (_*_).
... Aug 12 2009, 16:24 Rst7 ЦитатаLDS и дольше на такт и длиннее вдвое.
Длинн... Aug 12 2009, 16:32 IgorKossak Цитата(Rst7 @ Aug 12 2009, 19:32) А вот п... Aug 12 2009, 16:39 Rst7 ЦитатаТочно, ошибся.
Правда, в этом документе дру... Aug 12 2009, 16:45 IgorKossak Что касается кода, то не стал бы я в прерывании с... Aug 12 2009, 16:53 Rst7 ЦитатаЧто касается кода, то не стал бы я в прерыва... Aug 12 2009, 16:58 Rst7 ЦитатаТак что не спешите идти к 5.30
И какую альт... Aug 13 2009, 05:05 Student2 Цитата(Rst7 @ Aug 13 2009, 08:05) И какую... Aug 13 2009, 05:20  Сергей Борщ Цитата(Student2 @ Aug 13 2009, 08:20) Усп... Aug 13 2009, 08:13   Student2 Цитата(Сергей Борщ @ Aug 13 2009, 11:13) ... Aug 13 2009, 08:20  MrYuran Цитата(Student2 @ Aug 13 2009, 09:20) пер... Aug 13 2009, 08:22 Rst7 ЦитатаА в чем была проблема? Вам не нравится, что ... Aug 13 2009, 10:20 Student2 Цитата(Rst7 @ Aug 13 2009, 13:20) А вообщ... Aug 13 2009, 10:29 Rst7 Ну вот из Вашего тестового проекта сделал вот так
... Aug 13 2009, 10:58 Student2 Цитата(Rst7 @ Aug 13 2009, 13:58) Основна... Aug 13 2009, 11:29 Rst7 ЦитатаДа, работать с локальными копиями переменных... Aug 13 2009, 11:36 Student2 После применения вашего алгоритма у меня код I2C п... Aug 13 2009, 17:09
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|