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

 
 
> 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
Ответов
plombir
сообщение Jun 18 2009, 06:46
Сообщение #2


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

Группа: Участник
Сообщений: 99
Регистрация: 14-12-05
Пользователь №: 12 191



Очень давно, в IAR3.хх с похожим столкнулся. Компилятор некорректно сдвигал вправо на большое значение кратное 8-ми. Сейчас не вспомню, с локальными или глобальными это было.
Поборол делением (data32 / 16) (data32 / 24). Что примечательно, иар не обращался к процедуре деления, а брал нужный байт как при сдвиге. Оптимизация полностью отключена.
Потом, все сдвиги заменил макросами. С ними проблем не возникало. Посмотрите, может у Вас что то похожее.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 18 2009, 07:43
Сообщение #3


Гуру
******

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



Цитата(plombir @ Jun 18 2009, 09:46) *
Потом, все сдвиги заменил макросами.
Можно об этом подробнее?
KSN: показывайте листинги.


--------------------
На любой вопрос даю любой ответ
"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
plombir
сообщение Jun 18 2009, 14:30
Сообщение #4


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

Группа: Участник
Сообщений: 99
Регистрация: 14-12-05
Пользователь №: 12 191



Цитата(Сергей Борщ @ Jun 18 2009, 11:43) *
Можно об этом подробнее?
Во глюканул, но это я хорошо разделил smile.gif
Делить нужно, соответственно, на 256, 65536, 16777216
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 15:09
Рейтинг@Mail.ru


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