|
Плохой код при обмен данных между двумя структурами |
|
|
|
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, 12:15
|

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

|
Цитата оптимизация кода на макс по скорости Непохоже, что она включена. Покажите описание структур, попробую у себя CODE 28 extern struct 29 { 30 UINT8 shadowX1; 31 UINT8 shadowY1; 32 UINT8 shadowX2; 33 UINT8 shadowY2; 34 }out; 35 36 extern struct 37 { 38 UINT8 X1; 39 UINT8 X2; 40 UINT8 Y1; 41 UINT8 Y2; 42 }pos; 43
\ In segment CODE, align 2, keep-with-next 44 void xcopy(void) \ xcopy: 45 { \ 00000000 .... LDI R30, LOW(pos) \ 00000002 .... LDI R31, (pos) >> 8 \ 00000004 8100 LD R16, Z \ 00000006 9300.... STS `out`, R16 46 out.shadowX1 = pos.X1; /* shadow register X1 */ 47 out.shadowY1 = pos.Y1; /* shadow register Y1 */ \ 0000000A 8102 LDD R16, Z+2 \ 0000000C 9300.... STS (`out` + 1), R16 48 out.shadowX2 = pos.X2; /* shadow register X2 */ \ 00000010 8101 LDD R16, Z+1 \ 00000012 9300.... STS (`out` + 2), R16 49 out.shadowY2 = pos.Y2; /* shadow register Y2 */ \ 00000016 8103 LDD R16, Z+3 \ 00000018 9300.... STS (`out` + 3), R16 50 out.shadowX1 = pos.X1; /* shadow register X1 */ \ 0000001C 8100 LD R16, Z \ 0000001E 9300.... STS `out`, R16 51 } \ 00000022 9508 RET
Не вижу проблем.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Aug 12 2009, 12:22
|

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

|
Цитата(Rst7 @ Aug 12 2009, 15:11)  Непохоже, что она включена. Покажите описание структур, попробую у себя Я клянусь что включена. Вот большей фрагмент кода: CODE /*----------------------------------------------------------------------------*/ #pragma vector=TWI_vect __interrupt void TWI_ISR( void ) /* interrupt vector of I2C - the only one active interrupt */ /*----------------------------------------------------------------------------*/ { uint8_t *pointer; /* we use 8 bit pointer to read write the I2C space */
do { uint8_t status_TWI = TWSR; /* read status of I2C register */ uint8_t data_TWI = TWDR; /* read data from I2C register as soon as possible - this will avoid any further problems */ uint8_t flagGoTo_IDLE = 0; /* if at the end we see this flag set to 1 we'll force the state to IDLE */ switch (stateI2C) /* the main state machine is here */ { /* -------- transmit data sequentially to HOST from the area (this is the normal reading flow, it's 99.99% of the time here */ case STATE_CONTINUE_TRANSMIT: { if (status_TWI == STAT_TR_TWDR_SENT_ACK_0xB8) { if(index_RW == 0) /* was request to read the status (cell 0x00) - we need special treatment */ { TWDR = out.status; /* we output the updated value immediately - as faster we response than better */ out.status &= ~STATUS_DATA_CHANGED; /* reset the flag which shows existence of new data, will be set after new data appeared */
/*------- upload the shadow registers at this moment */ 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: CODE typedef struct { uint8_t status; uint8_t shadowX1; uint8_t shadowY1; uint8_t shadowX2; uint8_t shadowY2;
uint8_t shadowX1Size; uint8_t shadowY1Area; uint8_t shadowX2Size; uint8_t shadowY2Area; uint8_t var1; uint8_t var2; uint16_t var3;
uint8_t var4; uint8_t var5; uint8_t var6; uint8_t var7; uint8_t var8;
uint8_t var9; uint8_t var10; eepromData_t ee; /* other structure - 56 bytes long */
} outputData_t;
Описание структуры pos: CODE typedef struct /* contains the data for reporting to the host */ { uint8_t X1; uint8_t Y1; uint8_t X2; uint8_t Y2;
uint8_t dw1; uint8_t dw2; uint8_t dw3; uint8_t dw4; uint16_t dw5;
} reportData_t; Обратите внимание что это произходить в интерупте. Код довольно громодкий.
Сообщение отредактировал Student2 - Aug 12 2009, 12:27
|
|
|
|
Сообщений в этой теме
Student2 Плохой код при обмен данных между двумя структурами Aug 12 2009, 12:08 Rst7 ЦитатаОписание структуры pos:
Это описание типа. ... Aug 12 2009, 12:32 Student2 Цитата(Rst7 @ Aug 12 2009, 15:32) Это опи... Aug 12 2009, 12:43 Rst7 Что-то Вы не то делаете. Расчехлил вообще старый, ... Aug 12 2009, 13:00 Student2 ##################################################... Aug 12 2009, 13:07 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
|
|
|