TaskHandle_t task1Handle;
TaskHandle_t task2Handle;
volatile long int counter0 = 0;
volatile long int counter1 = 0;
hw_timer_t *timer0 = NULL;
hw_timer_t *timer1 = NULL;
portMUX_TYPE timerMUX = portMUX_INITIALIZER_UNLOCKED;
volatile long int lastMillis = millis();
void task1(void *parameter) {
for (int i=0;i<100;i++) {
}
Serial.print("Task 1 finished\tt(ms):");
Serial.println(millis());
vTaskDelete(NULL);
}
void task2(void *parameter) {
for (int i=0;i<100;i++) {
}
Serial.print("Task 2 finished\tt(ms):");
Serial.println(millis());
vTaskDelete(NULL);
}
void IRAM_ATTR onTimer0() {
portENTER_CRITICAL_ISR(&timerMUX);
counter0++;
portEXIT_CRITICAL_ISR(&timerMUX);
}
void IRAM_ATTR onTimer1() {
portENTER_CRITICAL_ISR(&timerMUX);
counter1++;
portEXIT_CRITICAL_ISR(&timerMUX);
}
void setup() {
Serial.begin(115200);
// Timer0 configuration
timer0 = timerBegin(0, 80, true);
timerAttachInterrupt(timer0, &onTimer0, true);
timerAlarmWrite(timer0, 100000, true); // 0.1 s
timerAlarmEnable(timer0);
// Timer1 configuration
timer1 = timerBegin(1, 80, true);
timerAttachInterrupt(timer1, &onTimer1, true);
timerAlarmWrite(timer1, 100000, true); // 0.1 s
timerAlarmEnable(timer1);
}
void loop() {
xTaskCreatePinnedToCore(task1, "Task 1", 10000, NULL, 0, &task1Handle, 0);
xTaskCreatePinnedToCore(task2, "Task 2", 10000, NULL, 0, &task2Handle, 1);
Serial.print("Counter0: ");
Serial.print(counter0);
Serial.print("\tt(ms):");
Serial.println(millis());
Serial.print("Counter1: ");
Serial.print(counter1);
Serial.print("\tt(ms):");
Serial.println(millis());
//Serial.println(millis()-lastMillis);
delay(1000-(millis()-lastMillis)); //use time measurement using constant delay.
lastMillis = millis();
}