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

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


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Rst7
сообщение Aug 12 2009, 12:15
Сообщение #2


Йа моск ;)
******

Группа: Модераторы
Сообщений: 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


Не вижу проблем.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Student2
сообщение Aug 12 2009, 12:22
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 20:57
Рейтинг@Mail.ru


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