Директива #include

b707
Offline
Зарегистрирован: 26.05.2017

diakin пишет:

Ну попробуйте у себя-то ради интереса,  код минимальный.

Несложно же.

Попробовал.

#include "add2.h"
#include "add1.h"
  
  void setup() {
  // put your setup code here, to run once:
}

void loop() {
  // put your main code here, to run repeatedly:
}

В обоих включаемых файлах заведомый мусор.

Результат - первой показывается ошибка из файла add2.h, из чего следует, что инклюды обрабатываются в том порядке, в котором следуют в коде.

"Автоматические" неявное включение файлов в проект Ардуино ИДЕ может работать криво, поэтому, чтобы конктролировать состав и порядок включения файлов - используйте явные include

Пробовал на Ардуино ИДЕ 1.8.3  Win7 x64

nik182
Offline
Зарегистрирован: 04.05.2015

Мне всегда казалось что #include может стоять в любом месте программы и подключать любой файл с любым содержимым. Хоть пару строк текста. И совсем не обязательно *.c *.h . T.e. вместо #include "файл" можно вставить его содержимое и резльтат не должен измениться. По крайней мере у меня так работает на поседней версии .

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Формально да - директива #include подключает содержимое файла в то место, в котором описана. Просто это одна из парадигм языка - разделять объявления и определения, так архитектурно правильней. Объявления обычно располагаются в *.h-файлах. Но в исходном файле может быть сразу и объявление и определение, тот же STL - там в одном файле имплементация шаблонных классов, поэтому нет необходимости держать ещё и *.cpp-файл - всё описано в одном файле.

Но лично мне разделение на *.h и *.cpp нравится - всегда можно посмотреть интерфейсы, не копаясь в реализации. Скажем, в С# при большом объёме исходников - некоторый секс, чтобы понять, что к чему.

abomin
Offline
Зарегистрирован: 09.04.2018

Уважаемые гуру, я тут новенький, и вот по какому вопросу.

Можно ли этой замечательной директивой вставить не С-код, а массив байтов из определённого файла? Щас поясню.

Вот мне надо залить прошивку в AT89S2051, я использую скетч, который превращает ардуинку в ISP программатор. В тексте скетча описан массив байтов, количеством равным размеру прошивки. Понятно, что если надо прошить другую прошивку, то весь этот массив надо перебивать ручками (напоминает набор программ по журналу "Радио" в конце 80-х )). Было бы удобней, если бы в скетче с помощью #include или как-то ещё подхватывался файл (в идеале - .bin формата) из папки скетча. Возможно ли такое??

sadman41
Offline
Зарегистрирован: 19.10.2016

Быстрее было попробовать, чем писать всё это... 

Компилятору всё равно, что лежит в текстовом файле, который подключается через #include - лишь бы там был синтаксис честного Си.

abomin
Offline
Зарегистрирован: 09.04.2018

Спасибо. А как прикрутить BIN файл?

sadman41
Offline
Зарегистрирован: 19.10.2016

Напрямую к Си-коду - никак.

abomin
Offline
Зарегистрирован: 09.04.2018

sadman41 пишет:

Напрямую к Си-коду - никак.

Фигассе... Это что ж, проще к ардуинке SD карточку прикрутить, с которой скетч будет читать BIN файл?

sadman41
Offline
Зарегистрирован: 19.10.2016

Кто же знает, как вам проще. Вопрос был об #include, а не нахождении способа зашить МК с помощью другого МК. 

abomin
Offline
Зарегистрирован: 09.04.2018

sadman41 пишет:

Вопрос был об #include

А кроме #include, есть способы подключения сторонних файлов в код?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

abomin пишет:
А кроме #include, есть способы подключения сторонних файлов в код?

abomin
Offline
Зарегистрирован: 09.04.2018

qwone пишет:

abomin пишет:
А кроме #include, есть способы подключения сторонних файлов в код?

Спасибо!

b707
Offline
Зарегистрирован: 26.05.2017

abomin пишет:

Спасибо. А как прикрутить BIN файл?

если BIN не очень большой - можно сконвертить его текстовое представление и подключить как массив байт. Например, так подключают шрифты в экранных библиотеках.

abomin
Offline
Зарегистрирован: 09.04.2018

b707 пишет:

если BIN не очень большой - можно сконвертить его текстовое представление и подключить как массив байт. Например, так подключают шрифты в экранных библиотеках.

Будьте любезны, объясните, как это лучше сделать? BIN от 1 до 4-х килобайтов. Да, со шрифтами хорошая аналогия.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
const byte binFile[]  PROGMEM = {
  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
  /*ну и так далее до 4К*/
};

 

b707
Offline
Зарегистрирован: 26.05.2017

Ровно так же, как вы делаете сейчас - см ниже.

abomin пишет:

 В тексте скетча описан массив байтов, количеством равным размеру прошивки. Понятно, что если надо прошить другую прошивку, то весь этот массив надо перебивать ручками

только массив кладете в отдельный файл. Посмотрите, как устроены файлы шрифтов.

Но перебирать файл "ручками" в массив все равно придется. Или написать отдельную программу на ПК для этого. Если для линукса могу вам набросать код, превращающий бинарник в массив в сформате Си.

abomin
Offline
Зарегистрирован: 09.04.2018

Более-менее понятно, надо пробовать. Я просто думал, что уже есть какие-то конверторы BIN-to-ASCII.TXT

abomin
Offline
Зарегистрирован: 09.04.2018

qwone пишет:

const byte binFile[]  PROGMEM = {
  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
  /*ну и так далее до 4К*/
};

 

Вот в это мне надо вникать, т.к. в ориг. скетче это сделано немного по-другому...

(Вобще, в Си довольно странный синтаксис, ИМХО...)

b707
Offline
Зарегистрирован: 26.05.2017

abomin пишет:

Я просто думал, что уже есть какие-то конверторы BIN-to-ASCII.TXT

вполне возможно, что есть. Стоит поискать в Гугле. Во всяком случае BIN в HEX точно есть, а там и до массива уже недалеко.

Но вообще более правильный путь - не запихивать прошивку в исходник (в любом виде) - а. к примеру, передавать ее на Ардуину с компа по Сериал. Так собственно, и делает скетч Arduino_as_ISP. Возьмите его как образец и напишите для своего программатора аналогичный.

abomin
Offline
Зарегистрирован: 09.04.2018

b707 пишет:
на Ардуину с компа по Сериал. Так собственно, и делает скетч Arduino_as_ISP. Возьмите его как образец и напишите для своего программатора аналогичный.
Хорошая мысль. Надо обдумать этот вариант. А там чтение на комп есть? (Щас не могу посмотреть)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

qwone пишет:

abomin пишет:
А кроме #include, есть способы подключения сторонних файлов в код?

 

Да ладно вам, прямо так и "нет". Вполне себе ЕСТЬ. Библиотекарь в системе гнусей зачем прилепден, ась? :)

abomin
Offline
Зарегистрирован: 09.04.2018

Arhat109-2 пишет:
Да ладно вам, прямо так и "нет". Вполне себе ЕСТЬ. Библиотекарь в системе гнусей зачем прилепден, ась? :)
А можно подоступнее? ))

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

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

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

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Arhat109-2, вот зачем вы человеку голову засераете. На больших машинах некоторые библиотеки хранятся в бинарниках. Их уже не надо компилировать, а просто загрузить в ОЗУ и запустить. Замечательно. Но 1- бинарные файлы надо хранить на диске или на карточке. 2- иметь достоточно ОЗУ для загрузки 3- иметь в ядре загрузчик и выгрузчик.  Можно было напрямую грузить во Флеш память при компиляции. А это заранее забивать память кодом который может пригодиться, а может нет, но память потратится. Вот по этой причине и отказались от подключаемых bin файлов.  

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Я не про dll писал. А про как раз подключаемые файлы, которые ваша Ардуинка и так подключает при каждой компиляции, предварительно формируя из искодников ту самую служебную библиотеку в бинарниках. Да, они "относительные" бинарники, но никто не мешает подключить точно также сборщиком и асболютный, если его грамотно расписать линковщику. Вся эта "анаконда" запускается каждый раз и строго последовательно:

"посроитель Ардуино", "препроцессор", "кумпилятыр", "библиотекарь", "линковщик", "заливальщик в дуню" .. мож кого и пропустил по склерозу.

Никто не мешает вклинить в цепочку на любой стадии свое произведение в соответствующей стадии готовности. #include - просто типовой способ через "препроцессор", но и только.