Быстрый digitalWrite и тп
Увидев насколько медленно выполняются стандартные функции digitalWrite, digitalRead и PinMode, сделал модуль, которые позволяет выполнять эти операции за два такта процессора.
Однако есть ограничения:
1. Вы должны быть уверены, что на ногу, состояние которой Вы меняете, не запущен ШИМ (он же analogWrite)
2. Эти операции выполняются реально быстро только в случае, если на этапе компиляции известно, что и куда вы пишите.
То есть код
PHP код:
PinModeOut(1);
PinModeIn(0);
DigitalWrite1(1);
DigitalWrite1(2);
if (DigitalReadF(1))
DigitalWrite0(2);
DigitalWrite0(3);
DigitalWrite1(8);
будет выполняться со скоростью строчка за два такта (вместо 60-80 тактов оригинальных команд).
код
PHP код:
for (int8_t i=0;i<22;i++)
PinModeOut(i);
выполняется 483 такта - примерно 22 такта на итерацию с учетом цикла. Ну да все равно существенно быстрее оригинала.
Есть и недостаток, который я не знаю как победить: эта штука кушает порядка 88 байт памяти.
Сам код pins.h
PHP код:
#ifndef PINS_H
#define PINS_H
#include <avr/io.h>
#define PORTD_W (uint16_t) &PORTD
#define PORTB_W (uint16_t) &PORTB
#define PORTC_W (uint16_t) &PORTC
#define DDRD_W (uint16_t) &DDRD
#define DDRB_W (uint16_t) &DDRB
#define DDRC_W (uint16_t) &DDRC
#define PIND_W (uint16_t) &PIND
#define PINB_W (uint16_t) &PINB
#define PINC_W (uint16_t) &PINC
const uint8_t ArduinoRPin[22] = {(1<<0),(1<<1),(1<<2),(1<<3),(1<<4),(1<<5),(1<<6),(1<<7),(1<<0),(1<<1),(1<<2),(1<<3),(1<<4),(1<<5),(1<<0),(1<<1),(1<<2),(1<<3),(1<<4),(1<<5),(1<<6),(1<<7)};
const uint8_t ArduinoPinPORT [22] = {PORTD_W,PORTD_W,PORTD_W,PORTD_W,PORTD_W,PORTD_W,PORTD_W,PORTD_W,
PORTB_W,PORTB_W,PORTB_W,PORTB_W,PORTB_W,PORTB_W,
PORTC_W,PORTC_W,PORTC_W,PORTC_W,PORTC_W,PORTC_W,PORTC_W,PORTC_W};
const uint8_t ArduinoPinDDR [22] = {DDRD_W,DDRD_W,DDRD_W,DDRD_W,DDRD_W,DDRD_W,DDRD_W,DDRD_W,
DDRB_W,DDRB_W,DDRB_W,DDRB_W,DDRB_W,DDRB_W,
DDRC_W,DDRC_W,DDRC_W,DDRC_W,DDRC_W,DDRC_W,DDRC_W,DDRC_W};
const uint8_t ArduinoPinPIN [22] = {PIND_W,PIND_W,PIND_W,PIND_W,PIND_W,PIND_W,PIND_W,PIND_W,
PINB_W,PINB_W,PINB_W,PINB_W,PINB_W,PINB_W,
PINC_W,PINC_W,PINC_W,PINC_W,PINC_W,PINC_W,PINC_W,PINC_W};
#define DigitalWrite1(ArduinoPin) * ((volatile uint8_t *) (uint16_t) ArduinoPinPORT[ArduinoPin]) |= ArduinoRPin[ArduinoPin]
#define DigitalWrite0(ArduinoPin) * ((volatile uint8_t *) (uint16_t) ArduinoPinPORT[ArduinoPin]) &= ~ArduinoRPin[ArduinoPin]
#define PinModeOut(ArduinoPin) * ((volatile uint8_t *) (uint16_t) ArduinoPinDDR[ArduinoPin]) |= ArduinoRPin[ArduinoPin]
#define PinModeIn(ArduinoPin) * ((volatile uint8_t *) (uint16_t) ArduinoPinDDR[ArduinoPin]) &= ~ArduinoRPin[ArduinoPin]
#define DigitalReadF(ArduinoPin) ((* ((volatile uint8_t *) (uint16_t) ArduinoPinPIN[ArduinoPin])& ArduinoRPin[ArduinoPin]))
#endif
Re: Быстрый digitalWrite и тп
4 массива по 22 байта , вот они твои 88 байт
Re: Быстрый digitalWrite и тп
я понимаю откуда они берутся :-)
Re: Быстрый digitalWrite и тп
Цитата:
Есть и недостаток, который я не знаю как победить: эта штука кушает порядка 88 байт памяти.
Я не правильно понял :)