static void timer_test(int flags) { int x; timer_isr_handle_t inth[4]; my_timer_init(TIMER_GROUP_0, TIMER_0, 110000); my_timer_init(TIMER_GROUP_0, TIMER_1, 120000); my_timer_init(TIMER_GROUP_1, TIMER_0, 130000); my_timer_init(TIMER_GROUP_1, TIMER_1, 140000); timer_isr_register(TIMER_GROUP_0, TIMER_0, timer_isr, (void*)0, flags|ESP_INTR_FLAG_INTRDISABLED, &inth[0]); timer_isr_register(TIMER_GROUP_0, TIMER_1, timer_isr, (void*)1, flags, &inth[1]); timer_isr_register(TIMER_GROUP_1, TIMER_0, timer_isr, (void*)2, flags, &inth[2]); timer_isr_register(TIMER_GROUP_1, TIMER_1, timer_isr, (void*)3, flags, &inth[3]); timer_start(TIMER_GROUP_0, TIMER_0); timer_start(TIMER_GROUP_0, TIMER_1); timer_start(TIMER_GROUP_1, TIMER_0); timer_start(TIMER_GROUP_1, TIMER_1); for (x=0; x<4; x++) count[x]=0; printf("Interrupts allocated: %d (dis) %d %d %d\n", esp_intr_get_intno(inth[0]), esp_intr_get_intno(inth[1]), esp_intr_get_intno(inth[2]), esp_intr_get_intno(inth[3])); printf("Timer values on start: %d %d %d %d\n", count[0], count[1], count[2], count[3]); vTaskDelay(1000 / portTICK_PERIOD_MS); printf("Timer values after 1 sec: %d %d %d %d\n", count[0], count[1], count[2], count[3]); TEST_ASSERT(count[0]==0); TEST_ASSERT(count[1]!=0); TEST_ASSERT(count[2]!=0); TEST_ASSERT(count[3]!=0); printf("Disabling timers 1 and 2...\n"); esp_intr_enable(inth[0]); esp_intr_disable(inth[1]); esp_intr_disable(inth[2]); for (x=0; x<4; x++) count[x]=0; vTaskDelay(1000 / portTICK_PERIOD_MS); printf("Timer values after 1 sec: %d %d %d %d\n", count[0], count[1], count[2], count[3]); TEST_ASSERT(count[0]!=0); TEST_ASSERT(count[1]==0); TEST_ASSERT(count[2]==0); TEST_ASSERT(count[3]!=0); printf("Disabling other half...\n"); esp_intr_enable(inth[1]); esp_intr_enable(inth[2]); esp_intr_disable(inth[0]); esp_intr_disable(inth[3]); for (x=0; x<4; x++) count[x]=0; vTaskDelay(1000 / portTICK_PERIOD_MS); printf("Timer values after 1 sec: %d %d %d %d\n", count[0], count[1], count[2], count[3]); TEST_ASSERT(count[0]==0); TEST_ASSERT(count[1]!=0); TEST_ASSERT(count[2]!=0); TEST_ASSERT(count[3]==0); printf("Done.\n"); esp_intr_free(inth[0]); esp_intr_free(inth[1]); esp_intr_free(inth[2]); esp_intr_free(inth[3]); }
static void example_task(void *p) { example_event_data_t *arg = (example_event_data_t *) p; timer_isr_handle_t inth; ESP_LOGI(TAG, "%p: run task", xTaskGetCurrentTaskHandle()); esp_err_t res = timer_isr_register(arg->group, arg->timer, example_timer_isr, arg, 0, &inth); if (res != ESP_OK) { ESP_LOGE(TAG, "%p: failed to register timer ISR", xTaskGetCurrentTaskHandle()); } else { res = timer_start(arg->group, arg->timer); if (res != ESP_OK) { ESP_LOGE(TAG, "%p: failed to start timer", xTaskGetCurrentTaskHandle()); } } while (1) { uint32_t event_val; SYSVIEW_EXAMPLE_WAIT_EVENT_START(); xTaskNotifyWait(0, 0, &event_val, portMAX_DELAY); SYSVIEW_EXAMPLE_WAIT_EVENT_END(event_val); ESP_LOGI(TAG, "Task[%p]: received event %d", xTaskGetCurrentTaskHandle(), event_val); } }
/** * Enable and initialize the timer * @param timer_num timer number to initialize * @param frequency frequency of the timer */ void HAL_timer_start(const uint8_t timer_num, uint32_t frequency) { const tTimerConfig timer = TimerConfig[timer_num]; timer_config_t config; config.divider = timer.divider; config.counter_dir = TIMER_COUNT_UP; config.counter_en = TIMER_PAUSE; config.alarm_en = TIMER_ALARM_EN; config.intr_type = TIMER_INTR_LEVEL; config.auto_reload = true; // Select and initialize the timer timer_init(timer.group, timer.idx, &config); // Timer counter initial value and auto reload on alarm timer_set_counter_value(timer.group, timer.idx, 0x00000000ULL); // Configure the alam value and the interrupt on alarm timer_set_alarm_value(timer.group, timer.idx, (HAL_TIMER_RATE) / timer.divider / frequency - 1); timer_enable_intr(timer.group, timer.idx); // TODO need to deal with timer_group1_isr timer_isr_register(timer.group, timer.idx, timer_group0_isr, (void*)timer.idx, NULL, NULL); timer_start(timer.group, timer.idx); }
void espos_test_run_in_isr(espos_test_isr_routine routine) { int timer_group = TIMER_GROUP_0; int timer_idx = TIMER_0; timer_config_t config; config.alarm_en = 1; config.auto_reload = 0; config.counter_dir = TIMER_COUNT_UP; config.divider = TIMER_DIVIDER; config.intr_type = TIMER_INTR_SEL; config.counter_en = TIMER_PAUSE; /*Configure timer*/ timer_init(timer_group, timer_idx, &config); /*Stop timer counter*/ timer_pause(timer_group, timer_idx); /*Load counter value */ timer_set_counter_value(timer_group, timer_idx, 0x00000000ULL); /*Set alarm value*/ timer_set_alarm_value(timer_group, timer_idx, 1); timer_set_auto_reload(timer_group, timer_idx, TIMER_AUTORELOAD_DIS); /*Enable timer interrupt*/ timer_enable_intr(timer_group, timer_idx); /*Set ISR handler*/ timer_isr_register(timer_group, timer_idx, timer_isr, (void *) routine, ESP_INTR_FLAG_IRAM, NULL); /*Start timer counter*/ timer_start(timer_group, timer_idx); }
static void esp_apptrace_dummy_task(void *p) { esp_apptrace_test_task_arg_t *arg = (esp_apptrace_test_task_arg_t *) p; int res, flags = 0, i; timer_isr_handle_t *inth = NULL; TickType_t tmo_ticks = arg->data.period / (1000 * portTICK_PERIOD_MS); ESP_APPTRACE_TEST_LOGI("%x: run dummy task (period %u us, %u timers)", xTaskGetCurrentTaskHandle(), arg->data.period, arg->timers_num); if (arg->timers_num > 0) { inth = pvPortMalloc(arg->timers_num * sizeof(timer_isr_handle_t)); if (!inth) { ESP_APPTRACE_TEST_LOGE("Failed to alloc timer ISR handles!"); goto on_fail; } memset(inth, 0, arg->timers_num * sizeof(timer_isr_handle_t)); for (int i = 0; i < arg->timers_num; i++) { esp_apptrace_test_timer_init(arg->timers[i].group, arg->timers[i].id, arg->timers[i].data.period); res = timer_isr_register(arg->timers[i].group, arg->timers[i].id, arg->timers[i].isr_func, &arg->timers[i], flags, &inth[i]); if (res != ESP_OK) { ESP_APPTRACE_TEST_LOGE("Failed to timer_isr_register (%d)!", res); goto on_fail; } *(uint32_t *)arg->timers[i].data.buf = (uint32_t)inth[i] | (1 << 31); ESP_APPTRACE_TEST_LOGI("%x: start timer %x period %u us", xTaskGetCurrentTaskHandle(), inth[i], arg->timers[i].data.period); res = timer_start(arg->timers[i].group, arg->timers[i].id); if (res != ESP_OK) { ESP_APPTRACE_TEST_LOGE("Failed to timer_start (%d)!", res); goto on_fail; } } } i = 0; while (!arg->stop) { ESP_APPTRACE_TEST_LOGD("%x: dummy task work %d.%d", xTaskGetCurrentTaskHandle(), xPortGetCoreID(), i++); if (tmo_ticks) { vTaskDelay(tmo_ticks); } } on_fail: if (inth) { for (int i = 0; i < arg->timers_num; i++) { timer_pause(arg->timers[i].group, arg->timers[i].id); timer_disable_intr(arg->timers[i].group, arg->timers[i].id); if (inth[i]) { esp_intr_free(inth[i]); } } vPortFree(inth); } xSemaphoreGive(arg->done); vTaskDelay(1); vTaskDelete(NULL); }
static void esp_apptrace_test_task(void *p) { esp_apptrace_test_task_arg_t *arg = (esp_apptrace_test_task_arg_t *) p; int res, flags = 0; timer_isr_handle_t *inth = NULL; TickType_t tmo_ticks = arg->data.period / (1000 * portTICK_PERIOD_MS); ESP_APPTRACE_TEST_LOGI("%x: run (period %u us, stamp mask %x, %u timers)", xTaskGetCurrentTaskHandle(), arg->data.period, arg->data.mask, arg->timers_num); if (arg->timers_num > 0) { inth = pvPortMalloc(arg->timers_num * sizeof(timer_isr_handle_t)); if (!inth) { ESP_APPTRACE_TEST_LOGE("Failed to alloc timer ISR handles!"); goto on_fail; } memset(inth, 0, arg->timers_num * sizeof(timer_isr_handle_t)); for (int i = 0; i < arg->timers_num; i++) { esp_apptrace_test_timer_init(arg->timers[i].group, arg->timers[i].id, arg->timers[i].data.period); res = timer_isr_register(arg->timers[i].group, arg->timers[i].id, arg->timers[i].isr_func, &arg->timers[i], flags, &inth[i]); if (res != ESP_OK) { ESP_APPTRACE_TEST_LOGE("Failed to timer_isr_register (%d)!", res); goto on_fail; } *(uint32_t *)arg->timers[i].data.buf = ((uint32_t)inth[i]) | (1 << 31) | (xPortGetCoreID() ? 0x1 : 0); ESP_APPTRACE_TEST_LOGI("%x: start timer %x period %u us", xTaskGetCurrentTaskHandle(), inth[i], arg->timers[i].data.period); res = timer_start(arg->timers[i].group, arg->timers[i].id); if (res != ESP_OK) { ESP_APPTRACE_TEST_LOGE("Failed to timer_start (%d)!", res); goto on_fail; } } } *(uint32_t *)arg->data.buf = (uint32_t)xTaskGetCurrentTaskHandle() | (xPortGetCoreID() ? 0x1 : 0); arg->data.wr_cnt = 0; arg->data.wr_err = 0; while (!arg->stop) { uint32_t *ts = (uint32_t *)(arg->data.buf + sizeof(uint32_t)); *ts = (uint32_t)esp_apptrace_test_ts_get(); memset(arg->data.buf + 2 * sizeof(uint32_t), arg->data.wr_cnt & arg->data.mask, arg->data.buf_sz - 2 * sizeof(uint32_t)); // ESP_APPTRACE_TEST_LOGD("%x:%x: Write chunk%d %d bytes, %x", xTaskGetCurrentTaskHandle(), *ts, arg->data.wr_cnt, arg->data.buf_sz, arg->data.wr_cnt & arg->data.mask); if (arg->nowait) { res = ESP_APPTRACE_TEST_WRITE_NOWAIT(arg->data.buf, arg->data.buf_sz); } else { res = ESP_APPTRACE_TEST_WRITE(arg->data.buf, arg->data.buf_sz); } if (res) { if (1){//arg->data.wr_err++ < ESP_APPTRACE_TEST_PRN_WRERR_MAX) { ESP_APPTRACE_TEST_LOGE("%x: Failed to write trace %d %x!", xTaskGetCurrentTaskHandle(), res, arg->data.wr_cnt & arg->data.mask); if (arg->data.wr_err == ESP_APPTRACE_TEST_PRN_WRERR_MAX) { ESP_APPTRACE_TEST_LOGE("\n"); } } } else { if (0) { ESP_APPTRACE_TEST_LOGD("%x:%x: Written chunk%d %d bytes, %x", xTaskGetCurrentTaskHandle(), *ts, arg->data.wr_cnt, arg->data.buf_sz, arg->data.wr_cnt & arg->data.mask); } arg->data.wr_err = 0; } arg->data.wr_cnt++; if (tmo_ticks) { vTaskDelay(tmo_ticks); } } on_fail: if (inth) { for (int i = 0; i < arg->timers_num; i++) { timer_pause(arg->timers[i].group, arg->timers[i].id); timer_disable_intr(arg->timers[i].group, arg->timers[i].id); if (inth[i]) { esp_intr_free(inth[i]); } } vPortFree(inth); } xSemaphoreGive(arg->done); vTaskDelay(1); vTaskDelete(NULL); }