欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
ArduinoMega2560引腳操作底層庫,能夠提高操作效率和速度
[打印本頁]
作者:
aikeaida
時間:
2018-12-11 10:39
標題:
ArduinoMega2560引腳操作底層庫,能夠提高操作效率和速度
之前做項目的時候發(fā)現(xiàn) digitalWrite() 耗時能達到30us,導(dǎo)致系統(tǒng)卡頓,一怒之下自行開發(fā)了底層引腳操作函數(shù),開發(fā)了N個項目也沒發(fā)現(xiàn)有什么問題
頭文件在這里
/*------------------------------
[name] Gpio.h
[date] 2018.5.16 17:12
[note] Designed by TFD Studio
------------------------------*/
#ifndef Gpio_h
#define Gpio_h
//---------------/* Headerfile */---------------//
#include <Arduino.h>
//---------------/* Debug */---------------//
/* Level */
#define HIGH 1
#define LOW 0
#define OUTPUT 1
#define INPUT 0
/* Analog pins */
#define A0 (54)
#define A1 (55)
#define A2 (56)
#define A3 (57)
#define A4 (58)
#define A5 (59)
#define A6 (60)
#define A7 (61)
#define A8 (62)
#define A9 (63)
#define A10 (64)
#define A11 (65)
#define A12 (66)
#define A13 (67)
#define A14 (68)
#define A15 (69)
/* PWM Defaults */
#define DEFAULT_PWM_FREQUENCY 50
#define DEFAULT_PWM_LEVEL HIGH
#define DEFAULT_PWM_GRADE 100
//---------------/* Class */---------------//
class GPIO{
private:
/* Normal */
uint8_t _bit_;
volatile uint8_t* _mode_;
volatile uint8_t* _pin_;
volatile uint8_t* _port_;
/* SoftPWM */
unsigned int grade = DEFAULT_PWM_GRADE;
unsigned int dutycycle = 0;
unsigned int factor = 0;
unsigned int frequency = DEFAULT_PWM_FREQUENCY;
bool level = DEFAULT_PWM_LEVEL;
bool enable = false;
unsigned long int timemark, timecycle;
public:
void setPin(unsigned char);
/* Normal */
void write(unsigned char);
void mode(unsigned char);
void high();
void low();
void input();
void output();
unsigned char read();
/* SoftPWM */
void pwmLevel(bool);
void pwmDuty(unsigned int);
void pwmGrade(unsigned int);
void pwmFreq(unsigned int);
void pwmStart();
void pwmStop();
bool pwmThread();
};
#endif
復(fù)制代碼
實現(xiàn)在這里
/*------------------------------
[name] Gpio.cpp
[date] 2018.5.16 17:12
[note] Designed by TFD Studio
------------------------------*/
#include "Gpio.h"
//---------------/* Set */---------------//
void GPIO::setPin(unsigned char _id)
{
_bit_ = digitalPinToBitMask(_id);
_mode_ = portModeRegister(digitalPinToPort(_id));
_port_ = portOutputRegister(digitalPinToPort(_id));
_pin_ = portInputRegister(digitalPinToPort(_id));
}
//---------------/* Control */---------------//
void GPIO::write( unsigned char _level)
{
if (_level)
*_port_ |= _bit_;
else
*_port_ &= ~_bit_;
}
void GPIO::mode(unsigned char _mode)
{
if (_mode)
*_mode_ |= _bit_;
else
*_mode_ &= ~_bit_;
}
void GPIO::high()
{
*_port_ |= _bit_;
}
void GPIO::low()
{
*_port_ &= ~_bit_;
}
void GPIO::input()
{
*_mode_ &= ~_bit_;
}
void GPIO::output()
{
*_mode_ |= _bit_;
}
unsigned char GPIO::read()
{
if (*_pin_ & _bit_)
return 1;
else
return 0;
}
//---------------/* SoftPWM */---------------//
void GPIO::pwmLevel(bool _level)
{
level = _level;
}
void GPIO::pwmDuty(unsigned int _dutycycle)
{
if (!level)
dutycycle = grade - _dutycycle;
else
dutycycle = _dutycycle;
}
void GPIO::pwmGrade(unsigned int _grade)
{
grade = _grade;
}
void GPIO::pwmFreq(unsigned int _freq)
{
frequency = _freq;
}
void GPIO::pwmStart()
{
enable = true;
timecycle = 1000000 / (frequency * grade);
timemark = micros();
}
void GPIO::pwmStop()
{
enable = false;
if (!level)
*_port_ |= _bit_;
else
*_port_ &= ~_bit_;
}
bool GPIO::pwmThread()
{
if (enable && micros() - timemark >= timecycle)
{
timemark += timecycle;
factor++;
if (factor > grade)
factor = 1;
if (factor <= dutycycle)
*_port_ |= _bit_;
else
*_port_ &= ~_bit_;
return true;
}
}
復(fù)制代碼
作者:
zmc419
時間:
2018-12-15 15:12
高!發(fā)現(xiàn)Arduino確實慢,部分代碼用c寫就好了。
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1