void usb_cdc_dump_stat(usb_cdc_class_t * cl) { struct usb_cdc_acm_dev * dev = (struct usb_cdc_acm_dev *)cl; struct thinkos_rt rt; (void)dev; thinkos_rt_snapshot(&rt); DCC_LOG5(LOG_INFO, "ep=%d wr=%d blk=%d TX_DONE(%d)=%d", tx_ep, tx_wr, tx_blk, TX_DONE, thinkos_flag_val(TX_DONE)); thinkos_trace_rt(&rt); }
void busy_test(void) { int th[4]; uint32_t x[4]; uint32_t y[4]; uint32_t d[4]; uint32_t sum; uint32_t ref; uint32_t wrk; struct thinkos_rt rt; uint32_t cycsum; int ret; int i; int j; printf("---------------------------------------------------------\n"); printf(" - Scheduler test\n"); thinkos_rt_snapshot(&rt); thinkos_sleep(1000); thinkos_rt_snapshot(&rt); cycsum = 0; for (j = 0; j < THINKOS_THREADS_MAX + 1; ++j) { uint32_t cyc = rt.cyccnt[j]; cycsum += cyc; if (cyc > 0) { printf(" * Thread %d: %9d cycles.\n", j, cyc); } } printf(" * Total: %9d cycles.\n", cycsum); for (i = 0; i < 4; i++) { dev[i].enabled = true; dev[i].cnt = 0; } th[0] = thinkos_thread_create(busy_task, (void *)&dev[0], stack[0], STACK_SIZE | THINKOS_OPT_PRIORITY(2) | THINKOS_OPT_ID(8)); th[1] = thinkos_thread_create(busy_task, (void *)&dev[1], stack[1], STACK_SIZE | THINKOS_OPT_PRIORITY(4) | THINKOS_OPT_ID(8)); th[2] = thinkos_thread_create(busy_task, (void *)&dev[2], stack[2], STACK_SIZE | THINKOS_OPT_PRIORITY(6) | THINKOS_OPT_ID(8)); th[3] = thinkos_thread_create(busy_task, (void *)&dev[3], stack[3], STACK_SIZE | THINKOS_OPT_PRIORITY(8) | THINKOS_OPT_ID(8)); printf(" * Thread: %8d %8d %8d %8d\n", th[0], th[1], th[2], th[3]); for (i = 0; i < 8; i++) { x[0] = dev[0].cnt; x[1] = dev[1].cnt; x[2] = dev[2].cnt; x[3] = dev[3].cnt; thinkos_rt_snapshot(&rt); thinkos_sleep(1000); thinkos_rt_snapshot(&rt); y[0] = dev[0].cnt; y[1] = dev[1].cnt; y[2] = dev[2].cnt; y[3] = dev[3].cnt; d[0] = y[0] - x[0]; d[1] = y[1] - x[1]; d[2] = y[2] - x[2]; d[3] = y[3] - x[3]; sum = d[0] + d[1] + d[2] + d[3]; /* XXX: reusing x, to scale down the deltas. This is to avoid overflowing the percentage calculations */ x[0] = (d[0] + 50) / 100; x[1] = (d[1] + 50) / 100; x[2] = (d[2] + 50) / 100; x[3] = (d[3] + 50) / 100; /* scale down the total sum */ wrk = sum / 100; ref = d[3]; printf("%d.\n", i); printf(" * Oper: %8d + %8d + %8d + %8d = %8d (%d idle)\n", d[0], d[1], d[2], d[3], sum, thinkos_idle_val()); printf(" * Work: %7d%% %7d%% %7d%% %7d%% = %7d%%\n", (d[0] + wrk / 2) / wrk, (d[1] + wrk / 2) / wrk, (d[2] + wrk / 2) / wrk, (d[3] + wrk / 2) / wrk, (sum + wrk / 2) / wrk); printf(" * Nice: %7d%% %7d%% %7d%% %7d%%\n", (ref + x[0] / 2) / x[0], (ref + x[1] / 2) / x[1], (ref + x[2] / 2) / x[2], (ref + x[3] / 2) / x[3]); cycsum = 0; for (j = 0; j < THINKOS_THREADS_MAX + 1; ++j) cycsum += rt.cyccnt[j]; printf(" * Cycles: %8d + %8d + %8d + %8d = %8d (%d idle)\n", rt.cyccnt[th[0]], rt.cyccnt[th[1]], rt.cyccnt[th[2]], rt.cyccnt[th[3]], cycsum, rt.cyccnt[THINKOS_THREADS_MAX]); } printf("\n"); for (i = 0; i < 4; i++) { dev[i].enabled = false; printf(" * join(%d) ...", th[i]); ret = thinkos_join(th[i]); printf(" %d\n", ret); } printf("---------------------------------------------------------\n"); printf("\n"); }