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

 
 
> 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 19 2009, 03:02
Сообщение #2


Местный
***

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



TX_SET8 это макрос, вот его код

#define TX_SET8(a,b,c,d,e,f,g,h,i,j) Can_Tx.cmd = a; Can_Tx.id.ext = (Uint32)(cool.gif; Can_Tx.ctrl.ide = 1;\
Can_Tx.dlc = 8; Can_Tx.data[0] = c; Can_Tx.data[1] = d;\
Can_Tx.data[2] = e; Can_Tx.data[3] = f; Can_Tx.data[4] = g;\
Can_Tx.data[5] = h; Can_Tx.data[6] = i; Can_Tx.data[7] = j;
Заодно привожу и описание Can_Tx:

typedef enum {
CMD_NONE,
CMD_TX,
CMD_TX_DATA,
CMD_TX_REMOTE,
CMD_TX_INT,
CMD_TX_DATA_INT,
CMD_TX_REMOTE_INT,
CMD_RX,
CMD_RX_DATA,
CMD_RX_REMOTE,
CMD_RX_MASKED,
CMD_RX_DATA_MASKED,
CMD_RX_REMOTE_MASKED,
CMD_RX_INT,
CMD_RX_DATA_INT,
CMD_RX_REMOTE_INT,
CMD_RX_MASKED_INT,
CMD_RX_DATA_MASKED_INT,
CMD_RX_REMOTE_MASKED_INT,
CMD_REPLY,
CMD_REPLY_MASKED,
CMD_REPLY_INT,
CMD_REPLY_MASKED_INT,
CMD_ABORT
} can_cmd_t;

// ----------
typedef union{
Uint32 ext;
Uint16 std;
Uint8 tab[4];
} can_id_t;

// ----------
typedef struct{
Bool rtr;
Bool ide;
} can_ctrl_t;

typedef struct{
Uint8 handle;
can_cmd_t cmd;
can_id_t id;
can_id_t mask;
Uint8 dlc;
// Uint8* pt_data;
Uint8 status;
can_ctrl_t ctrl;
Uint8 data[8];
} st_cmd_t;
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st June 2025 - 12:39
Рейтинг@Mail.ru


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