anonymous@RULINUX.NET~# Last login: 2024-04-25 16:39:50
Регистрация Вход Новости | Разметка | Пользователи | Галерея | Форум | Статьи | Неподтвержденное | Трекер | Правила форума | F.A.Q. | Ссылки | Поиск
[#] [Добавить метку] [Редактировать]
Скрыть

[AVR-GCC] Как изнутри сишного макроса определить пару-тройку макросов?

Есть дофига устройств которые висят каждое на своей ножке MCU, их конфигурация описывается в хидере примерно так:

  1.  #define LASER1_PORT D
  2.  #define LASER1_PIN 6
  3.  
  4.  #define SENSOR1_PORT C
  5.  #define SENSOR1_PIN 4
  6.  

Потом на каждое устройство определяются специфичные для него порты:

  1.  #define C_LASER1_PORT C_CONCAT(PORT,LASER1_PORT)
  2.  #define C_LASER1_DDR C_CONCAT(DDR,LASER1_PORT)
  3.  #define C_LASER1_PIN C_CONCAT(PIN,LASER1_PORT)
  4.  #define C_LASER1_P C_CONCAT3(P,LASER1_PORT,LASER1_PIN)
  5.  
  6.  #define C_SENSOR1_PORT C_CONCAT(PORT,SENSOR1_PORT)
  7.  #define C_SENSOR1_DDR C_CONCAT(DDR,SENSOR1_PORT)
  8.  #define C_SENSOR1_PIN C_CONCAT(PIN,SENSOR1_PORT)
  9.  #define C_SENSOR1_P C_CONCAT3(P,SENSOR1_PORT,SENSOR1_PIN)
  10.  

Функции которые со всем этим работают выглядят так: \code{ #define output_init(name) C_##name##_DDR |= (1

anonymous(*) (2011-09-28 01:38:00)

[Ответить на это сообщение]
avatar
Скрыть

Re: [AVR-GCC] Как изнутри сишного макроса определить пару-тройку макросов?

Функции которые со всем этим работают выглядят так: \code{

#define output_init(name) C_##name##_DDR |= (1

anonymous(*)(2011-09-28 01:41:08)

avatar
Скрыть

Re: [AVR-GCC] Как изнутри сишного макроса определить пару-тройку макросов?

Вот удалось на тестовом сайте запостить с более-менее форматированием:  http://rulinux.dyndns.org/thread_4_page_1#msg12

anonymous(*)(2011-09-28 01:53:29)

avatar
Скрыть

Re: [AVR-GCC] Как изнутри сишного макроса определить пару-тройку макросов?

в сях внутри макроса другие макросы определять нельзя. Препроцессор, который разворачивает самый внешний макрос, не будет обрабатывать сгенерённый им код. Поэтому в сях такие задачи традиционно решаются без макросов, блоком switch() и константой, поставляемой в функцию как аргумент. У меня аналогичная но более сложная задача решалась отдельной функцией на лиспе, который создавал сишный исходник в момент компиляции.

bugmaker(*)(2011-09-28 04:36:07)

Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.2.17) Gecko/20110422 Ubuntu/10.04 (lucid) Firefox/3.6.17
avatar
Скрыть

Re: [AVR-GCC] Как изнутри сишного макроса определить пару-тройку макросов?

Жаль.. Думал есть какой выкрутас.

В рантайм это исполняться не должно, свичи не катят ещё и потому, что заранее имена констант знать не хочется (так и на ифдефах можно было бы наколбасить без траты байтов и тактов), а хранить строки просто негде. Лепить пре-пре-процессор, который будет сложнее собственно программки тоже, наверное, не хочется.

anonymous(*)(2011-09-28 05:26:22)

avatar
Скрыть

Re: [AVR-GCC] Как изнутри сишного макроса определить пару-тройку макросов?

Бля, макросов получилось больше чем кода.. Это заёбывает..

anonymous(*)(2011-10-12 02:02:06)

avatar
Скрыть

Re: [AVR-GCC] Как изнутри сишного макроса определить пару-тройку макросов?

> макросов
юз лисп сцуко

bugmaker(*)(2011-10-12 02:57:34)

Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.2.17) Gecko/20110422 Ubuntu/10.04 (lucid) Firefox/3.6.17
avatar
Скрыть

Re: [AVR-GCC] Как изнутри сишного макроса определить пару-тройку макросов?

>юз лисп сцуко
На AVR-е?

SystemV(*)(2011-10-12 02:59:21)

Emacs-w3m/1.4.414 w3m/0.5.3
avatar
Скрыть

Re: [AVR-GCC] Как изнутри сишного макроса определить пару-тройку макросов?

В качестве пре-пре-процессора..

Теперь я понимаю почему под PC все пишут такие тормозные программы: за отсутствием языковых средств в сях и ленью возиться с ещё одной прослойкой - всё вычисляют в рантайме, что приводит к тому, что современные гигагерцовые процессоры тормозят так же как и ХТ-шки в древности.

anonymous(*)(2011-10-12 03:10:27)

avatar
Скрыть

Re: [AVR-GCC] Как изнутри сишного макроса определить пару-тройку макросов?

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

bugmaker(*)(2011-10-12 03:23:42)

Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.2.17) Gecko/20110422 Ubuntu/10.04 (lucid) Firefox/3.6.17
Этот тред читают 1 пользователь:
Анонимных: 1
Зарегистрированных: 0




(c) 2010-2020 LOR-NG Developers Group
Powered by TimeMachine

Valid HTML 4.01 Transitional Правильный CSS!