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

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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.11.2014, 10:34   #1
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9821
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: Ускоряем работу Arduino

Если используем тип uint16_t, то нужно делить на 2, потому как sizeof возвращает размер массива не в колличестве элементов , а в байтах. Если используем тип uint8_t, то делить не нужно
Admin вне форума   Ответить с цитированием
Старый 05.11.2014, 12:34   #2
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9821
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: Ускоряем работу Arduino

Спасибо!
Плюсанул
Admin вне форума   Ответить с цитированием
Старый 05.11.2014, 20:39   #3
4eyes
Junior Member
 
Регистрация: 05.11.2014
Сообщений: 1
Вес репутации: 0
4eyes is an unknown quantity at this point
По умолчанию Re: Ускоряем работу Arduino

Предлагаю выложить библиотеку на публичный хостинг типа гитхаба с целью предоставления сообществу возможности слать pull-реквесты с фиксами и предложениями.
4eyes вне форума   Ответить с цитированием
Старый 06.11.2014, 00:24   #4
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9821
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: Ускоряем работу Arduino

Для меня это темный лес.
В том смысле что я никогда не пользовался и не представляю как им пользоваться
Admin вне форума   Ответить с цитированием
Старый 22.11.2014, 08:33   #5
HiddenPilot
Member
 
Регистрация: 07.03.2013
Сообщений: 75
Вес репутации: 0
HiddenPilot is an unknown quantity at this point
По умолчанию Re: Ускоряем работу Arduino

Admin,
Скоро придет экран с контроллером тача XPT2046 , в сети есть либа Utouch, она работает софтварным дерганьем ног. Есть задумка переделать либу на SPI.
Но судя по даташиту(стр26), передавать команду на считывание следующей координаты(X,Y,Z) можно параллельно с приемом текущей координаты. Что позволит сократить "сеанс связи с 8+16bit=24bit до 16 бит.
Если функцию viod SendSPI(uint8_t SPI_data), переделать по аналогии с Spi.transfer, т.е. добавить "return SPDR", а так же "void" заменить на "uint8_t", то все преимущество в ускорении, я так понимаю, потеряется ?
HiddenPilot вне форума   Ответить с цитированием
Старый 21.11.2014, 19:01   #6
HiddenPilot
Member
 
Регистрация: 07.03.2013
Сообщений: 75
Вес репутации: 0
HiddenPilot is an unknown quantity at this point
По умолчанию Re: Ускоряем работу Arduino

Настоятельно рекомендую включить данную конструкцию в Либу!
Данным подходом, полностью решена проблема перенастраиваемых дефайнами пинов.
Т.е. данную конструкцию можно использовать аналогично с digitalRead(pin), при чем абсолютно не теряя в скорости ни одного такта.

Поверял след скетчем (Софтварное считывание 32битного значения АЦП)

Код:
#include "CyberLib.h"

#define _D_In(x) D##x##_In
#define D_In(x) _D_In(x)
#define _D_Out(x) D##x##_Out
#define D_Out(x) _D_Out(x)
#define _D_High(x) D##x##_High
#define D_High(x) _D_High(x)
#define _D_Low(x) D##x##_Low
#define D_Low(x) _D_Low(x)
#define _D_Inv(x) D##x##_Inv
#define D_Inv(x) _D_Inv(x)
#define _D_Read(x) D##x##_Read
#define D_Read(x) _D_Read(x)

#define ADC_CLK_Pin 13
#define ADC_DATA_Pin 6


union AdcType{
    uint32_t data32; 
    uint8_t data8[4];
  };
  
uint32_t startT = 0;
uint16_t dur =0;

void setup()
{
  Serial.begin(9600);
  D13_Out;
  D6_In;
  readAdcFast32bitVAR();  //REAL read uint32_t data  1207kHz = 13.25 (-0.25)= 13 cycles/bit 
  readAdcFast32bitFix();  //REAL read uint32_t data  1207kHz = 13.25 (-0.25)= 13 cycles/bit 

}

void readAdcFast32bitFix()
{
  AdcType adc;
  startT = micros();
  for (byte k=0;k<100;k++){   
   ///+++++++++++++++++++++++++++++++++++++++++++++++++
    for (byte j=3;j!=255;j--){   
      for (byte i=0;i<8;i++){   
        D13_High;
        adc.data8[j]<<=1;
        D13_Low;
        if (D6_Read) {adc.data8[j]++;}
      }
    } 
    //--------------------------------------------------
  }
  dur = micros()-startT;
  Serial.println(dur);
  Serial.println(adc.data32); //чтобы не оптимизировал считывание в adc.data
}

void readAdcFast32bitVAR()
{
  AdcType adc;
  startT = micros();
  for (byte k=0;k<100;k++){   
    ///+++++++++++++++++++++++++++++++++++++++++++++++++
    for (byte j=3;j!=255;j--){   
      for (byte i=0;i<8;i++){   
        D_High(ADC_CLK_Pin);
        adc.data8[j]<<=1;
        D_Low(ADC_CLK_Pin);
        if (D_Read(ADC_DATA_Pin)) {adc.data8[j]++;}
      }
    } 
    //--------------------------------------------------
  } 
  dur = micros()-startT;
  Serial.println(dur);
  Serial.println(adc.data32); //чтобы не оптимизировал считывание в adc.data
}

void loop(){}
в обоих вариантах 2660 мкс на 100 замеров
Скорость считывания 1203кГц/байт
на считывание 1 байта тратится 13 тактов.

Последний раз редактировалось HiddenPilot; 10.12.2014 в 22:37.
HiddenPilot вне форума   Ответить с цитированием
Старый 21.11.2014, 19:10   #7
HiddenPilot
Member
 
Регистрация: 07.03.2013
Сообщений: 75
Вес репутации: 0
HiddenPilot is an unknown quantity at this point
По умолчанию Re: Ускоряем работу Arduino

Про использование Оператора ## в теле макроса можно прочитать тут. Очень не сложный в освоении оператор и при этом достаточно полезный.
HiddenPilot вне форума   Ответить с цитированием
Старый 22.11.2014, 11:09   #8
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9821
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: Ускоряем работу Arduino

Вот вырезал из библиотеки фунуфию чтения и отправки данных
PHP код:
uint8_t ReadSPI(void
{
    while(!(
SPSR & (1<<SPIF)));
    return 
SPDR;
}

void SendSPI(uint8_t SPI_data
{
  
SPDR SPI_data;
  while(!(
SPSR & (1<<SPIF)));            

Там же есть функция отправки данных, как раз для тебя на ASM-е
Вот этот код реально работает быстрее, но
я его закоментирова, так как не все устройства успевают переходить в режим готовности

PHP код:
    __asm__ volatile
             
(
             
".spi_not_ready: out %[spdr], %[spi_data]"    "\n\t" //отправляем пользовательские данные в SPI
             
"in __tmp_reg__,%[spsr]"                "\n\t"    //Читаем регистр SPSR
            
"sbrs __tmp_reg__, %[spif]"                "\n\t"    //и проверяем флаг SPIF
            
"rjmp .spi_not_ready"                    "\n\t"    //если данные не отправлены повторяем процедуру
             
::
            [
spsr"I" (_SFR_IO_ADDR(SPSR)),
            [
spif"I" (SPIF),
            [
spdr"I" (_SFR_IO_ADDR(SPDR)),
            [
spi_data"r" (SPI_data)
             ); 
Admin вне форума   Ответить с цитированием
Старый 25.11.2014, 10:57   #9
HiddenPilot
Member
 
Регистрация: 07.03.2013
Сообщений: 75
Вес репутации: 0
HiddenPilot is an unknown quantity at this point
По умолчанию Re: Ускоряем работу Arduino

Цитата:
Сообщение от Admin Посмотреть сообщение
Вот вырезал из библиотеки фунуфию чтения и отправки данных

Там же есть функция отправки данных, как раз для тебя на ASM-е
Вот этот код реально работает быстрее, но
я его закоментирова, так как не все устройства успевают переходить в режим готовности

PHP код:
    __asm__ volatile
             
(
             
".spi_not_ready: out %[spdr], %[spi_data]"    "\n\t" //отправляем пользовательские данные в SPI
             
"in __tmp_reg__,%[spsr]"                "\n\t"    //Читаем регистр SPSR
            
"sbrs __tmp_reg__, %[spif]"                "\n\t"    //и проверяем флаг SPIF
            
"rjmp .spi_not_ready"                    "\n\t"    //если данные не отправлены повторяем процедуру
             
::
            [
spsr"I" (_SFR_IO_ADDR(SPSR)),
            [
spif"I" (SPIF),
            [
spdr"I" (_SFR_IO_ADDR(SPDR)),
            [
spi_data"r" (SPI_data)
             ); 
Может её оформить как "uint8_t TransferSPI(uint8_t SPI_data)" ?

А как на счет включения в либу выше приведенных макросов для автоподстановки номера pin'а (D##x##_) ?
HiddenPilot вне форума   Ответить с цитированием
Старый 25.11.2014, 12:00   #10
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9821
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: Ускоряем работу Arduino

Цитата:
Сообщение от HiddenPilot Посмотреть сообщение
А как на счет включения в либу выше приведенных макросов для автоподстановки номера pin'а (D##x##_) ?
Включу

Цитата:
Может её оформить как "uint8_t TransferSPI(uint8_t SPI_data)" ?
Что бы окончательно запутать новичков
Admin вне форума   Ответить с цитированием
Ответ


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

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

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

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


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


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