Перевожу проект с Си на Ардуино
- Войдите на сайт для отправки комментариев
Втр, 25/08/2015 - 15:26
Привет всем!
Сейчас занимаюсь тем, что перевожу один из своих проектов, написанный в Visual Studio с GCC компилятором, для Меги328, на платформу Ардуино 32 бита. Плата Arduino Due.
Пара десятков С и h- файлов. Столкнулся с гемороем видимости глобальных переменных и функций в разных файлах.
Для начала сохранил файл проекта ino в удобном для себя месте. Туда же кинул один С-файл и его заголовочный h-файл, отвечающие за индикацию на семисегментниках - display.c display.h
Добавил их в проект.
В этих файлах прописал #include <Arduino.h>
В главном файле проекта прописал #include "display.h"
Вроде все нормально. Компилится.
Но когда я в главном файле объявил глобальную переменную bBlinkON, а в display.c объявил ее как extern, получил ошибку компилятора, что переменная не видна.
display.c: In function 'DisplayRefresh':
display.c:120: error: 'bBlinkON' undeclared (first use in this function)
Подскажите пожалуйста для начала, как правильно пользоваться глобальными переменными?
Заранее благодарю
Сам себе отвечу.
Нашел выход в том, что каждую пару файлов *.c и *.h оформляю в виде отдельной библиотеки и подключаю к проекту. Приходится сишный код переводить в С++. Надеюсь, что кто-нибудь все же подскажет более простое решение.
Если у кого-то есть примеры многофайловых проектов, буду очень рад
http://arduino.ru/forum/obshchii/status-master#comment-107541
В .h файлах нужно использовать слово extern при описании функций и переменных
Попробую. Спасибо
Меня несколько смутила фраза "Приходится сишный код переводить в С++". Должно практически один в один компилироваться. Мы раньше на одном из С проектов так практиковали, компилировали С++ компилятором и смотрели предупреждения, находили таким образом не совсем "корректный" код, впрочем, скорее подчищали.
Я сейчас из каждой пары *.c и *.h делаю библиотеки. Так работает. И доступ ко всем public-переменным нормальный.
Ранее весть проект был написан на чистом С, под другой проц, и не был связан с оболочкой Ардуино
Приходится сишный код переводить в С++.
Совсем не обязательно. Либки на С - как набор функций а не класс подхватывает на ура.
Зачем делать кучу ненужных библиотек? Вопрос риторический и ответ мне не нужен.
И ещё С для любого контроллера останется С. Я про чистый С о котором Вы упоминаете.
Ок,вопрос решён , удачи
Согласен стопроцентно! Просто на тот момент другого решения у меня не было.
//this is test_prj.ino #include "MyFile.h" void setup() { Init(); } void loop() { }// this is MyFile.c #include <Arduino.h> #include "MyFile.h" void Init( void ) { pinMode( 13, OUTPUT ); }У Вас опять туз в кармане? В прошлый раз это был Due, а теперь какой сюрприз?
1. Создал новый скетч, вставил в него Ваш текст. Сохранил проект с именем test_prj
2. Закрыл ArduinoIDE
3. Создал в папке проекта test_prj два файла MyFile.cpp & MyFile.h и скопировал в них Ваш текст.
4. Открыл ArduinoIDE и проект test_prj.
5. Скомпилировал без ошибок.
Для того, чтобы к этому не возвращаться, это компилируется как для Due, так и для Uno.
Проверил карманы, тузов нет. Может какие-то демоны испытыват меня?
шутка
Сюрпризов нет, тот же Due
Закрыл ArduinoIDE, открыл заново. Откомпилил - ворнинг остался
Перевел на Uno - то же самое
Не пойму. Должно быть все просто
наверное , тузы не в карманах ? а в рукавах !
....у соседа такая же проблема - результатов исправления = 0
:(
Я создавал файл с расширением cpp, не удивлюсь, если в этом проблема.
Так вот где собака порылась!
У меня был с-файл. Поменял на cpp и все заработало!
kisoft, спасибо огромное!
У C++ и у С разные имена функций, точнее по разному формируются, потому, если модуль С, то нужно его объявлять как extern "C" void Init(void);
Компиляторы часто определяют по расширению, использование С или С++ компиляции.