Easyelectronics.ru

Электроника для всех
Текущее время: 19 окт 2019, 22:31

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: Как выбрать один дефайн из нескольких?
СообщениеДобавлено: 30 янв 2016, 12:31 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 4098
Откуда: г. Липецк
В настоящий момент программа средствами условной компиляции может быть настроена на применение одного из двух кварцев 64MHz или 66MHz.
Соответствующие ветки настроены только на свой дефайн:
Код:
#if (defined FQ_64MHz) && (! defined FQ_66MHz)
   ...
#endif
;
#if (defined FQ_66MHz) && (! defined FQ_64MHz)
   ...
#endif

Встроена защита от отсутствия обоих дефайнов:
Код:
#if (! defined FQ_66MHz) && (! defined FQ_64MHz)
   #error "Constant 'FQ_64MHz' or 'FQ_66MHz' not defined."
#endif

или от применения сразу обоих:
Код:
#if (defined FQ_64MHz) && (defined FQ_66MHz)
   #error "It defines only one constant 'FQ_64MHz' or 'FQ_66MHz'."
#endif


Возникла необходимость добавить третий дефайн. Как это решается стандартно?


Последний раз редактировалось anakost 30 янв 2016, 13:51, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как выбрать один дефайн из нескольких?|
СообщениеДобавлено: 30 янв 2016, 12:50 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1127
Откуда: Германия
Код:
#ifdef FQ_64MHz
...
#elif defined(FQ_66MHz)
...
#elif defined(FQ_xxMHz)
...
#elif defined(FQ_yyMHz)
...
#elif defined(FQ_nnMHz)
...
#else
#error Not supported
#endif

Защиты от отсутствия или присутствия нескольких в данном случае решаются автоматически - берется первый присутствующий.

_________________
Мои поделки
http://www.fun-electronic.net/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как выбрать один дефайн из нескольких?
СообщениеДобавлено: 30 янв 2016, 13:36 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 4098
Откуда: г. Липецк
Это все понятно, спасибо.
Но нет предупреждения от использования двух дефайнов одновременно. Или трех, в этом и затык...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как выбрать один дефайн из нескольких?
СообщениеДобавлено: 30 янв 2016, 13:59 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2622
Откуда: Санкт-Петербург
Если у вас серия однотипных - замените их на
#define FQ_MHZ 66
и проверяйте через
#if FQ_MHZ == 66
- это всё упростит
(дефайны типа #FQ_66MHZ, если они уже используются, можете генерить сами под #if)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как выбрать один дефайн из нескольких?
СообщениеДобавлено: 30 янв 2016, 14:43 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 4098
Откуда: г. Липецк
При определении
Цитата:
#define FQ_MHZ 66

я так понимаю мы сопоставили числовой константе FQ_MHZ значение 66. Те же яйца, только сбоку. А если задать 87, которые программа не умеет обрабатывать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как выбрать один дефайн из нескольких?
СообщениеДобавлено: 30 янв 2016, 15:16 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2622
Откуда: Санкт-Петербург
Так проверки ж упрощаются до предела:
Код:
#ifndef FQ
  #error please define FQ
#elif FQ!=64 && FQ!=66 && FQ!=75
  #error wrong FQ
#endif


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как выбрать один дефайн из нескольких?
СообщениеДобавлено: 30 янв 2016, 16:07 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 4098
Откуда: г. Липецк
Не пойдет, неизящно это
Цитата:
#elif FQ!=64 && FQ!=66 && FQ!=75

И сколько частот надо перечислить как поддерживаемые/неподдерживаемые?
Знаю и прорабатывал принцип выбора компилятора в инклюдах.
Мне нужна ошибка при отсутствии дефайнов, при применении более одного дефайна.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как выбрать один дефайн из нескольких?
СообщениеДобавлено: 30 янв 2016, 18:44 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2622
Откуда: Санкт-Петербург
Перечислить надо только поддерживаемые, т.е. три. И только в одной строке, где проверка (там, где используете - всего одна проверка на равенство)
Всё, что не соответствует - ошибка.
Через свойства проекта два разных значения дефайна вы задать не сможете.

Если очень охота начинать с ваших дефайнов (зачем?) - можете собрать из них мой пачкой ifdef:
Код:
#ifdef FQ64
  #ifdef FQ
    #error duplicate freq definition
  #endif
  #define FQ 64
#endif

#ifdef FQ66
  #ifdef FQ
    #error duplicate freq definition
  #endif
  #define FQ 66
#endif

...

Идею поняли? Блоки для всех частот тупо одинаковые.

Другой вариант:
Код:
#ifdef FQ64
   #define FQ 64
#endif
#ifdef FQ66
   #define FQ 66
#endif
...

#ifndef FQ
  #error FQ not defined
#endif

#if defined(FQ64) && FQ!=64
   #error FQ conflict
#endif
...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как выбрать один дефайн из нескольких?
СообщениеДобавлено: 30 янв 2016, 22:32 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 4098
Откуда: г. Липецк
Нельзя ли привести сам принцип выбора из трех дефайнов? При отсутствии дефайнов, при применении более одного дефайна должна быть ошибка.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как выбрать один дефайн из нескольких?
СообщениеДобавлено: 30 янв 2016, 23:16 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2622
Откуда: Санкт-Петербург
anakost, так оба варианта, которые я вам привёл, делают ровно это.
Принцип простой:
В первом варианте - перебираем все _разрешённые_ частоты (макросы FQ64/FQ66/FQ75) и для каждой пробуем установить FQ. Если FQ была установлена раньше - значит, определено более одного макроса. После перебора всех надо проверить #ifndef FQ - если так, значит, не определён ни один макрос.

Во втором - два прохода по всем макросам. На первом проходе определяем FQ, на втором проверяем, нет ли конфликтов.

Впрочем, кажется, конкретно вашу задачу можно решить проще.
Код:
#if defined(FQ64) + defined(FQ66) + defined(FQ75) == 0
  #error FQ not defined
#endif
#if defined(FQ64) + defined(FQ66) + defined(FQ75) >1
  #error multiple FQ definitions
#endif

Или попросту
Код:
#if defined(FQ64) + defined(FQ66) + defined(FQ75) != 1
  #error FQ should be defined exactly once
#endif


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как выбрать один дефайн из нескольких?
СообщениеДобавлено: 06 фев 2016, 21:51 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 4098
Откуда: г. Липецк
Спасибо aamonster, я так и сделал (одна переменная на частоту). Правда без матюков не обошлось, оказалось есть отличия у С51 и препроцессора А51 в Keil. Немного по разному интерпретируют дефайны. Но разобрался, все работает по вашему рецепту, спасибо еще раз...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB