[an error occurred while processing this directive]
Ответ:
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
Общие вещи, не относящиеся к конкретному компилятору:
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