Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

А если так? "какие такие козырьки"?

Отправлено ReAl 20 февраля 2009 г. 23:16
В ответ на: ex N0: упаковка нескольких данных в 1 лонг отправлено пользователем ы 20 февраля 2009 г. 19:33



enum {
RING_COUNT_MUL = 1,
RING_COUNT_MAX = 8,
RING_COUNT_MASK = RING_COUNT_MAX - 1),
VOLUME_MUL = RING_COUNT_MAX,
VOLUME_MAX = 8,
VOLUME_MASK = (VOLUME_MAX - 1) * VOLUME_MUL,
MELODY_MUL = VOLUME_MUL * VOLUME_MAX,
MELODY_MAX = 16,
MELODY_MASK = (MELODY_MAX - 1) * MELODY_MUL,
MIC_MUL = MELODY_MUL * MELODY_MAX,
MIC_MAX = 8,
MIC_MASK = (MIC_MAX - 1) * MIC_MUL
}; // дальше надоело


#define GET_VAL(field) GET_FIELD( Gsm_Audio, field##_MASK, field##_MUL)
#define SET_VAL(field,val) SET_FIELD( Gsm_Audio, field##_MASK, field##_MUL, val)

#define GET_FIELD(data,mask,mult) (((data) & (mask)) / mult)
#define SET_FIELD(data,mask,mult,val) ( ((data) & ~(mask)) | ((val) * (mult)) & (mask))


unsigned long Gsm_Audio;

unsigned long get_volume()
{
return GET_VAL(VOLUME);
}


void set_volume(unsigned long v)
{
return SET_VAL(VOLUME,v);
}


gcc -E foo.c -o foo.i


# 1 "foo.c"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "foo.c"


enum {
RING_COUNT_MUL = 1,
RING_COUNT_MAX = 8,
RING_COUNT_MASK = RING_COUNT_MAX - 1),
VOLUME_MUL = RING_COUNT_MAX,
VOLUME_MAX = 8,
VOLUME_MASK = (VOLUME_MAX - 1) * VOLUME_MUL,
MELODY_MUL = VOLUME_MUL * VOLUME_MAX,
MELODY_MAX = 16,
MELODY_MASK = (MELODY_MAX - 1) * MELODY_MUL,
MIC_MUL = MELODY_MUL * MELODY_MAX,
MIC_MAX = 8,
MIC_MASK = (MIC_MAX - 1) * MIC_MUL
};
# 28 "m.c"
unsigned long Gsm_Audio;

unsigned long get_volume()
{
return (((Gsm_Audio) & (VOLUME_MASK)) / VOLUME_MUL);
}


void set_volume(unsigned long v)
{
return ( ((Gsm_Audio) & ~(VOLUME_MASK)) | ((v) * (VOLUME_MUL)) & (VOLUME_MASK));
}



Составить ответ | Вернуться на конференцию.

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
поделите шесть пополам:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru