Написание библиотеки общего ядра и танцы с бубном вокруг #define

Mysterious
Offline
Зарегистрирован: 25.09.2012

Итак есть некий проект состоящий из нескольких устройств. на каждое устройство свой скетч но библиотека ядра общая. Ядро в зависимости от железки должно при помощи препроцессора то подключать какие-то модули то нет (для эконеомии размера скетча)
Если я в скетче задаю некий :
 

#define USE_LED true
#define LED_SET 2
#include <My_core.h>

то как мне сделать так чтобы код внутри моего файла библиотеки My_cope.h (или My_core.cpp)

можно было написать 

#ifdef USE_LED
#include "My_core_led.h"
#endif

И вообще суппер, если подскажете как сделать чтобы этот My_core_led.h видел дефайн LED_SET

То есть грубо говоря каксделать конфигурируемое из скетча ядро?
 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Простите, не понял проблемы. Вот так и пишите. Все должны всё увидеть. Или я чего-то не понял в вопросе?

SunX
SunX аватар
Offline
Зарегистрирован: 04.10.2014

У меня примерно так все и сделано, все работает замечательно.

Только скорее всего Вам надо писать не

#ifdef USE_LED
#include "My_core_led.h"
#endif

а

#if USE_LED == true
#include "My_core_led.h"
#endif

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

А ядро - это что?

Насколько я понимаю вы можете задэфайнить хоть все 100500 дэфайнов.
Но если вы не используете ни одну функцию из них в вашей программе ничего не изменится.
А вот всякие #ifdef надо писать в тексте программы.

#include <SimpleTimer.h>
#include <SharpIR.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <dht11.h>
#include <SoftwareSerial.h>
#include <SPI.h>

#define mmm TRUE
void setup() {
}
void loop() {
  if (mmm) {}
}

Или

#include <SimpleTimer.h>
#include <SharpIR.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <dht11.h>
#include <SoftwareSerial.h>
#include <SPI.h>

#define mmm 

void setup() {
}
void loop() {
  #ifdef mmm
  int i=0; 
  #endif
  int i=1; 
}

 

Mysterious
Offline
Зарегистрирован: 25.09.2012

Извиняюсь если не так объяснил.
Ядро это библиотека. котрая лежит в libraries/My_core
Я её планирую подключать в разных скетчах и дефайнами конфигурировать.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы не ответили на мой вопрос. Проблема-то в чём? Что не так? Вроде, нормально у Вас всё написано.

Mysterious
Offline
Зарегистрирован: 25.09.2012

Проблема в том что файлы библиотеки не видят дефайны установленные в скетче

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Этого не может быть. По логике у Вас всё правильно. Наверняка, проблема в какой-нибудь мелкой опечатке. Например, в Вашем первом посте в одном месте используется My_core.h, а в другом  My_cope.h. Не удивлюсь, если и в коде имеется опечатка. Посмотрите. Или выложите реальные коды - я посмотрю.

Arhat109
Offline
Зарегистрирован: 26.05.2015

Да, все должно работать. Или опечатка в названии дефайнов. У меня тоже так и сделано:

В скетче:

#define _ARHAT_ 1
#include "arhat.h"

// .. далее сам скетч, к примеру типовой blink.ino

В файле arhat.h стоит:

#ifndef _ARHAT_H_
#define _ARHAT_H_

#define Arduino_h       1       // Blocking. Not used standart Arduino.h header!

//.. прочие определения файла и далее:

#if defined(_ARHAT_) && (_ARHAT_ == 1)

// .. собственные определения для минимизации скетчей

#else

// ... повтор определений (только полезных) из Arduino.h для режима совместимости

#endif // _ARHAT_

#endif // _ARHAT_H_

Это позволяет убрав из скетча директиву #define _ARHAT_ 1 получить режим компиляции с определениями из стандартного файла,

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

или компилять код в режиме макс. экономии памяти.

Я ещё пользуюсь тем, что сам файл Arduino.h подшивается в скетч ПОСЛЕ всех директив препроцессора в самом скетче... соответственно строка

#define Arduino.h 1 -- автоматом выключает компиляцию "стандартных заголовков" из этого файла. :)