Ну попробуйте у себя-то ради интереса, код минимальный.
Несложно же.
Попробовал.
#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
Мне всегда казалось что #include может стоять в любом месте программы и подключать любой файл с любым содержимым. Хоть пару строк текста. И совсем не обязательно *.c *.h . T.e. вместо #include "файл" можно вставить его содержимое и резльтат не должен измениться. По крайней мере у меня так работает на поседней версии .
Формально да - директива #include подключает содержимое файла в то место, в котором описана. Просто это одна из парадигм языка - разделять объявления и определения, так архитектурно правильней. Объявления обычно располагаются в *.h-файлах. Но в исходном файле может быть сразу и объявление и определение, тот же STL - там в одном файле имплементация шаблонных классов, поэтому нет необходимости держать ещё и *.cpp-файл - всё описано в одном файле.
Но лично мне разделение на *.h и *.cpp нравится - всегда можно посмотреть интерфейсы, не копаясь в реализации. Скажем, в С# при большом объёме исходников - некоторый секс, чтобы понять, что к чему.
Уважаемые гуру, я тут новенький, и вот по какому вопросу.
Можно ли этой замечательной директивой вставить не С-код, а массив байтов из определённого файла? Щас поясню.
Вот мне надо залить прошивку в AT89S2051, я использую скетч, который превращает ардуинку в ISP программатор. В тексте скетча описан массив байтов, количеством равным размеру прошивки. Понятно, что если надо прошить другую прошивку, то весь этот массив надо перебивать ручками (напоминает набор программ по журналу "Радио" в конце 80-х )). Было бы удобней, если бы в скетче с помощью #include или как-то ещё подхватывался файл (в идеале - .bin формата) из папки скетча. Возможно ли такое??
если BIN не очень большой - можно сконвертить его текстовое представление и подключить как массив байт. Например, так подключают шрифты в экранных библиотеках.
если BIN не очень большой - можно сконвертить его текстовое представление и подключить как массив байт. Например, так подключают шрифты в экранных библиотеках.
Будьте любезны, объясните, как это лучше сделать? BIN от 1 до 4-х килобайтов. Да, со шрифтами хорошая аналогия.
В тексте скетча описан массив байтов, количеством равным размеру прошивки. Понятно, что если надо прошить другую прошивку, то весь этот массив надо перебивать ручками
только массив кладете в отдельный файл. Посмотрите, как устроены файлы шрифтов.
Но перебирать файл "ручками" в массив все равно придется. Или написать отдельную программу на ПК для этого. Если для линукса могу вам набросать код, превращающий бинарник в массив в сформате Си.
Я просто думал, что уже есть какие-то конверторы BIN-to-ASCII.TXT
вполне возможно, что есть. Стоит поискать в Гугле. Во всяком случае BIN в HEX точно есть, а там и до массива уже недалеко.
Но вообще более правильный путь - не запихивать прошивку в исходник (в любом виде) - а. к примеру, передавать ее на Ардуину с компа по Сериал. Так собственно, и делает скетч Arduino_as_ISP. Возьмите его как образец и напишите для своего программатора аналогичный.
Вам это тоже не подойдет, да и доступнее - много сложнее, чем Вам кажется. В общем, процесс несколько сложнее чем просто "кумпиляцыя" скетча. Там апосля компилятыра работает ещё "сборщик" окончательного кода программы, который собирает все неразобранные имена и назначает окончательные адреса. Вот ему, теоретически и можно подсунуть "готовый" (бинарник) или "полуготовый" (библиотеку) файлик. Главное грамотно "заяснить" что куда и в какой последовательности пришивать надо при сборке. И да, на этом песня не заканчивается. Там после него ещё преобразователь в файл-заливки работает. Тот самый, что HEX формат знает как сбацать.
В общем, это было просто возражение на то что "способа нет" - есть, но Вам оно не под силу. И вооще, на сегодня мало кому под силу... (таких думаю по пальцам на одной руке на весь программисткий бомонд)
Arhat109-2, вот зачем вы человеку голову засераете. На больших машинах некоторые библиотеки хранятся в бинарниках. Их уже не надо компилировать, а просто загрузить в ОЗУ и запустить. Замечательно. Но 1- бинарные файлы надо хранить на диске или на карточке. 2- иметь достоточно ОЗУ для загрузки 3- иметь в ядре загрузчик и выгрузчик. Можно было напрямую грузить во Флеш память при компиляции. А это заранее забивать память кодом который может пригодиться, а может нет, но память потратится. Вот по этой причине и отказались от подключаемых bin файлов.
Я не про dll писал. А про как раз подключаемые файлы, которые ваша Ардуинка и так подключает при каждой компиляции, предварительно формируя из искодников ту самую служебную библиотеку в бинарниках. Да, они "относительные" бинарники, но никто не мешает подключить точно также сборщиком и асболютный, если его грамотно расписать линковщику. Вся эта "анаконда" запускается каждый раз и строго последовательно:
"посроитель Ардуино", "препроцессор", "кумпилятыр", "библиотекарь", "линковщик", "заливальщик в дуню" .. мож кого и пропустил по склерозу.
Никто не мешает вклинить в цепочку на любой стадии свое произведение в соответствующей стадии готовности. #include - просто типовой способ через "препроцессор", но и только.
Ну попробуйте у себя-то ради интереса, код минимальный.
Несложно же.
Попробовал.
В обоих включаемых файлах заведомый мусор.
Результат - первой показывается ошибка из файла add2.h, из чего следует, что инклюды обрабатываются в том порядке, в котором следуют в коде.
"Автоматические" неявное включение файлов в проект Ардуино ИДЕ может работать криво, поэтому, чтобы конктролировать состав и порядок включения файлов - используйте явные include
Пробовал на Ардуино ИДЕ 1.8.3 Win7 x64
Мне всегда казалось что #include может стоять в любом месте программы и подключать любой файл с любым содержимым. Хоть пару строк текста. И совсем не обязательно *.c *.h . T.e. вместо #include "файл" можно вставить его содержимое и резльтат не должен измениться. По крайней мере у меня так работает на поседней версии .
Формально да - директива #include подключает содержимое файла в то место, в котором описана. Просто это одна из парадигм языка - разделять объявления и определения, так архитектурно правильней. Объявления обычно располагаются в *.h-файлах. Но в исходном файле может быть сразу и объявление и определение, тот же STL - там в одном файле имплементация шаблонных классов, поэтому нет необходимости держать ещё и *.cpp-файл - всё описано в одном файле.
Но лично мне разделение на *.h и *.cpp нравится - всегда можно посмотреть интерфейсы, не копаясь в реализации. Скажем, в С# при большом объёме исходников - некоторый секс, чтобы понять, что к чему.
Уважаемые гуру, я тут новенький, и вот по какому вопросу.
Можно ли этой замечательной директивой вставить не С-код, а массив байтов из определённого файла? Щас поясню.
Вот мне надо залить прошивку в AT89S2051, я использую скетч, который превращает ардуинку в ISP программатор. В тексте скетча описан массив байтов, количеством равным размеру прошивки. Понятно, что если надо прошить другую прошивку, то весь этот массив надо перебивать ручками (напоминает набор программ по журналу "Радио" в конце 80-х )). Было бы удобней, если бы в скетче с помощью #include или как-то ещё подхватывался файл (в идеале - .bin формата) из папки скетча. Возможно ли такое??
Быстрее было попробовать, чем писать всё это...
Компилятору всё равно, что лежит в текстовом файле, который подключается через #include - лишь бы там был синтаксис честного Си.
Спасибо. А как прикрутить BIN файл?
Напрямую к Си-коду - никак.
Напрямую к Си-коду - никак.
Кто же знает, как вам проще. Вопрос был об #include, а не нахождении способа зашить МК с помощью другого МК.
Вопрос был об #include
Спасибо. А как прикрутить BIN файл?
если BIN не очень большой - можно сконвертить его текстовое представление и подключить как массив байт. Например, так подключают шрифты в экранных библиотеках.
если BIN не очень большой - можно сконвертить его текстовое представление и подключить как массив байт. Например, так подключают шрифты в экранных библиотеках.
Ровно так же, как вы делаете сейчас - см ниже.
В тексте скетча описан массив байтов, количеством равным размеру прошивки. Понятно, что если надо прошить другую прошивку, то весь этот массив надо перебивать ручками
только массив кладете в отдельный файл. Посмотрите, как устроены файлы шрифтов.
Но перебирать файл "ручками" в массив все равно придется. Или написать отдельную программу на ПК для этого. Если для линукса могу вам набросать код, превращающий бинарник в массив в сформате Си.
Более-менее понятно, надо пробовать. Я просто думал, что уже есть какие-то конверторы BIN-to-ASCII.TXT
(Вобще, в Си довольно странный синтаксис, ИМХО...)
Я просто думал, что уже есть какие-то конверторы BIN-to-ASCII.TXT
вполне возможно, что есть. Стоит поискать в Гугле. Во всяком случае BIN в HEX точно есть, а там и до массива уже недалеко.
Но вообще более правильный путь - не запихивать прошивку в исходник (в любом виде) - а. к примеру, передавать ее на Ардуину с компа по Сериал. Так собственно, и делает скетч Arduino_as_ISP. Возьмите его как образец и напишите для своего программатора аналогичный.
Да ладно вам, прямо так и "нет". Вполне себе ЕСТЬ. Библиотекарь в системе гнусей зачем прилепден, ась? :)
Вам это тоже не подойдет, да и доступнее - много сложнее, чем Вам кажется. В общем, процесс несколько сложнее чем просто "кумпиляцыя" скетча. Там апосля компилятыра работает ещё "сборщик" окончательного кода программы, который собирает все неразобранные имена и назначает окончательные адреса. Вот ему, теоретически и можно подсунуть "готовый" (бинарник) или "полуготовый" (библиотеку) файлик. Главное грамотно "заяснить" что куда и в какой последовательности пришивать надо при сборке. И да, на этом песня не заканчивается. Там после него ещё преобразователь в файл-заливки работает. Тот самый, что HEX формат знает как сбацать.
В общем, это было просто возражение на то что "способа нет" - есть, но Вам оно не под силу. И вооще, на сегодня мало кому под силу... (таких думаю по пальцам на одной руке на весь программисткий бомонд)
Arhat109-2, вот зачем вы человеку голову засераете. На больших машинах некоторые библиотеки хранятся в бинарниках. Их уже не надо компилировать, а просто загрузить в ОЗУ и запустить. Замечательно. Но 1- бинарные файлы надо хранить на диске или на карточке. 2- иметь достоточно ОЗУ для загрузки 3- иметь в ядре загрузчик и выгрузчик. Можно было напрямую грузить во Флеш память при компиляции. А это заранее забивать память кодом который может пригодиться, а может нет, но память потратится. Вот по этой причине и отказались от подключаемых bin файлов.
Я не про dll писал. А про как раз подключаемые файлы, которые ваша Ардуинка и так подключает при каждой компиляции, предварительно формируя из искодников ту самую служебную библиотеку в бинарниках. Да, они "относительные" бинарники, но никто не мешает подключить точно также сборщиком и асболютный, если его грамотно расписать линковщику. Вся эта "анаконда" запускается каждый раз и строго последовательно:
"посроитель Ардуино", "препроцессор", "кумпилятыр", "библиотекарь", "линковщик", "заливальщик в дуню" .. мож кого и пропустил по склерозу.
Никто не мешает вклинить в цепочку на любой стадии свое произведение в соответствующей стадии готовности. #include - просто типовой способ через "препроцессор", но и только.