Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.01.2016, 16:55   #61
DeGlucker
Junior Member
 
Регистрация: 04.12.2015
Сообщений: 14
Вес репутации: 0
DeGlucker is an unknown quantity at this point
По умолчанию Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.

Пытаюсь подружить библиотеку с классом 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 кучу ошибок выдает ассемблер.
DeGlucker вне форума   Ответить с цитированием
Старый 02.01.2016, 20:17   #62
Arhat109
Senior Member
 
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0
Arhat109 is an unknown quantity at this point
По умолчанию Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.

Давайте по-порядку.
Версия библиотеки, которую пытаетесь подружить со Stream? Какие глюки начинаются при прямом подключении?

Во всех версиях моей либы millis() существенно отличается от типовой версии:
1. Она возвращает uint16_t вместо uint32_t то есть 16-разрядное целое вместо длинного целого;
2. Используется прямой пересчет счетчика переполнения таймера через целочисленную арифметику вместо учета накопления расхождений и подстчета миллисекунда "скачками". Этот удлиняет вызов, но не приводит к "провалам" в подсчете времени.

Версию ИДЕ 1.6.7 я ещё вообще не выкачивал. На неё слишком много нареканий в Сети.

Ну и насколько помню, класс Serial компилялся и работал с библиотекой устойчиво. Выкладывайте глюки по-порядку, попробую воспроизвести ситуацию на 1.6.4, 1.6.5.
Arhat109 вне форума   Ответить с цитированием
Старый 03.01.2016, 17:31   #63
DeGlucker
Junior Member
 
Регистрация: 04.12.2015
Сообщений: 14
Вес репутации: 0
DeGlucker is an unknown quantity at this point
По умолчанию Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.

Спасибо, что так быстро ответили, сейчас выходные и есть возможность заняться экспериментами.

Библиотека 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);
  }
}
DeGlucker вне форума   Ответить с цитированием
Старый 05.01.2016, 17:45   #64
Arhat109
Senior Member
 
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0
Arhat109 is an unknown quantity at this point
По умолчанию Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.

Посмотрел. Надо отключать wiring.c через его переименование. Дополнительно, раз уж Stream.h требует millis(), создать функцию-обертку, типа так:

Код:
unsigned long millis()
{
    return (unsigned long)time_millis();
}
Я задавал этот вопрос разработчикам Wiring "как отключать их обработчик прерываний от таймера корректно?". К сожалению, никакого вразумительного ответа я тоже не получил.

Можно отключать мой обработчик прерываний, но это тоже несколько гемморойно. На самом деле, если хотите уменьшать размеры скетчей от wiring надо отказываться "совсем". Сам только так и поступаю.
Arhat109 вне форума   Ответить с цитированием
Старый 05.01.2016, 20:04   #65
DeGlucker
Junior Member
 
Регистрация: 04.12.2015
Сообщений: 14
Вес репутации: 0
DeGlucker is an unknown quantity at this point
По умолчанию Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.

Мне как раз и надо отказаться "совсем" от 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(),
только куда бы его всунуть ?

Спасибо за сотрудничество.
DeGlucker вне форума   Ответить с цитированием
Старый 05.01.2016, 21:14   #66
Arhat109
Senior Member
 
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0
Arhat109 is an unknown quantity at this point
По умолчанию Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.

Ни чего не понял .. каким боком это все вылазит?!?

Ща, попробую понять что происходит. Пока - выкачайте с гитхаба последний релиз, там есть правка обработчика прерывания таймера, но это "ни о чем"...
Arhat109 вне форума   Ответить с цитированием
Старый 05.01.2016, 21:49   #67
Arhat109
Senior Member
 
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0
Arhat109 is an unknown quantity at this point
По умолчанию Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.

Так,
с п.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.
Arhat109 вне форума   Ответить с цитированием
Старый 05.01.2016, 21:54   #68
Arhat109
Senior Member
 
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0
Arhat109 is an unknown quantity at this point
По умолчанию Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.

В целом, как итого: wiring.c - таки требуется переименовывать.
Arhat109 вне форума   Ответить с цитированием
Старый 06.01.2016, 21:12   #69
DeGlucker
Junior Member
 
Регистрация: 04.12.2015
Сообщений: 14
Вес репутации: 0
DeGlucker is an unknown quantity at this point
По умолчанию Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.

Для чистоты эксперимента скачал версию 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, но он некорректно отображает ссылки на переменные.
DeGlucker вне форума   Ответить с цитированием
Старый 07.01.2016, 10:23   #70
Arhat109
Senior Member
 
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0
Arhat109 is an unknown quantity at this point
По умолчанию Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.

А-а-а... забыл указать, что закомментил в arhat.h переопределение

#define millis() time-millis()

Извините уж.
Arhat109 вне форума   Ответить с цитированием
Ответ

Метки
arduino mega 2560, скетч, ардуино


Здесь присутствуют: 3 (пользователей: 0 , гостей: 3)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 06:23. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика