[an error occurred while processing this directive]
Ответ:
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено trainer 28 ноября 2002 г. 09:57
В ответ на: Кто-нибудь подскажет, как в Си в 4-х байтовой переменной (unsigned long) обращаться по-отдельности к старшим и младшим 2-м байтам (unsigned short)? отправлено Gorik 28 ноября 2002 г. 00:09

Общие вещи, не относящиеся к конкретному компилятору:
1) Сдвиг:


#define LOWORD(val) ((val)&0xffff)
#define HIWORD(val) ((val)>>16)
#define SET_LOWORD(var,val) var=((var&0xffff0000)|(val&0xffff))
#define SET_HIWORD(var,val) var=((var&0xffff)|(val<<16))

Недостаток - лдя чтения и записи требуются отдельные макросы/функции, запись не с младшего байта( например, в старшее слово ) требует усилий "мозгов" компилятора.
2) Через адрес:

#define LOWORD(val) *((unsigned short *)&val)
#define HIWORD(val) *(((unsigned short *)&val)+1)

Недостатки - в C регистровые переменные не имеют адреса, в C++ для получения адреса регистровой переменной будет создана ее копия в адресуемой памяти, требует знания порядка размещения компонентов длинного слова.
3) через union:

typedef union {
unsigned long AsDWord;
struct {
unsigned short LowWord;
unsigned short HighWord;
}AsWord;
unsigned short Words[2];
} unsigned_long;

Недостатки - требует знания порядка размещения компонентов длинного слова. Для процессоров типа i386+ выравнивание по умолчанию осуществляется по границе 32/64/128-битного слова, но это лечится с помощью
#pragma pack(push,1) // или pack(push,2)
typedef ...
#pragma pack(pop)

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

Ответы



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

E-mail: info@telesys.ru