Minor performance improvements
This commit is contained in:
parent
0b82b120c5
commit
726645d376
|
@ -21,7 +21,7 @@ toothLastToothTime - The time (In uS) that the last primary tooth was 'seen'
|
|||
|
||||
*/
|
||||
|
||||
inline void addToothLogEntry(unsigned long time)
|
||||
static inline void addToothLogEntry(unsigned long time)
|
||||
{
|
||||
//High speed tooth logging history
|
||||
toothHistory[toothHistoryIndex] = time;
|
||||
|
@ -35,7 +35,7 @@ inline void addToothLogEntry(unsigned long time)
|
|||
As nearly all the decoders use a common method of determining RPM (The time the last full revolution took)
|
||||
A common function is simpler
|
||||
*/
|
||||
inline int stdGetRPM()
|
||||
static inline int stdGetRPM()
|
||||
{
|
||||
noInterrupts();
|
||||
revolutionTime = (toothOneTime - toothOneMinusOneTime); //The time in uS that one revolution would take at current speed (The time tooth 1 was last seen, minus the time it was seen prior to that)
|
||||
|
@ -49,7 +49,7 @@ inline int stdGetRPM()
|
|||
* Sets the new filter time based on the current settings.
|
||||
* This ONLY works for even spaced decoders
|
||||
*/
|
||||
inline void setFilter(unsigned long curGap)
|
||||
static inline void setFilter(unsigned long curGap)
|
||||
{
|
||||
if(configPage2.triggerFilter == 1) { triggerFilterTime = curGap >> 2; } //Lite filter level is 25% of previous gap
|
||||
else if(configPage2.triggerFilter == 2) { triggerFilterTime = curGap >> 1; } //Medium filter level is 50% of previous gap
|
||||
|
|
5
math.h
5
math.h
|
@ -49,6 +49,7 @@ int divs10(long n) {
|
|||
|
||||
//Signed divide by 100
|
||||
int divs100(long n) {
|
||||
return (n / 100); // Amazingly, gcc is producing a better /divide by 100 function than this
|
||||
long q, r;
|
||||
n = n + (n>>31 & 99);
|
||||
q = (n >> 1) + (n >> 3) + (n >> 6) - (n >> 10) +
|
||||
|
@ -62,6 +63,7 @@ int divs100(long n) {
|
|||
|
||||
//Unsigned divide by 100
|
||||
unsigned long divu100(unsigned long n) {
|
||||
//return (n / 100); // No difference with this on/off
|
||||
unsigned long q, r;
|
||||
q = (n >> 1) + (n >> 3) + (n >> 6) - (n >> 10) +
|
||||
(n >> 12) + (n >> 13) - (n >> 16);
|
||||
|
@ -76,7 +78,8 @@ unsigned long divu100(unsigned long n) {
|
|||
//This is a relatively fast approximation of a percentage value.
|
||||
unsigned long percentage(byte x, unsigned long y)
|
||||
{
|
||||
return divu100(y * x);
|
||||
return (y * x) / 100; //For some reason this is faster
|
||||
//return divu100(y * x);
|
||||
}
|
||||
|
||||
#endif // MATH_H
|
||||
|
|
|
@ -7,7 +7,6 @@ A full copy of the license may be found in the projects root directory
|
|||
#include "scheduler.h"
|
||||
#include "globals.h"
|
||||
|
||||
|
||||
void initialiseSchedulers()
|
||||
{
|
||||
// Much help in this from http://arduinomega.blogspot.com.au/2011/05/timer2-and-overflow-interrupt-lets-get.html
|
||||
|
|
|
@ -100,10 +100,10 @@ int CRANK_ANGLE_MAX = 360; // The number of crank degrees that the system track
|
|||
bool useSequentialFuel; // Whether sequential fueling is to be used (1 squirt per cycle)
|
||||
bool useSequentialIgnition; // Whether sequential ignition is used (1 spark per cycle)
|
||||
|
||||
byte coilHIGH = HIGH;
|
||||
byte coilLOW = LOW;
|
||||
byte fanHIGH = HIGH; // Used to invert the cooling fan output
|
||||
byte fanLOW = LOW; // Used to invert the cooling fan output
|
||||
static byte coilHIGH = HIGH;
|
||||
static byte coilLOW = LOW;
|
||||
static byte fanHIGH = HIGH; // Used to invert the cooling fan output
|
||||
static byte fanLOW = LOW; // Used to invert the cooling fan output
|
||||
|
||||
struct statuses currentStatus;
|
||||
volatile int mainLoopCount;
|
||||
|
@ -620,7 +620,7 @@ void loop()
|
|||
//Check for any requets from serial. Serial operations are checked under 2 scenarios:
|
||||
// 1) Every 64 loops (64 Is more than fast enough for TunerStudio). This function is equivalent to ((loopCount % 64) == 1) but is considerably faster due to not using the mod or division operations
|
||||
// 2) If the amount of data in the serial buffer is greater than a set threhold (See globals.h). This is to avoid serial buffer overflow when large amounts of data is being sent
|
||||
if ( ((mainLoopCount & 63) == 1) or (Serial.available() > SERIAL_BUFFER_THRESHOLD) )
|
||||
if ( ((mainLoopCount & 31) == 1) or (Serial.available() > SERIAL_BUFFER_THRESHOLD) )
|
||||
{
|
||||
if (Serial.available() > 0)
|
||||
{
|
||||
|
@ -735,10 +735,10 @@ void loop()
|
|||
//If it is, check is we're running or cranking
|
||||
if(currentStatus.RPM > ((unsigned int)configPage2.crankRPM * 100)) //Crank RPM stored in byte as RPM / 100
|
||||
{
|
||||
BIT_SET(currentStatus.engine, BIT_ENGINE_RUN); //Sets the engine running bit
|
||||
//Only need to do anything if we're transitioning from cranking to running
|
||||
if( BIT_CHECK(currentStatus.engine, BIT_ENGINE_CRANK) )
|
||||
{
|
||||
BIT_SET(currentStatus.engine, BIT_ENGINE_RUN); //Sets the engine running bit
|
||||
BIT_CLEAR(currentStatus.engine, BIT_ENGINE_CRANK); //clears the engine cranking bit
|
||||
if(configPage2.ignBypassEnabled) { digitalWrite(pinIgnBypass, HIGH); }
|
||||
}
|
||||
|
@ -1180,25 +1180,25 @@ void loop()
|
|||
void endCoil4Charge() { *ign4_pin_port &= ~(ign4_pin_mask); BIT_CLEAR(currentStatus.spark, 3);}
|
||||
|
||||
#else */
|
||||
void openInjector1() { digitalWrite(pinInjector1, HIGH); BIT_SET(currentStatus.squirt, BIT_SQUIRT_INJ1); }
|
||||
void closeInjector1() { digitalWrite(pinInjector1, LOW); BIT_CLEAR(currentStatus.squirt, BIT_SQUIRT_INJ1); }
|
||||
void beginCoil1Charge() { digitalWrite(pinCoil1, coilHIGH); digitalWrite(pinTachOut, LOW); }
|
||||
void endCoil1Charge() { digitalWrite(pinCoil1, coilLOW); }
|
||||
inline void openInjector1() { digitalWrite(pinInjector1, HIGH); BIT_SET(currentStatus.squirt, BIT_SQUIRT_INJ1); }
|
||||
inline void closeInjector1() { digitalWrite(pinInjector1, LOW); BIT_CLEAR(currentStatus.squirt, BIT_SQUIRT_INJ1); }
|
||||
inline void beginCoil1Charge() { digitalWrite(pinCoil1, coilHIGH); digitalWrite(pinTachOut, LOW); }
|
||||
inline void endCoil1Charge() { digitalWrite(pinCoil1, coilLOW); }
|
||||
|
||||
void openInjector2() { digitalWrite(pinInjector2, HIGH); BIT_SET(currentStatus.squirt, BIT_SQUIRT_INJ2); } //Sets the relevant pin HIGH and changes the current status bit for injector 2 (2nd bit of currentStatus.squirt)
|
||||
void closeInjector2() { digitalWrite(pinInjector2, LOW); BIT_CLEAR(currentStatus.squirt, BIT_SQUIRT_INJ2); }
|
||||
void beginCoil2Charge() { digitalWrite(pinCoil2, coilHIGH); digitalWrite(pinTachOut, LOW); }
|
||||
void endCoil2Charge() { digitalWrite(pinCoil2, coilLOW); }
|
||||
inline void openInjector2() { digitalWrite(pinInjector2, HIGH); BIT_SET(currentStatus.squirt, BIT_SQUIRT_INJ2); } //Sets the relevant pin HIGH and changes the current status bit for injector 2 (2nd bit of currentStatus.squirt)
|
||||
inline void closeInjector2() { digitalWrite(pinInjector2, LOW); BIT_CLEAR(currentStatus.squirt, BIT_SQUIRT_INJ2); }
|
||||
inline void beginCoil2Charge() { digitalWrite(pinCoil2, coilHIGH); digitalWrite(pinTachOut, LOW); }
|
||||
inline void endCoil2Charge() { digitalWrite(pinCoil2, coilLOW); }
|
||||
|
||||
void openInjector3() { digitalWrite(pinInjector3, HIGH); BIT_SET(currentStatus.squirt, BIT_SQUIRT_INJ3); } //Sets the relevant pin HIGH and changes the current status bit for injector 3 (3rd bit of currentStatus.squirt)
|
||||
void closeInjector3() { digitalWrite(pinInjector3, LOW); BIT_CLEAR(currentStatus.squirt, BIT_SQUIRT_INJ3); }
|
||||
void beginCoil3Charge() { digitalWrite(pinCoil3, coilHIGH); digitalWrite(pinTachOut, LOW); }
|
||||
void endCoil3Charge() { digitalWrite(pinCoil3, coilLOW); }
|
||||
inline void openInjector3() { digitalWrite(pinInjector3, HIGH); BIT_SET(currentStatus.squirt, BIT_SQUIRT_INJ3); } //Sets the relevant pin HIGH and changes the current status bit for injector 3 (3rd bit of currentStatus.squirt)
|
||||
inline void closeInjector3() { digitalWrite(pinInjector3, LOW); BIT_CLEAR(currentStatus.squirt, BIT_SQUIRT_INJ3); }
|
||||
inline void beginCoil3Charge() { digitalWrite(pinCoil3, coilHIGH); digitalWrite(pinTachOut, LOW); }
|
||||
inline void endCoil3Charge() { digitalWrite(pinCoil3, coilLOW); }
|
||||
|
||||
void openInjector4() { digitalWrite(pinInjector4, HIGH); BIT_SET(currentStatus.squirt, BIT_SQUIRT_INJ4); } //Sets the relevant pin HIGH and changes the current status bit for injector 4 (4th bit of currentStatus.squirt)
|
||||
void closeInjector4() { digitalWrite(pinInjector4, LOW); BIT_CLEAR(currentStatus.squirt, BIT_SQUIRT_INJ4); }
|
||||
void beginCoil4Charge() { digitalWrite(pinCoil4, coilHIGH); digitalWrite(pinTachOut, LOW); }
|
||||
void endCoil4Charge() { digitalWrite(pinCoil4, coilLOW); }
|
||||
inline void openInjector4() { digitalWrite(pinInjector4, HIGH); BIT_SET(currentStatus.squirt, BIT_SQUIRT_INJ4); } //Sets the relevant pin HIGH and changes the current status bit for injector 4 (4th bit of currentStatus.squirt)
|
||||
inline void closeInjector4() { digitalWrite(pinInjector4, LOW); BIT_CLEAR(currentStatus.squirt, BIT_SQUIRT_INJ4); }
|
||||
inline void beginCoil4Charge() { digitalWrite(pinCoil4, coilHIGH); digitalWrite(pinTachOut, LOW); }
|
||||
inline void endCoil4Charge() { digitalWrite(pinCoil4, coilLOW); }
|
||||
|
||||
//#endif
|
||||
|
||||
|
|
|
@ -45,10 +45,6 @@ ISR(TIMER2_OVF_vect, ISR_NOBLOCK)
|
|||
if(ignitionSchedule3.Status == RUNNING) { if(ignitionSchedule3.startTime < targetOverdwellTime && configPage2.useDwellLim) { endCoil3Charge(); } if(ignitionSchedule3.startTime < targetTachoPulseTime) { digitalWrite(pinTachOut, HIGH); } }
|
||||
if(ignitionSchedule4.Status == RUNNING) { if(ignitionSchedule4.startTime < targetOverdwellTime && configPage2.useDwellLim) { endCoil4Charge(); } if(ignitionSchedule4.startTime < targetTachoPulseTime) { digitalWrite(pinTachOut, HIGH); } }
|
||||
|
||||
//Check if there's any actions pending for a stepper idle
|
||||
|
||||
|
||||
|
||||
//Loop executed every 250ms loop (1ms x 250 = 250ms)
|
||||
//Anything inside this if statement will run every 250ms.
|
||||
if (loop250ms == 250)
|
||||
|
|
|
@ -335,6 +335,7 @@ unsigned int PW(int REQ_FUEL, byte VE, byte MAP, int corrections, int injOpen, b
|
|||
int iCorrections = (corrections << 7) / 100;
|
||||
//int iTPS = ((int)TPS << 7) / 100;
|
||||
|
||||
|
||||
unsigned long intermediate = ((long)REQ_FUEL * (long)iVE) >> 7; //Need to use an intermediate value to avoid overflowing the long
|
||||
//intermediate = (intermediate * iMAP) >> 7;
|
||||
intermediate = (intermediate * iCorrections) >> 7;
|
||||
|
|
Loading…
Reference in New Issue