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

 
 
> IAR AVR4.30, Проблема с union
KSN
сообщение Jun 18 2009, 04:07
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304



Пишу загрузчик для AT90CAN128 и столкнулся с проблемой. Далее привожу часть кода, которая вызывает ошибку.
__C_task main(void)
{
// обявил переменную sum
union {
unsigned char b[4];
unsigned int w[2];
unsigned long dw;
}sum;
unsigned long data32;
sum.dw = (unsigned long)0x00011278;
// далее посыдаю побайтно sum.b[0], sum.b[1],sum.b[2],sum.b[3] в CAN
data32 = (unsigned long)0x00011278;
// далее посыдаю побайтно (unsigned char)data32, (unsigned char)(data32>>8),
// (unsigned char)(data32>>16),(unsigned char)(data32>>24) в CAN
}

В результате вижу по CAN:
1-ая посылка: 0x78, 0x12, 0x12, 0x00
2-ая: 0x78, 0x12, 0x01, 0x00
В чем глюк понять не могу. Это клюк компилятора или я что-то не так делаю? Уровень оптимизации стоит максимальный по объему кода.
P.S. Скомпилировал проект под IAR AVR 5.20 все работает нормально. Подтвердите, это глюк компилятора?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
KSN
сообщение Jun 18 2009, 09:15
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304



Прилагаю файлы iar430a.7z и iar520.7z
В первом листинг, map, файл исходника с функцией main.c и *.xcl файл.
Во втором только листинг и map.Прикрепленный файл  Iar430a.7z ( 28.07 килобайт ) Кол-во скачиваний: 130
Прикрепленный файл  Iar520.7z ( 24.56 килобайт ) Кол-во скачиваний: 156

Прикрепленные файлы
Прикрепленный файл  Iar430a.7z ( 28.07 килобайт ) Кол-во скачиваний: 17
 
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 18 2009, 10:54
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(KSN @ Jun 18 2009, 12:15) *
Прилагаю файлы iar430a.7z и iar520.7z
Покажите исходник TX_SET8, возможно проблема в нем. Пока видно вот что:
Код
    120              sum.dw = *((Uint32 __hugeflash *)(0x0000A2));
   \   0000008E   EAE2               LDI     R30, 162
   \   00000090   E0F0               LDI     R31, 0
   \   00000092   BFFB               OUT     0x3B, R31
   \   00000094   9187               ELPM    R24, Z+
   \   00000096   9197               ELPM    R25, Z+
   \   00000098   91A7               ELPM    R26, Z+
   \   0000009A   91B6               ELPM    R27, Z
    121              data32 = *((Uint32 __hugeflash *)(0x0000A2));
Это чтение. Компилятор соптимизировал обе переменные в одну.
Далее развернут и встроен TX_SET8.

Это обработка одной копии:
   \                     ??CrossCallReturnLabel_28:
   \   0000009E   8786               STD     Z+14, R24
   \   000000A0   8797               STD     Z+15, R25
   \   000000A2   8BA0               STD     Z+16, R26
   \   000000A4   8BB1               STD     Z+17, R27
Это обработка второй. Дважды используется один байт из R25:
   \   00000000   8B82               STD     Z+18, R24
   \   00000002   8B93               STD     Z+19, R25
   \   00000004   8B94               STD     Z+20, R25
   \   00000006   8BB5               STD     Z+21, R27


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 10:01
Рейтинг@Mail.ru


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