[an error occurred while processing this directive] [an error occurred while processing this directive]
Ответ: Нет ничего проще - пользуйтесь на здоровье
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено trainer 28 марта 2002 г. 22:14
В ответ на: Как использовать старший байт инта _на_запись_ в си авр отправлено Andy Дюх 27 марта 2002 г. 12:10

Работает везде и всегда с минимальными доработками ( порядок байт в слове, неименованные структуры )
typedef union {
int AsInt;
unsigned int AsWord;
unsigned char Bytes[2];
struct {
unsigned char LowByte;
unsigned char HighByte;
}; /* это неименованная структура, если компилятор этого */
/* не позволяет, можно дать имя, откорректировав нижеследующее */
} __word;
#define HIGH_BYTE(x) (((__word)(x)).HighByte)
// или #define HIGH_BYTE(x) (((__word)(x)).Bytes[0])
#define LOW_BYTE(x) (((__word)(x)).LowByte)
#define SWAP_BYTES(x) ((HIGH_BYTE(x)>>8|(LOW_BYTE(x)<<8))
ну и затем например :
HIGH_BYTE(word1)=10;
LOW_BYTE(word2)=HIGH_BYTE(0x1234);
HIGH_BYTE(word4)=LOW_BYTE(SWAP_BYTES(word3));
Скобок много, чтобы не нарваться на неприятности с макросами.
Единственное ограничение - нельзя использовать в левой части выражения запись вида HIGH_BYTE(*ptr) - для этого нужен отдельный макрос с косвенной адресацией.

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru