Что я должен знать при создании библиотеки для Arduino?


8

Мне приходит в голову, что, помимо моей нынешней проблемы, я должен спросить: «Что я должен знать при создании библиотеки для Arduino?»

Во-первых, что я делаю:

Я использую Eclipse в качестве редактора и пишу код на C ++. Я написал простое приложение Arduino, которое включает в себя мой заголовочный файл, и я работаю из-за ошибок.

Первая проблема: как мне сделать «сборку чистой»? Я вижу ошибки, которые, я думаю, я исправил, почти как если бы файл заголовка был кэширован. (Да, вполне вероятно, что я делаю что-то глупое [ править : я был], но я все еще хотел бы знать, как очистить библиотеку, и не знаю, где находятся объектные файлы).

Во-вторых: какие соглашения я должен знать? Я не использовал Arduino так часто, как хотел бы, и мне так приятно программировать на C ++, но я знаю, что цель библиотек - сделать вещи удобными и простыми для пользователей. Существуют ли соглашения для имен функций? Создание констант (похоже, что глобальное пространство имен загрязнено #defines)? И так далее.

Наконец, есть что-нибудь еще, что я должен знать?

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


1
Вы пробовали Arduino IDE и отказались от него? Я знаю, что, учитывая общий набор функций производительности программиста в Eclipse-as-IDE, Arduino-IDE выцветает. Однако в этой ситуации, если вы еще не пробовали Arduino-IDE, вы можете сделать это. Хотя я нахожу это вялым, но явная перекомпиляция работает так же, как и должна.
icarus74

Ответы:


3

Я сделаю удар. Я не писал код для Arduino, но я много занимался программированием на C и C ++. Было бы полезно, если бы я на самом деле видел ваши ошибки, но тем не менее.

Главное, что вам нужно всегда помнить при использовании C ++ с кодом C, это то, что вашему коду C ++ нужны функции, объявленные с помощью "extern" C "", если вы хотите, чтобы код C мог ссылаться на код C ++. "Extern" C "" - это то, что говорит компилятору C ++, что я создаю связываемый код для файлов C или использую код из файлов C. Поэтому все ваши функции в заголовке API библиотеки должны соотноситься с функцией в исходном файле, определенной как «extern» C «void dosomething ()». Если вы пытаетесь использовать классы в C ++, помните, что код C не может вызвать его, вам нужно создать функции (extern "C") для доступа к объекту. Теперь, если ваш код на C скомпилирован с помощью компилятора C ++, не беспокойтесь о "extern" C "".

Если вы хотите вызывать C-код внутри вашего C ++-кода, вам нужно обернуть C-заголовок такой конструкцией:

#ifdef ___cplusplus
extern "C" {
#endif

///all my C function declarations... yada yada

#ifdef __cplusplus
}  //end extern "C"
#endif

Если вы работаете в C ++, не используйте много #defines, если вы не создаете флаги времени компиляции, такие как "DEBUG" или "VERSION2", для создания специальных наборов кода. В противном случае используйте «const int / char / float» для определения числа для безопасной проверки типов. Компиляторы обычно достаточно умны, чтобы оптимизировать их, поэтому они оказываются в пространстве ПЗУ / кода (хотя и зависит). Также не создавайте MACROS, используйте встроенные функции. Кроме того, не всегда следуйте соглашению при программировании, если это глупо, например, с использованием большого количества макросов и определений чисел в C ++. То же самое относится к C99-версии C, в нее добавлены такие вещи, как встроенные функции и константы из C ++. Индустрия понимает, сколько глючного и сложного в обслуживании кода происходит из-за чрезмерного использования языка препроцессора.

Eclipse обычно хранит файлы obj в каталоге вашего проекта. Если вы делаете сборку «Debug», то она находится в папке «Debug» в папке вашего проекта. Если вы делаете сборку "Release", посмотрите в разделе "Release" и т. Д. Обычно в Eclipse у меня работает чистая сборка, поэтому я не знаю, что не так с вашей настройкой. Я думаю, убедитесь, что вы не создаете предварительно скомпилированные заголовки.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.