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

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

Ну усё, вылизал до состояния, которое согласился бы применять сам.

Отправлено ReAl 21 февраля 2009 г. 07:40


align=Top
#define FIELD(name,width,pos) \
name##_POS = pos, name##_mask = ((1<<(width))-1)<<(pos), name##_WIDTH = width

#define FIELD_NEXT(name,width,prev) \
name##_POS = prev##_POS + prev##_WIDTH, name##_MASK = ((1<<(width))-1) << name##_POS

#define GET_FIELD(data,mask,pos) (((data) & (mask)) >> pos)

#define SET_FIELD(data,mask,pos,val) ( ((data) & ~(mask)) | ((val) << (pos)) & (mask))

// Ну НЕУЖЕЛИ тот вариант с BIN32 удобнее в написании и сопровождении???
enum {
FIELD ( RING_COUNT, 3, 0),
FIELD_NEXT( VOLUME, 3, RING_COUNT),
FIELD_NEXT( MELODY, 4, VOLUME),
FIELD_NEXT( MIC, 3, MELODY)
};

#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)

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"
# 14 "foo.c"
enum {
RING_COUNT_POS = 0, RING_COUNT_mask = ((1<<(3))-1)<<(0), RING_COUNT_WIDTH = 3,
VOLUME_POS = RING_COUNT_POS + RING_COUNT_WIDTH, VOLUME_MASK = ((1<<(3))-1) << VOLUME_POS,
MELODY_POS = VOLUME_POS + VOLUME_WIDTH, MELODY_MASK = ((1<<(4))-1) << MELODY_POS,
MIC_POS = MELODY_POS + MELODY_WIDTH, MIC_MASK = ((1<<(3))-1) << MIC_POS
};
# 28 "foo.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));
}


А теперь, для сравнения, выдача препроцессора после макросов BIN32 и поиска смещения по маске (оставил одну функцию, как и у меня выше)
# 1 "foo2.c"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "foo2.c"
typedef unsigned char u8_t
# 53 "foo2.c"
u8_t HwPrf_RingCount (void) { return (((gPROFILE.Gsm_Audio) & (BIN32(00000000,00000000,00000000,00000111))) >> (((BIN32(00000000,00000000,00000000,00000111)) & 0x00000001 ? 0ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x00000002 ? 1ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x00000004 ? 2ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x00000008 ? 3ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x00000010 ? 4ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x00000020 ? 5ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x00000040 ? 6ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x00000080 ? 7ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x00000100 ? 8ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x00000200 ? 9ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x00000400 ? 10ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x00000800 ? 11ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x00001000 ? 12ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x00002000 ? 13ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x00004000 ? 14ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x00008000 ? 15ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x00010000 ? 16ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x00020000 ? 17ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x00040000 ? 18ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x00080000 ? 19ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x00100000 ? 20ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x00200000 ? 21ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x00400000 ? 22ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x00800000 ? 23ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x01000000 ? 24ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x02000000 ? 25ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x04000000 ? 26ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x08000000 ? 27ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x10000000 ? 28ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x20000000 ? 29ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x40000000 ? 30ul: ((BIN32(00000000,00000000,00000000,00000111)) & 0x80000000 ? 31ul:0))))))))))))))))))))))))))))))))));}


А теперь "маленький секрет". Я сам писал программу генерации масок b001000 так далее. Лет уже больше 15-ти назад. Дискеты были не такие большие, поэтому цель archive в makefile в командной строке архиватора исключала этот файл и была зависимость для его генерации общим для всех проектов маленьким .com, который лежал в c:\bin
Но за несколько лет пришёл к выводу, что это всё от лукавого.

А теперь я с полной уверенностью говорю "ну я не понимаю, зачем нужны такие defin-ы" :-) :-)



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

Ответы


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

Сообщение:

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

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

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

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