Показано с 1 по 4 из 4
  1. #1
    Модератор
    Регистрация
    06.07.2008
    Возраст
    46
    Сообщений
    414
    Вес репутации
    443

    По умолчанию Быстрый 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 

  2. #2
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    55
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Re: Быстрый digitalWrite и тп

    4 массива по 22 байта , вот они твои 88 байт

  3. #3
    Модератор
    Регистрация
    06.07.2008
    Возраст
    46
    Сообщений
    414
    Вес репутации
    443

    По умолчанию Re: Быстрый digitalWrite и тп

    я понимаю откуда они берутся :-)

  4. #4
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    55
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Re: Быстрый digitalWrite и тп

    Есть и недостаток, который я не знаю как победить: эта штука кушает порядка 88 байт памяти.
    Я не правильно понял

Информация о теме

Пользователи, просматривающие эту тему

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

Ваши права

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