![]() |
![]() |
#61 |
Junior Member
Регистрация: 04.12.2015
Сообщений: 14
Вес репутации: 0 ![]() |
![]()
Пытаюсь подружить библиотеку с классом Stream, вызываю Serial.parseInt(), которая использует millis().
начинаются глюки: 1. из-за конфликта переименовываю wiring.c - не находит millis(), хотя есть #define millis() time_millis() 2. в arhat.c переименовываю time_millls() в millis(), корректирую arhat.h - вылетает по ошибке линкер ld.exe (ошибка 5 доступа к памяти). 3. создаю в arhat.c пустую функцию millis() - эффект тотже. Непонятно, чем отличается функция в arhat от функции в wiring. IDE 1.6.5 под винду. в IDE 1.6.7 вообще не компилируется, сплошные ошибки, в версии 1.0.5 кучу ошибок выдает ассемблер. |
![]() |
![]() |
![]() |
#62 |
Senior Member
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0 ![]() |
![]()
Давайте по-порядку.
Версия библиотеки, которую пытаетесь подружить со Stream? Какие глюки начинаются при прямом подключении? Во всех версиях моей либы millis() существенно отличается от типовой версии: 1. Она возвращает uint16_t вместо uint32_t то есть 16-разрядное целое вместо длинного целого; 2. Используется прямой пересчет счетчика переполнения таймера через целочисленную арифметику вместо учета накопления расхождений и подстчета миллисекунда "скачками". Этот удлиняет вызов, но не приводит к "провалам" в подсчете времени. Версию ИДЕ 1.6.7 я ещё вообще не выкачивал. На неё слишком много нареканий в Сети. Ну и насколько помню, класс Serial компилялся и работал с библиотекой устойчиво. Выкладывайте глюки по-порядку, попробую воспроизвести ситуацию на 1.6.4, 1.6.5. |
![]() |
![]() |
![]() |
#63 |
Junior Member
Регистрация: 04.12.2015
Сообщений: 14
Вес репутации: 0 ![]() |
![]()
Спасибо, что так быстро ответили, сейчас выходные и есть возможность заняться экспериментами.
Библиотека AVR_LIB_AUTOMAT-master от 24.12.2015. При прямом подключении конфликт с __vector_16, timer0_overflow_count. После переименования wiring.c - d:\arduino16\hardware\arduino\avr\cores\ arduino/Stream.cpp:47: undefined reference to `millis' то есть #define millis() time_millis() не срабатывает. IDE 1.6.5, Windows XP Код:
#include "arhat.h" void setup() { Serial.begin(115200); Serial.setTimeout(20); } void loop() { if (Serial.available() > 0) { int i = Serial.parseInt(); char c = Serial.parseInt(); Serial.print(i); Serial.print(" "); Serial.println(c); } } |
![]() |
![]() |
![]() |
#64 |
Senior Member
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0 ![]() |
![]()
Посмотрел. Надо отключать wiring.c через его переименование. Дополнительно, раз уж Stream.h требует millis(), создать функцию-обертку, типа так:
Код:
unsigned long millis() { return (unsigned long)time_millis(); } Можно отключать мой обработчик прерываний, но это тоже несколько гемморойно. На самом деле, если хотите уменьшать размеры скетчей от wiring надо отказываться "совсем". Сам только так и поступаю. |
![]() |
![]() |
![]() |
#65 |
Junior Member
Регистрация: 04.12.2015
Сообщений: 14
Вес репутации: 0 ![]() |
![]()
Мне как раз и надо отказаться "совсем" от wiring, нужна скорость и размеры.
Начинаю эксперименты: 1. вставил в скетч функцию-обертку, результат: Arhat\arhat.c.o: In function `time_millis': d:\arduino16\libraries\Arhat/arhat.c:141: multiple definition of `time_millis' TEST.cpp.o:d:\arduino16/TEST.ino:21: first defined here полный бред, time_millis никаким боком не присутствует ни в скетче, ни в библиотеках arduino. кстати в arhat.h uint32_t time_millis(void); // milliseconds upto 49.7 days так что приведения типов не требуется, без него та же ошибка. 2. закомментировал в arhat.h #define millis() time_millis() в скетче оставил unsigned long millis() { return time_millis(); } результат: D:\arduino16\build/core.a(Stream.cpp.o): In function `Stream::timedPeek()': d:\arduino16\hardware\arduino\avr\cores\ arduino/Stream.cpp:47: undefined reference to `millis' 3. пробовал перенести строку #define millis() time_millis() в arduino.h, Stream.h результат: undefined reference to `millis' Все проблемы бы решились переопределением millis() в time_millis() или даже в getOvfCount(), только куда бы его всунуть ? Спасибо за сотрудничество. |
![]() |
![]() |
![]() |
#66 |
Senior Member
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0 ![]() |
![]()
Ни чего не понял .. каким боком это все вылазит?!?
![]() Ща, попробую понять что происходит. Пока - выкачайте с гитхаба последний релиз, там есть правка обработчика прерывания таймера, но это "ни о чем"... |
![]() |
![]() |
![]() |
#67 |
Senior Member
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0 ![]() |
![]()
Так,
с п.1 - понятно. Сработал #define из arhat.h: втыкнутая функция millis() переопределилась в time_millis() согласно ему. Вот их и стало 2 штуки. Фигово. Ибо втыкать функцию "до" include "arhat.h" - нельзя. ИДЕ в этом разе вставит первой строкой свой инклуд, и тогда посыплется то, за что боролись: отключить вызов #include "Arduino.h"... с п.2 - тоже понятно: функция millis(){ return time_millis(); } должна быть заключена в скобки extern "C" { } в скетче. С и С++ названия функций различаются линкером. Заверните в ino файле объявление в эту скобку и будет вам "щастье". ![]() п.3. - незачем. P.S. на самом деле, грустно. Надо плотнее разбираться с wiring ... каким боком он подключает свое прерывание из классов stream и print - для меня осталось загадкой. Я не переименовываю wiring.c и у меня все примеры компиляются без конфликта прерываний .. не знаю "почему так". Версия ИДЕ 1.6.4. А вот ваш пример, таки заставил его перименовать, иначе воспроизводится ошибка с двойным определением прерывания... как это возможно? Вот так пример собирается линкером без вопросов: Код:
#include "arhat.h" extern "C" { unsigned long millis(){ return time_millis(); } } void setup() { Serial.begin(9600); Serial.setTimeout(20); } void loop() { if (Serial.available() > 0) { int i = Serial.parseInt(); char c = Serial.parseInt(); Serial.print(i); Serial.print(" "); Serial.println(c); } } Последний раз редактировалось Arhat109; 05.01.2016 в 21:52. |
![]() |
![]() |
![]() |
#68 |
Senior Member
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0 ![]() |
![]()
В целом, как итого: wiring.c - таки требуется переименовывать.
|
![]() |
![]() |
![]() |
#69 |
Junior Member
Регистрация: 04.12.2015
Сообщений: 14
Вес репутации: 0 ![]() |
![]()
Для чистоты эксперимента скачал версию 1.6.4.
Библиотека AVR_LIB_AUTOMAT-master от 24.12.2015. Wiring.c переименован. Скетч из предыдущего поста. Результат: Arhat\arhat.c.o: In function `time_millis': d:\arduino164\libraries\Arhat/arhat.c:141: multiple definition of `time_millis' TEST.cpp.o:d:\arduino164/TEST.ino:3: first defined here D:\arduino16\build/core.a(Stream.cpp.o): In function `Stream::timedPeek()': d:\arduino164\hardware\arduino\avr\cores \arduino/Stream.cpp:47: undefined reference to `millis' ... Полный БРЕД Если у вас собирается, пришлите, пожалуйста, TEST.cpp.elf из папки bulld на e-mail [email protected] посмотрю дисассемблером. Кстати, как в IDE можно получить удобочитаемый ассемблерный листинг ? Я пользуюсь IDA-PRO 6.5, но он некорректно отображает ссылки на переменные. |
![]() |
![]() |
![]() |
#70 |
Senior Member
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0 ![]() |
![]()
А-а-а... забыл указать, что закомментил в arhat.h переопределение
#define millis() time-millis() Извините уж. ![]() |
![]() |
![]() |
![]() |
Метки |
arduino mega 2560, скетч, ардуино |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|
|