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

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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.12.2014, 08:53   #1
HiddenPilot
Member
 
Регистрация: 07.03.2013
Сообщений: 75
Вес репутации: 0
HiddenPilot is an unknown quantity at this point
По умолчанию Re: Maple Mini

По просьбам трудящихся, кусок кода для CyberLib.h

PHP код:
#if defined(__STM32F1XX__)
//+++++++++Token-Pasting++++++++++++++++
#define _digitalRead(x) _D_READ(x)
#define _D_READ(x) dREAD_D##x

#define _digitalWrite(x,hl) _D_WRITE(x,hl)
#define _D_WRITE(x,hl) dWRITE_D##x##_##hl
//---------Token-Parsing----------------

// Fast bit read
#define dREAD_D32 gpio_read_bit(GPIOB,8)>>8 //(GPIOB->regs->IDR&(1U<<8)>>8)
#define dREAD_D31 gpio_read_bit(GPIOB,12)>>12
#define dREAD_D30 gpio_read_bit(GPIOB,13)>>13
#define dREAD_D29 gpio_read_bit(GPIOB,14)>>14
#define dREAD_D28 gpio_read_bit(GPIOB,15)>>15
#define dREAD_D27 gpio_read_bit(GPIOA,8)>>8
#define dREAD_D26 gpio_read_bit(GPIOA,9)>>9
#define dREAD_D25 gpio_read_bit(GPIOA,10)>>10
#define dREAD_D24 gpio_read_bit(GPIOA,11)>>11
#define dREAD_D23 gpio_read_bit(GPIOA,12)>>12
#define dREAD_D22 gpio_read_bit(GPIOA,13)>>13
#define dREAD_D21 gpio_read_bit(GPIOA,14)>>14
#define dREAD_D20 gpio_read_bit(GPIOA,15)>>15
#define dREAD_D19 gpio_read_bit(GPIOB,03)>>03
#define dREAD_D18 gpio_read_bit(GPIOB,04)>>04
#define dREAD_D17 gpio_read_bit(GPIOB,05)>>05
#define dREAD_D16 gpio_read_bit(GPIOB,06)>>06
#define dREAD_D15 gpio_read_bit(GPIOB,07)>>07
#define dREAD_D14 gpio_read_bit(GPIOC,13)>>13
#define dREAD_D13 gpio_read_bit(GPIOC,14)>>14
#define dREAD_D12 gpio_read_bit(GPIOC,15)>>15
#define dREAD_D11 gpio_read_bit(GPIOA,00)>>00
#define dREAD_D10 gpio_read_bit(GPIOA,01)>>01
#define dREAD_D9 gpio_read_bit(GPIOA,02)>>02
#define dREAD_D8 gpio_read_bit(GPIOA,03)>>03
#define dREAD_D7 gpio_read_bit(GPIOA,04)>>04
#define dREAD_D6 gpio_read_bit(GPIOA,05)>>05
#define dREAD_D5 gpio_read_bit(GPIOA,06)>>06
#define dREAD_D4 gpio_read_bit(GPIOA,07)>>07
#define dREAD_D3 gpio_read_bit(GPIOB,00)>>00
#define dREAD_D2 gpio_read_bit(GPIOB,02)>>02
#define dREAD_D1 gpio_read_bit(GPIOB,10)>>10
#define dREAD_D0 gpio_read_bit(GPIOB,11)>>11

// Fast bit write
#define dWRITE_D33_1 GPIOB->regs->BSRR = 0x0002
#define dWRITE_D33_0 GPIOB->regs->BRR  = 0x0002
#define dWRITE_D32_1 GPIOB->regs->BSRR = 0x0100
#define dWRITE_D32_0 GPIOB->regs->BRR  = 0x0100
#define dWRITE_D31_1 GPIOB->regs->BSRR = 0x1000
#define dWRITE_D31_0 GPIOB->regs->BRR  = 0x1000
#define dWRITE_D30_1 GPIOB->regs->BSRR = 0x2000
#define dWRITE_D30_0 GPIOB->regs->BRR  = 0x2000

#define dWRITE_D29_1 GPIOB->regs->BSRR = 0x4000
#define dWRITE_D29_0 GPIOB->regs->BRR  = 0x4000

#define dWRITE_D28_1 GPIOB->regs->BSRR = 0x8000
#define dWRITE_D28_0 GPIOB->regs->BRR  = 0x8000

#define dWRITE_D27_1 GPIOA->regs->BSRR = 0x0100
#define dWRITE_D27_0 GPIOA->regs->BRR  = 0x0100

#define dWRITE_D26_1 GPIOA->regs->BSRR = 0x0200
#define dWRITE_D26_0 GPIOA->regs->BRR  = 0x0200

#define dWRITE_D25_1 GPIOA->regs->BSRR = 0x0400
#define dWRITE_D25_0 GPIOA->regs->BRR  = 0x0400

#define dWRITE_D24_1 GPIOA->regs->BSRR = 0x0800
#define dWRITE_D24_0 GPIOA->regs->BRR  = 0x0800

#define dWRITE_D23_1 GPIOA->regs->BSRR = 0x1000
#define dWRITE_D23_0 GPIOA->regs->BRR  = 0x1000            

#define dWRITE_D22_1 GPIOA->regs->BSRR = 0x2000
#define dWRITE_D22_0 GPIOA->regs->BRR  = 0x2000

#define dWRITE_D21_1 GPIOA->regs->BSRR = 0x4000
#define dWRITE_D21_0 GPIOA->regs->BRR  = 0x4000

#define dWRITE_D20_1 GPIOA->regs->BSRR = 0x8000
#define dWRITE_D20_0 GPIOA->regs->BRR  = 0x8000

#define dWRITE_D19_1 GPIOB->regs->BSRR = 0x0008
#define dWRITE_D19_0 GPIOB->regs->BRR  = 0x0008

#define dWRITE_D18_1 GPIOB->regs->BSRR = 0x0010
#define dWRITE_D18_0 GPIOB->regs->BRR  = 0x0010

#define dWRITE_D17_1 GPIOB->regs->BSRR = 0x0020
#define dWRITE_D17_0 GPIOB->regs->BRR  = 0x0020

#define dWRITE_D16_1 GPIOB->regs->BSRR = 0x0040
#define dWRITE_D16_0 GPIOB->regs->BRR  = 0x0040

#define dWRITE_D15_1 GPIOB->regs->BSRR = 0x0080
#define dWRITE_D15_0 GPIOB->regs->BRR  = 0x0080

#define dWRITE_D14_1 GPIOC->regs->BSRR = 0x2000
#define dWRITE_D14_0 GPIOC->regs->BRR  = 0x2000

#define dWRITE_D13_1 GPIOC->regs->BSRR = 0x4000
#define dWRITE_D13_0 GPIOC->regs->BRR  = 0x4000

#define dWRITE_D12_1 GPIOC->regs->BSRR = 0x8000
#define dWRITE_D12_0 GPIOC->regs->BRR  = 0x8000

#define dWRITE_D11_1 GPIOA->regs->BSRR = 0x0001
#define dWRITE_D11_0 GPIOA->regs->BRR  = 0x0001

#define dWRITE_D10_1 GPIOA->regs->BSRR = 0x0002
#define dWRITE_D10_0 GPIOA->regs->BRR  = 0x0002

#define dWRITE_D9_1 GPIOA->regs->BSRR = 0x0004
#define dWRITE_D9_0 GPIOA->regs->BRR  = 0x0004

#define dWRITE_D8_1 GPIOA->regs->BSRR = 0x0008
#define dWRITE_D8_0 GPIOA->regs->BRR  = 0x0008

#define dWRITE_D7_1 GPIOA->regs->BSRR = 0x0010
#define dWRITE_D7_0 GPIOA->regs->BRR  = 0x0010

#define dWRITE_D6_1 GPIOA->regs->BSRR = 0x0020
#define dWRITE_D6_0 GPIOA->regs->BRR  = 0x0020

#define dWRITE_D5_1 GPIOA->regs->BSRR = 0x0040
#define dWRITE_D5_0 GPIOA->regs->BRR  = 0x0040

#define dWRITE_D4_1 GPIOA->regs->BSRR = 0x0080
#define dWRITE_D4_0 GPIOA->regs->BRR  = 0x0080

#define dWRITE_D3_1 GPIOB->regs->BSRR = 0x0001
#define dWRITE_D3_0 GPIOB->regs->BRR  = 0x0001

#define dWRITE_D2_1 GPIOB->regs->BSRR = 0x0004
#define dWRITE_D2_0 GPIOB->regs->BRR  = 0x0004

#define dWRITE_D1_1 GPIOB->regs->BSRR = 0x0400
#define dWRITE_D1_0 GPIOB->regs->BRR  = 0x0400

#define dWRITE_D0_1 GPIOB->regs->BSRR = 0x0800
#define dWRITE_D0_0 GPIOB->regs->BRR  = 0x0800

#endif// defined(__STM32F1XX__) 
Это код для проверки
PHP код:
void loop() {
  static 
uint32 startT;
  
uint32 i,j,k;
  
uint32 dur;
  
j=0startT micros();
  for (
k=0k<CYCLESk++){
  
i=0;
    do{ 
      
_digitalWrite(CLK_PIN,1);
      
i++; 
      
j<<=1;
      
+= _digitalRead(DATA_PIN);    
      
_digitalWrite(CLK_PIN,0); 
    } while (
i<32);//32-bit read
  
}
  
dur micros()-startT;
//  delay(100);
  
Serial.print("F:");Serial.print(uint64(k*i)*1000/dur);Serial.print("kHz / ");
  
Serial.print(72*dur/(k*i));Serial.print(" cycles / ");
  
Serial.print("dur: "); Serial.print(dur);Serial.print(" mcs / ");
  
Serial.print("j="); Serial.print(j,16);
  
Serial.print(" / i*k="); Serial.println(i*k);
//  delay(100);
  

В итоге может дрыгать ногами со скоростью 8.000+ кГц

Со считыванием данных с кнопки 4,2МГц.

Проверялось на Arduino IDE 1.5.8 + Arduino_STM32
HiddenPilot вне форума   Ответить с цитированием
Старый 06.12.2014, 11:58   #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: Maple Mini

Круто, с такой частотой можно анализировать протоколы разных устройств
Например шины управления в автомобилях
Admin вне форума   Ответить с цитированием
Старый 06.12.2014, 20:09   #3
HiddenPilot
Member
 
Регистрация: 07.03.2013
Сообщений: 75
Вес репутации: 0
HiddenPilot is an unknown quantity at this point
По умолчанию Re: Maple Mini

Не знаю как на счет анализатора, но это получился почти хардварный уровень SPI.

А для протоколов, и не только, я приметил себе такую не дорогую штучку: http://www.ebay.com/itm/USB-Logic-24...item2c868bef92
к ней вот такую программку

и проще и без заморочек получится
HiddenPilot вне форума   Ответить с цитированием
Старый 06.12.2014, 22:48   #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: Maple Mini

Действительно, за такую цену лучше купить
Admin вне форума   Ответить с цитированием
Старый 12.12.2014, 12:49   #5
HiddenPilot
Member
 
Регистрация: 07.03.2013
Сообщений: 75
Вес репутации: 0
HiddenPilot is an unknown quantity at this point
По умолчанию Re: Maple Mini

ну что ж реализация проекта по созданию функций быстрого дерганья по аналогии с CyberLib подошла к своему логическому завершению. Осталось, разве что, получше раскурить BitBand и модернизировать "Arduino STM32-ASP" в части резервирвоания выделенной памяти под переменные побитовой записи/чтения в режиме BitBand.
(Здесь достаточно подробно описана методология: http://www.micromouseonline.com/2013...ding-approach/)

Результатом проделаной работы я доволен. Для сравнительного тестирования шатных функций digitalRead digitalWrite, а так же различных методов я написал небольшой код. Тестировал в 4х режимах: Strobe (тупo дергаем ногу CLK), READ - считывание битов со второй ноги + STROBE . Write - передача битов + STROBE и TRANSFER это считывание и пересылка данных одновременно + STROBE.

результаты получились такими:
Код:
===================== STROBE =====================
standart   - F:   865kHz /  83 CPU cycles / dur: 4621 ms / j=0 / i*k=4000000
OneWire(7b)- F:  3048kHz /  23 CPU cycles / dur: 1148 ms / j=0 / i*k=3500000(1312ms for 8bit)
PIN_MAP    - F:  9909kHz /   7 CPU cycles / dur:  403 ms / j=0 / i*k=4000000
PM w/o for - F: 15964kHz /   4 CPU cycles / dur:  250 ms / j=0 / i*k=4000000

=================== READ + STROBE =====================
standart   - F:   591kHz / 121 CPU cycles / dur: 6764 ms / j=0 / i*k=4000000
OneWire(7b)- F:  1752kHz /  41 CPU cycles / dur: 1997 ms / j=0 / i*k=3500000(2282ms for 8bit)
PIN_MAP    - F:  4711kHz /  15 CPU cycles / dur:  849 ms / j=0 / i*k=4000000
PM w/o for - F:  8094kHz /   8 CPU cycles / dur:  494 ms / j=0 / i*k=4000000

================== WRITE + STROBE ===================== 
standart   - F:   593kHz / 121 CPU cycles / dur: 6737 ms / j=0 / i*k=4000000
OneWire(7b)- F:  1722kHz /  41 CPU cycles / dur: 2032 ms / j=0 / i*k=3500000(2322ms for 8bit)
PIN_MAP    - F:  3569kHz /  20 CPU cycles / dur: 1120 ms / j=0 / i*k=4000000
PM w/o for - F: 11031kHz /   6 CPU cycles / dur:  362 ms / j=0 / i*k=4000000


==================== TRANSFER ====================
standart   - F:   453kHz / 158 CPU cycles / dur: 8824 ms / j=0 / i*k=4000000
OneWire(7b)- F:  1174kHz /  61 CPU cycles / dur: 2978 ms / j=0 / i*k=3500000 (3403ms for 8bit)
PIN_MAP    - F:  2572kHz /  27 CPU cycles / dur: 1554 ms / j=0 / i*k=4000000
PM w/o for - F:  5515kHz /  13 CPU cycles / dur:  725 ms / j=0 / i*k=4000000
4 метода:
1. с использованием стандартных функций digitalRead и digitalWrite.
2. через указатели на регистры.(как в библиотеке OneWire)
3. Мой метод.
4. Мой, без использования цикла.

Для ускорения нужно (пере)дописать массив в файле
\hardware\Arduino_STM32\ STM32F1XX\variants\maple_mini\board.cpp
и дополнить описание структуры в файле:
\hardware\Arduino_STM32\STM32F1XX\cores\ maple\wirish_types.h
и написать 2 макроса:
Код:
#define _digitalRead(pin) (pin < BOARD_NR_GPIO_PINS) ?  (*(volatile uint32*)PIN_MAP[pin].BB_IDR) : 0

#define _digitalWrite(pin,val) (pin < BOARD_NR_GPIO_PINS) ? (PIN_MAP[pin].gpio_device->regs->BSRR=((PIN_MAP[pin].gpio_pMASK)<<((!val)?16:0))) : (NULL)
более подробно тут (гугл переводчик должен справиться, им и переводил на англ )
Чуть ниже в сообщениях есть мой код использованный для сравнительного тестирования.

Последний раз редактировалось HiddenPilot; 12.12.2014 в 19:46.
HiddenPilot вне форума   Ответить с цитированием
Старый 12.12.2014, 14:49   #6
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: Maple Mini

Результы методом PM w/o впечатляют
Admin вне форума   Ответить с цитированием
Старый 12.12.2014, 15:11   #7
HiddenPilot
Member
 
Регистрация: 07.03.2013
Сообщений: 75
Вес репутации: 0
HiddenPilot is an unknown quantity at this point
По умолчанию Re: Maple Mini

А это такой же метод как и PIN_MAP, только с вручную развернутым циклом
Видима на простых операциях без условий и циклов системе предсказания команд проще предсказывать и кэшировать данные в кэш. как только начинаются витьеватые условия сразу просадка из за пропуска тактов для считывания новых команд с флеша

Последний раз редактировалось HiddenPilot; 12.12.2014 в 15:15.
HiddenPilot вне форума   Ответить с цитированием
Старый 12.12.2014, 20:21   #8
HiddenPilot
Member
 
Регистрация: 07.03.2013
Сообщений: 75
Вес репутации: 0
HiddenPilot is an unknown quantity at this point
По умолчанию Re: Maple Mini

Подправил функцию передачи данных(немного упростил). Теперь передача и прием данных с помощью развернутого цикла действительно впечатляет!
10Мгц на передачу, 8 МГц на прием.
Теперь я полностью доволен, больше уже с камня не выжать т.к.:

На прием 1бита с перещелкиванием строба тратится всего 8 тактов.
На передачу 1 бита со стробом 6 тактов
На строб всего 4 такта....
HiddenPilot вне форума   Ответить с цитированием
Старый 13.12.2014, 22:01   #9
HiddenPilot
Member
 
Регистрация: 07.03.2013
Сообщений: 75
Вес репутации: 0
HiddenPilot is an unknown quantity at this point
По умолчанию Re: Maple Mini

А плюшки все прибавляются и прибавляются
Доработал тут немного внешний вид и вытащил кой какие удобные мне настройки в меню Arduino IDE.
Ускоренные функции digitalRead/Write будут внедрены прямо в Arduino STM32. Пункт в меню для них я уже подготовил

Миниатюры
Нажмите на изображение для увеличения
Название: 2014-12-14_004437.png
Просмотров: 1078
Размер:	53.4 Кб
ID:	2092   Нажмите на изображение для увеличения
Название: 2014-12-14_004515.png
Просмотров: 1045
Размер:	49.7 Кб
ID:	2093   Нажмите на изображение для увеличения
Название: 2014-12-14_004638.png
Просмотров: 1087
Размер:	50.7 Кб
ID:	2094  
HiddenPilot вне форума   Ответить с цитированием
Старый 13.12.2014, 22:08   #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: Maple Mini

Надеюсь что ты выложишь свою сборку IDE для общего пользования?
Admin вне форума   Ответить с цитированием
Ответ


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

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

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

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


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


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