Skip to content

Commit eb50ef2

Browse files
authored
micros() optimisation and flto build fix (#53)
1 parent 371ad85 commit eb50ef2

File tree

2 files changed

+13
-12
lines changed

2 files changed

+13
-12
lines changed

cores/arduino/arduino.cpp

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@
3131

3232
#include <Arduino.h>
3333

34-
extern uint64_t _millis;
35-
3634
// Interrupts
3735
void cli(void) { __disable_irq(); } // Disable
3836
void sei(void) { __enable_irq(); } // Enable
@@ -45,14 +43,6 @@ void _delay_ms(const int delay_ms) {
4543
delay(delay_ms);
4644
}
4745

48-
uint32_t millis() {
49-
return _millis;
50-
}
51-
52-
uint32_t micros() {
53-
return (_millis * 1000) + ((SysTick->LOAD - SysTick->VAL) / (SystemCoreClock / 1000000) );
54-
}
55-
5646
// This is required for some Arduino libraries we are using
5747
void delayMicroseconds(uint32_t us) {
5848
LPC176x::delay_us(us);
@@ -89,7 +79,7 @@ void analogWrite(pin_t pin, int pwm_value) { // 1 - 254: pwm_value, 0: LOW, 255
8979
}
9080
}
9181

92-
uint8_t analog_read_resolution = 10;
82+
volatile static uint8_t analog_read_resolution = 10;
9383
void analogReadResolution(uint8_t resolution) {
9484
analog_read_resolution = resolution > 32 ? 32 : resolution;
9585
}

cores/arduino/main.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,14 @@ extern void setup();
1414
extern void loop();
1515

1616
extern "C" {
17-
volatile uint64_t _millis;
17+
[[gnu::section(".noinit")]] volatile uint32_t _millis;
18+
[[gnu::section(".noinit")]] volatile static uint32_t _micros_per_tick_scaled; // Units: us / (2^16 ticks)
1819

1920
uint32_t SysTick_Config(uint32_t ticks) {
2021
if (ticks > SysTick_LOAD_RELOAD_Msk) return 1;
2122

23+
_micros_per_tick_scaled = (1000 << 16) / ticks; // microseconds per system clock cycle, scaled by 2^16
24+
2225
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; // Set reload register
2326
SysTick->VAL = 0; // Load the SysTick Counter Value
2427
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
@@ -41,6 +44,14 @@ extern "C" {
4144
}
4245
}
4346

47+
uint32_t millis() {
48+
return _millis;
49+
}
50+
51+
uint32_t micros() {
52+
return (_millis * 1000) + (((SysTick->LOAD - SysTick->VAL) * _micros_per_tick_scaled) >> 16); // Shifted to remove scale factor
53+
}
54+
4455
int main(void) {
4556
// Turn on and initialise ADC in burst mode
4657
LPC176x::adc_hardware.init();

0 commit comments

Comments
 (0)