![]()  | 
	
| 
			
			 | 
		#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 deglucker@list.ru посмотрю дисассемблером. Кстати, как в IDE можно получить удобочитаемый ассемблерный листинг ? Я пользуюсь IDA-PRO 6.5, но он некорректно отображает ссылки на переменные.  | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
		
			
		
		
		
	 | 
| 
			
			 | 
		#70 | 
| 
			
			 Senior Member 
			
			
			
			Регистрация: 14.06.2015 
				Адрес: СССР 
				
				
					Сообщений: 122
				 
				
				
				Вес репутации: 0 ![]()  | 
	
	
	
		
		
			
			 
			
			А-а-а... забыл указать, что закомментил в arhat.h переопределение 
		
		
		
		
		
		
		
	#define millis() time-millis() Извините уж.  
		 | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
		
			
		
		
		
	 | 
![]()  | 
	
	
		
| Метки | 
| arduino mega 2560, скетч, ардуино | 
| Здесь присутствуют: 4 (пользователей: 0 , гостей: 4) | |
		
  | 
	
		
  |