mirror of
https://github.com/Ai-Thinker-Open/Ai-Thinker-Open_RTL8710BX_ALIOS_SDK.git
synced 2026-07-13 21:45:38 +00:00
rel_1.6.0 init
This commit is contained in:
commit
27b3e2883d
19359 changed files with 8093121 additions and 0 deletions
3
Living_SDK/kernel/rhino/test/perf/README.txt
Normal file
3
Living_SDK/kernel/rhino/test/perf/README.txt
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
1 Open the compile switch CONFIG_TEST_PERFORMANCE in the defconfig
|
||||
2 Performance test only support csky 802 mow.
|
||||
|
||||
115
Living_SDK/kernel/rhino/test/perf/intrealtime.c
Normal file
115
Living_SDK/kernel/rhino/test/perf/intrealtime.c
Normal file
|
|
@ -0,0 +1,115 @@
|
|||
/*
|
||||
* Copyright (C) 2015-2017 Alibaba Group Holding Limited
|
||||
*/
|
||||
|
||||
#include <k_api.h>
|
||||
#include "stdio.h"
|
||||
|
||||
#define RELOAD (unsigned long )40000
|
||||
#define NUM 100
|
||||
|
||||
extern ksem_t *SYNhandle;
|
||||
extern void WaitForNew_tick(void);
|
||||
extern double Turn_to_Realtime(double counter);
|
||||
extern void show_times_detail(volatile double *ft, int nsamples,
|
||||
char *title, uint32_t ignore_first);
|
||||
|
||||
extern void hobbit_timer0_stop(void);
|
||||
extern void hobbit_timer0_init(uint32_t hz);
|
||||
extern void hobbit_timer0_start(void);
|
||||
extern uint32_t hobbit_timer0_get_curval(void);
|
||||
extern void hobbit_timer0_clr(void);
|
||||
|
||||
static double InTimeBUFF[sizeof(double)*NUM] ;
|
||||
static volatile uint32_t INT_NUM ;
|
||||
static unsigned long Endtime;
|
||||
static unsigned long starttime;
|
||||
|
||||
|
||||
void IntRealtimetest(void *arg)
|
||||
{
|
||||
WaitForNew_tick();
|
||||
unsigned short i;
|
||||
INT_NUM = 0;
|
||||
|
||||
memset(InTimeBUFF, 0, sizeof(double)*NUM);
|
||||
|
||||
hobbit_timer0_stop();
|
||||
hobbit_timer0_init(RELOAD);
|
||||
hobbit_timer0_start();
|
||||
|
||||
while (INT_NUM < NUM);
|
||||
|
||||
for (i = 0; i < NUM; i++) {
|
||||
InTimeBUFF[i] = (double) Turn_to_Realtime(InTimeBUFF[i]);
|
||||
}
|
||||
|
||||
show_times_detail(InTimeBUFF, NUM, "IntTime\t", 1);
|
||||
|
||||
krhino_sem_give(SYNhandle);
|
||||
|
||||
krhino_task_yield();
|
||||
|
||||
}
|
||||
|
||||
void SoftIntRealtimetest(void *arg)
|
||||
{
|
||||
WaitForNew_tick();
|
||||
unsigned short i;
|
||||
INT_NUM = 0;
|
||||
|
||||
hobbit_timer0_stop();
|
||||
hobbit_timer0_init(RELOAD);
|
||||
|
||||
memset(InTimeBUFF, 0, sizeof(double)*NUM);
|
||||
|
||||
hobbit_timer0_start();
|
||||
|
||||
do {
|
||||
starttime = hobbit_timer0_get_curval();
|
||||
__asm__("trap 1");
|
||||
|
||||
} while (INT_NUM < NUM);
|
||||
|
||||
hobbit_timer0_stop();
|
||||
|
||||
for (i = 0; i < NUM; i++) {
|
||||
InTimeBUFF[i] = (double) Turn_to_Realtime(InTimeBUFF[i]);
|
||||
}
|
||||
|
||||
show_times_detail(InTimeBUFF, NUM, "SoftIntTime\t", 1);
|
||||
|
||||
krhino_sem_give(SYNhandle);
|
||||
|
||||
krhino_task_yield();
|
||||
|
||||
}
|
||||
|
||||
#ifdef CONFIG_TEST_PERFORMANCE
|
||||
void __attribute__((isr)) timer0_handler(void)
|
||||
{
|
||||
Endtime = hobbit_timer0_get_curval();
|
||||
hobbit_timer0_stop();
|
||||
hobbit_timer0_clr();
|
||||
InTimeBUFF[INT_NUM] = (double)(RELOAD - Endtime);
|
||||
INT_NUM ++;
|
||||
|
||||
if (INT_NUM < NUM) {
|
||||
hobbit_timer0_start();
|
||||
}
|
||||
}
|
||||
#else
|
||||
void timer0_handler(void)
|
||||
{
|
||||
Endtime = hobbit_timer0_get_curval();
|
||||
hobbit_timer0_stop();
|
||||
hobbit_timer0_clr();
|
||||
InTimeBUFF[INT_NUM] = (double)(RELOAD - Endtime);
|
||||
INT_NUM ++;
|
||||
|
||||
if (INT_NUM < NUM) {
|
||||
hobbit_timer0_start();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
133
Living_SDK/kernel/rhino/test/perf/mutex.c
Normal file
133
Living_SDK/kernel/rhino/test/perf/mutex.c
Normal file
|
|
@ -0,0 +1,133 @@
|
|||
/*
|
||||
* Copyright (C) 2015-2017 Alibaba Group Holding Limited
|
||||
*/
|
||||
|
||||
#include <k_api.h>
|
||||
#include "stdio.h"
|
||||
|
||||
#define TASK_TEST_PRI 20
|
||||
#define TASK_MAIN_PRI 15
|
||||
#define TASK_TEST_STACK_SIZE 1024
|
||||
#define SWITCH_NUM 100
|
||||
|
||||
extern ksem_t *SYNhandle;
|
||||
extern void WaitForNew_tick(void);
|
||||
extern double Turn_to_Realtime(double counter);
|
||||
extern void show_times_detail(volatile double *ft, int nsamples,
|
||||
char *title, uint32_t ignore_first);
|
||||
|
||||
extern void hobbit_timer0_stop(void);
|
||||
extern void hobbit_timer0_init(uint32_t hz);
|
||||
extern void hobbit_timer0_start(void);
|
||||
extern uint32_t hobbit_timer0_get_curval(void);
|
||||
extern void hobbit_timer0_clr(void);
|
||||
|
||||
static volatile unsigned long Starttime, Endtime, Runtime;
|
||||
static double ShufBUFF[sizeof(double)*SWITCH_NUM] ;
|
||||
static volatile unsigned long ShufSwitch = 0;
|
||||
static ksem_t *Shufhandle_1;
|
||||
static kmutex_t Shufhandle_0;
|
||||
static ktask_t *ShufTaskHandle[2];
|
||||
static ksem_t *ShufSynhandle;
|
||||
|
||||
|
||||
static uint8_t task_pri_get(ktask_t *task)
|
||||
{
|
||||
CPSR_ALLOC();
|
||||
|
||||
uint8_t pri;
|
||||
|
||||
RHINO_CRITICAL_ENTER();
|
||||
|
||||
pri = task->prio;
|
||||
|
||||
RHINO_CRITICAL_EXIT();
|
||||
|
||||
return pri;
|
||||
}
|
||||
|
||||
static void MutexShuf1(void *arg)
|
||||
{
|
||||
unsigned long OurPriority;
|
||||
uint8_t oldpri;
|
||||
|
||||
while (1) {
|
||||
krhino_mutex_lock(&Shufhandle_0, RHINO_WAIT_FOREVER);
|
||||
OurPriority = task_pri_get(krhino_cur_task_get());
|
||||
krhino_task_pri_change(ShufTaskHandle[1], OurPriority - 1, &oldpri);
|
||||
|
||||
Starttime = hobbit_timer0_get_curval();
|
||||
krhino_mutex_unlock(&Shufhandle_0);
|
||||
|
||||
krhino_sem_take(Shufhandle_1, RHINO_WAIT_FOREVER);
|
||||
|
||||
if (ShufSwitch >= SWITCH_NUM) {
|
||||
krhino_sem_give(ShufSynhandle);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void MutexShuf2(void *arg)
|
||||
{
|
||||
unsigned long Priority;
|
||||
uint8_t oldpri;
|
||||
|
||||
while (1) {
|
||||
krhino_mutex_lock(&Shufhandle_0, RHINO_WAIT_FOREVER);
|
||||
|
||||
Endtime = hobbit_timer0_get_curval();
|
||||
Runtime = Starttime - Endtime;
|
||||
|
||||
ShufBUFF[ShufSwitch] = (double)Runtime;
|
||||
|
||||
krhino_mutex_unlock(&Shufhandle_0);
|
||||
krhino_sem_give(Shufhandle_1);
|
||||
ShufSwitch++;
|
||||
|
||||
if (ShufSwitch >= SWITCH_NUM) {
|
||||
krhino_sem_give(ShufSynhandle);
|
||||
|
||||
}
|
||||
|
||||
Priority = task_pri_get(ShufTaskHandle[0]);
|
||||
krhino_task_pri_change(krhino_cur_task_get(), Priority + 1, &oldpri);
|
||||
}
|
||||
}
|
||||
|
||||
void MutexShufTimetest(void *arg)
|
||||
{
|
||||
unsigned long i ;
|
||||
|
||||
WaitForNew_tick();
|
||||
ShufSwitch = 0;
|
||||
|
||||
hobbit_timer0_stop();
|
||||
hobbit_timer0_init(0xffffffff);
|
||||
|
||||
memset(ShufBUFF, 0, sizeof(double)*SWITCH_NUM);
|
||||
|
||||
krhino_mutex_create(&Shufhandle_0, "mutex");
|
||||
krhino_sem_dyn_create(&Shufhandle_1, "sem", 0);
|
||||
|
||||
krhino_sem_dyn_create(&ShufSynhandle, "sem", 0);
|
||||
|
||||
krhino_task_dyn_create(&ShufTaskHandle[0], "test_task", 0, TASK_TEST_PRI + 1,
|
||||
0, TASK_TEST_STACK_SIZE, MutexShuf1, 1);
|
||||
krhino_task_dyn_create(&ShufTaskHandle[1], "test_task", 0, TASK_TEST_PRI + 2,
|
||||
0, TASK_TEST_STACK_SIZE, MutexShuf2, 1);
|
||||
|
||||
hobbit_timer0_start();
|
||||
krhino_sem_take(ShufSynhandle, RHINO_WAIT_FOREVER);
|
||||
|
||||
krhino_task_dyn_del(ShufTaskHandle[0]);
|
||||
krhino_task_dyn_del(ShufTaskHandle[1]);
|
||||
|
||||
for (i = 0; i < SWITCH_NUM; i++) {
|
||||
ShufBUFF[i] = (double) Turn_to_Realtime(ShufBUFF[i]);
|
||||
}
|
||||
|
||||
show_times_detail(ShufBUFF , SWITCH_NUM, "MutexShuf\t", 1);
|
||||
krhino_task_sleep(20);
|
||||
krhino_sem_give(SYNhandle);
|
||||
}
|
||||
122
Living_SDK/kernel/rhino/test/perf/perf.c
Normal file
122
Living_SDK/kernel/rhino/test/perf/perf.c
Normal file
|
|
@ -0,0 +1,122 @@
|
|||
/*
|
||||
* Copyright (C) 2015-2017 Alibaba Group Holding Limited
|
||||
*/
|
||||
|
||||
#include <k_api.h>
|
||||
#include "stdio.h"
|
||||
|
||||
#define TASK_TEST_PRI 20
|
||||
#define TASK_MAIN_PRI 15
|
||||
#define TASK_TEST_STACK_SIZE 1024
|
||||
|
||||
#define PRECISION 1000000000
|
||||
|
||||
#define APB_DEFAULT_FREQ 20000000
|
||||
|
||||
ktask_t *test_task;
|
||||
ktask_t *main_task;
|
||||
|
||||
ksem_t *SYNhandle;
|
||||
ksem_t *SYNmainhandle;
|
||||
|
||||
double Turn_to_Realtime(double counter);
|
||||
void WaitForNew_tick(void);
|
||||
void OS_RealTime_test(void);
|
||||
|
||||
extern int krhino_bsp_intc_attach_irq(int irq, int isr);
|
||||
extern int krhino_bsp_intc_enable_irq(int irq);;
|
||||
extern void timer0_handler(void);
|
||||
|
||||
extern void show_times_hdr(void);
|
||||
extern void IntRealtimetest(void *arg);
|
||||
extern void TaskYIELDtimeTest(void *arg);
|
||||
extern void PreemptionTimetest(void *arg);
|
||||
extern void MutexShufTimetest(void *arg);
|
||||
extern void BinaryShufTimetest(void *arg);
|
||||
|
||||
|
||||
double Turn_to_Realtime(double counter)
|
||||
{
|
||||
double realtime_us;
|
||||
double US_CLK = (double)(PRECISION / APB_DEFAULT_FREQ) ;
|
||||
return realtime_us = (US_CLK * counter);
|
||||
}
|
||||
|
||||
void WaitForNew_tick(void)
|
||||
{
|
||||
sys_time_t nowtick;
|
||||
nowtick = krhino_sys_tick_get();
|
||||
|
||||
while (krhino_sys_tick_get() == nowtick);
|
||||
}
|
||||
|
||||
|
||||
void OS_test(void *arg)
|
||||
{
|
||||
kstat_t ret;
|
||||
|
||||
WaitForNew_tick();
|
||||
krhino_sem_dyn_create(&SYNhandle, "syn_sem", 0);
|
||||
krhino_sem_dyn_create(&SYNmainhandle, "synmain_sem", 0);
|
||||
show_times_hdr();
|
||||
|
||||
#if 1
|
||||
ret = krhino_task_dyn_create(&test_task, "test_task", 0, TASK_TEST_PRI,
|
||||
0, TASK_TEST_STACK_SIZE, IntRealtimetest, 1);
|
||||
krhino_sem_take(SYNhandle, RHINO_WAIT_FOREVER);
|
||||
krhino_task_dyn_del(test_task);
|
||||
|
||||
krhino_task_sleep(50);
|
||||
#endif
|
||||
|
||||
#if 1
|
||||
krhino_task_dyn_create(&test_task, "test_task", 0, TASK_TEST_PRI,
|
||||
0, TASK_TEST_STACK_SIZE, TaskYIELDtimeTest, 1);
|
||||
krhino_sem_take(SYNhandle, RHINO_WAIT_FOREVER);
|
||||
krhino_task_dyn_del(test_task);
|
||||
krhino_task_sleep(50);
|
||||
#endif
|
||||
|
||||
#if 1
|
||||
krhino_task_dyn_create(&test_task, "test_task", 0, TASK_TEST_PRI,
|
||||
0, TASK_TEST_STACK_SIZE, PreemptionTimetest, 1);
|
||||
krhino_sem_take(SYNhandle, RHINO_WAIT_FOREVER);
|
||||
krhino_task_dyn_del(test_task);
|
||||
|
||||
krhino_task_sleep(50);
|
||||
#endif
|
||||
|
||||
#if 1
|
||||
krhino_task_dyn_create(&test_task, "test_task", 0, TASK_TEST_PRI,
|
||||
0, TASK_TEST_STACK_SIZE, MutexShufTimetest, 1);
|
||||
|
||||
krhino_sem_take(SYNhandle, RHINO_WAIT_FOREVER);
|
||||
krhino_task_dyn_del(test_task);
|
||||
|
||||
krhino_task_sleep(50);
|
||||
#endif
|
||||
|
||||
#if 1
|
||||
krhino_task_dyn_create(&test_task, "test_task", 0, TASK_TEST_PRI,
|
||||
0, TASK_TEST_STACK_SIZE, BinaryShufTimetest, 1);
|
||||
|
||||
krhino_sem_take(SYNhandle, RHINO_WAIT_FOREVER);
|
||||
krhino_task_dyn_del(test_task);
|
||||
|
||||
krhino_task_sleep(50);
|
||||
#endif
|
||||
|
||||
krhino_task_dyn_del(krhino_cur_task_get());
|
||||
|
||||
}
|
||||
|
||||
void OS_RealTime_test(void)
|
||||
{
|
||||
krhino_bsp_intc_enable_irq(2);
|
||||
#ifndef CONFIG_TEST_PERFORMANCE
|
||||
krhino_bsp_intc_attach_irq(2, (int)timer0_handler);
|
||||
#endif
|
||||
krhino_task_dyn_create(&main_task, "main_task", 0, TASK_MAIN_PRI,
|
||||
0, TASK_TEST_STACK_SIZE, OS_test, 1);
|
||||
}
|
||||
|
||||
221
Living_SDK/kernel/rhino/test/perf/realtimelib.c
Normal file
221
Living_SDK/kernel/rhino/test/perf/realtimelib.c
Normal file
|
|
@ -0,0 +1,221 @@
|
|||
/*
|
||||
* Copyright (C) 2015-2017 Alibaba Group Holding Limited
|
||||
*/
|
||||
|
||||
#include <k_api.h>
|
||||
#include <k_config.h>
|
||||
#include "stdio.h"
|
||||
|
||||
#define APB_DEFAULT_FREQ 20000000
|
||||
|
||||
void show_times_hdr(void)
|
||||
{
|
||||
printf("\r\nFreeRTOS Function RealTime Test\r\n");
|
||||
printf("\r\nTesting Parameters:\r\n");
|
||||
printf(" TICK_RATE_HZ : %dHZ\r\n",
|
||||
(unsigned long) RHINO_CONFIG_TICKS_PER_SECOND);
|
||||
printf(" CLOCK_SAMPLE : %dHZ\r\n", (unsigned long) APB_DEFAULT_FREQ);
|
||||
|
||||
printf(" Confidence\r\n");
|
||||
printf(" Ave Min Max Var Ave Min Function SampleNum \r\n");
|
||||
printf("===== ===== ===== ===== ======= ======== ========= \r\n");
|
||||
}
|
||||
|
||||
|
||||
void show_time_in_us(unsigned long result) //ns to us
|
||||
{
|
||||
printf("%03d.%03dus\t", (int)(result / 1000), (int)(result % 1000));
|
||||
}
|
||||
|
||||
void show_times_detail(volatile double *ft, int nsamples, char *title,
|
||||
uint32_t ignore_first)
|
||||
{
|
||||
int i;
|
||||
double delta = 0.0, min = 0.0, max = 0.0, ave_dev = 0.0 , ave = 0.0 ;
|
||||
unsigned int start_sample = 0, total_samples = 0, con_ave = 0, con_min = 0,
|
||||
error = 0;
|
||||
double total = 0.0;
|
||||
|
||||
if (ignore_first) {
|
||||
start_sample = 1;
|
||||
total_samples = nsamples - 1;
|
||||
} else {
|
||||
start_sample = 0;
|
||||
total_samples = nsamples;
|
||||
}
|
||||
|
||||
for (i = start_sample; i < nsamples; i++) {
|
||||
if (ft[i] <= 0) {
|
||||
ft[i] = 0;
|
||||
error ++;
|
||||
}
|
||||
|
||||
total += ft[i];
|
||||
}
|
||||
|
||||
ave = total / (float)(total_samples - error);
|
||||
total = 0.0;
|
||||
min = 0xffffffff;
|
||||
max = 0.0;
|
||||
|
||||
for (i = start_sample; i < nsamples; i++) {
|
||||
if (ft[i] > (10 * ave)) {
|
||||
ft[i] = 0;
|
||||
error ++;
|
||||
}
|
||||
|
||||
delta = ft[i];
|
||||
|
||||
if (delta != 0) {
|
||||
if (delta < min) {
|
||||
min = delta;
|
||||
}
|
||||
|
||||
if (delta > max) {
|
||||
max = delta;
|
||||
}
|
||||
}
|
||||
|
||||
total += delta;
|
||||
}
|
||||
|
||||
ave = total / (float)(total_samples - error);
|
||||
|
||||
total = 0.0;
|
||||
ave_dev = 0.0;
|
||||
|
||||
for (i = start_sample; i < nsamples; i++) {
|
||||
delta = ft[i];
|
||||
|
||||
if (delta != 0) {
|
||||
delta = delta - ave;
|
||||
|
||||
if (delta < 0) {
|
||||
delta = -delta;
|
||||
}
|
||||
|
||||
ave_dev += delta;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
ave_dev /= (float)(total_samples - error);
|
||||
|
||||
con_ave = 0;
|
||||
con_min = 0;
|
||||
|
||||
for (i = start_sample; i < nsamples; i++) {
|
||||
|
||||
delta = ft[i];
|
||||
|
||||
if (delta != 0) {
|
||||
if ((delta <= (ave + ave_dev)) && (delta >= (ave - ave_dev))) {
|
||||
con_ave++;
|
||||
}
|
||||
|
||||
if ((delta <= (min + ave_dev)) && (delta >= (min - ave_dev))) {
|
||||
con_min++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
con_ave = (con_ave * 100) / total_samples;
|
||||
con_min = (con_min * 100) / total_samples;
|
||||
show_time_in_us((unsigned long) ave);
|
||||
show_time_in_us((unsigned long) min);
|
||||
show_time_in_us((unsigned long) max);
|
||||
show_time_in_us((unsigned long) ave_dev);
|
||||
printf(" %d%%, %d%%\t", con_ave, con_min);
|
||||
printf(title);
|
||||
printf(" %d\r\n", total_samples);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void show_times_detail_2(volatile unsigned long ft[], int nsamples,
|
||||
char *title, uint32_t ignore_first)
|
||||
{
|
||||
int i;
|
||||
|
||||
long long delta, min, max, con_ave, con_min, ave_dev;
|
||||
int start_sample, total_samples;
|
||||
long long total, ave;
|
||||
|
||||
if (ignore_first) {
|
||||
start_sample = 1;
|
||||
total_samples = nsamples - 1;
|
||||
} else {
|
||||
start_sample = 0;
|
||||
total_samples = nsamples;
|
||||
}
|
||||
|
||||
total = 0;
|
||||
min = 0x7fffffff;
|
||||
max = 0;
|
||||
|
||||
for (i = start_sample; i < nsamples; i++) {
|
||||
delta = ft[i];
|
||||
delta *= 1000;
|
||||
total += delta;
|
||||
|
||||
if (delta < min) {
|
||||
min = delta;
|
||||
}
|
||||
|
||||
if (delta > max) {
|
||||
max = delta;
|
||||
}
|
||||
}
|
||||
|
||||
ave = total / total_samples;
|
||||
total = 0;
|
||||
ave_dev = 0;
|
||||
|
||||
for (i = start_sample; i < nsamples; i++) {
|
||||
delta = ft[i];
|
||||
delta *= 1000;
|
||||
delta = delta - ave;
|
||||
|
||||
if (delta < 0) {
|
||||
delta = -delta;
|
||||
}
|
||||
|
||||
ave_dev += delta;
|
||||
}
|
||||
|
||||
ave_dev /= total_samples;
|
||||
con_ave = 0;
|
||||
con_min = 0;
|
||||
|
||||
for (i = start_sample; i < nsamples; i++) {
|
||||
delta = ft[i];
|
||||
delta *= 1000;
|
||||
|
||||
if ((delta <= (ave + ave_dev)) && (delta >= (ave - ave_dev))) {
|
||||
con_ave++;
|
||||
}
|
||||
|
||||
if ((delta <= (min + ave_dev)) && (delta >= (min - ave_dev))) {
|
||||
con_min++;
|
||||
}
|
||||
}
|
||||
|
||||
con_ave = (con_ave * 100) / total_samples;
|
||||
con_min = (con_min * 100) / total_samples;
|
||||
show_time_in_us(ave);
|
||||
show_time_in_us(min);
|
||||
show_time_in_us(max);
|
||||
show_time_in_us(ave_dev);
|
||||
printf(" %lld%% %lld%%", con_ave, con_min);
|
||||
printf(" %s\n", title);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
end_of_test_group(void)
|
||||
{
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
|
||||
104
Living_SDK/kernel/rhino/test/perf/sem.c
Normal file
104
Living_SDK/kernel/rhino/test/perf/sem.c
Normal file
|
|
@ -0,0 +1,104 @@
|
|||
/*
|
||||
* Copyright (C) 2015-2017 Alibaba Group Holding Limited
|
||||
*/
|
||||
|
||||
#include <k_api.h>
|
||||
#include "stdio.h"
|
||||
|
||||
#define TASK_TEST_PRI 20
|
||||
#define TASK_MAIN_PRI 15
|
||||
#define TASK_TEST_STACK_SIZE 1024
|
||||
#define SWITCH_NUM 100
|
||||
|
||||
extern ksem_t *SYNhandle;
|
||||
extern void WaitForNew_tick(void);
|
||||
extern double Turn_to_Realtime(double counter);
|
||||
extern void show_times_detail(volatile double *ft, int nsamples,
|
||||
char *title, uint32_t ignore_first);
|
||||
|
||||
extern void hobbit_timer0_stop(void);
|
||||
extern void hobbit_timer0_init(uint32_t hz);
|
||||
extern void hobbit_timer0_start(void);
|
||||
extern uint32_t hobbit_timer0_get_curval(void);
|
||||
extern void hobbit_timer0_clr(void);
|
||||
|
||||
static volatile unsigned long Starttime, Endtime, Runtime;
|
||||
static double ShufBUFF[sizeof(double)*SWITCH_NUM] ;
|
||||
static volatile unsigned long ShufSwitch = 0;
|
||||
static ksem_t *Shufhandle[2];
|
||||
static ktask_t *ShufTaskHandle[2];
|
||||
static ksem_t *ShufSynhandle;
|
||||
|
||||
|
||||
static void BinaryShuf1(void *arg)
|
||||
{
|
||||
while (1) {
|
||||
|
||||
Starttime = hobbit_timer0_get_curval();
|
||||
krhino_sem_give(Shufhandle[0]);
|
||||
krhino_sem_take(Shufhandle[1], RHINO_WAIT_FOREVER);
|
||||
|
||||
if (ShufSwitch >= SWITCH_NUM) {
|
||||
krhino_sem_give(ShufSynhandle);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void BinaryShuf2(void *arg)
|
||||
{
|
||||
WaitForNew_tick();
|
||||
|
||||
while (1) {
|
||||
krhino_sem_take(Shufhandle[0], RHINO_WAIT_FOREVER);
|
||||
|
||||
Endtime = hobbit_timer0_get_curval();
|
||||
Runtime = Starttime - Endtime;
|
||||
|
||||
ShufBUFF[ShufSwitch] = Runtime;
|
||||
krhino_sem_give(Shufhandle[1]);
|
||||
ShufSwitch++;
|
||||
|
||||
if (ShufSwitch >= SWITCH_NUM) {
|
||||
krhino_sem_give(ShufSynhandle);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void BinaryShufTimetest(void *arg)
|
||||
{
|
||||
unsigned long i ;
|
||||
WaitForNew_tick();
|
||||
|
||||
krhino_sem_dyn_create(&ShufSynhandle, "synsem", 0);
|
||||
ShufSwitch = 0;
|
||||
|
||||
hobbit_timer0_stop();
|
||||
hobbit_timer0_init(0xffffffff);
|
||||
|
||||
memset(ShufBUFF, 0, sizeof(double)*SWITCH_NUM);
|
||||
|
||||
krhino_sem_dyn_create(&Shufhandle[0], "sem", 0);
|
||||
krhino_sem_dyn_create(&Shufhandle[1], "sem", 0);
|
||||
|
||||
|
||||
krhino_task_dyn_create(&ShufTaskHandle[0], "test_task", 0, TASK_TEST_PRI + 1,
|
||||
0, TASK_TEST_STACK_SIZE, BinaryShuf1, 1);
|
||||
krhino_task_dyn_create(&ShufTaskHandle[1], "test_task", 0, TASK_TEST_PRI + 1,
|
||||
0, TASK_TEST_STACK_SIZE, BinaryShuf2, 1);
|
||||
|
||||
hobbit_timer0_start();
|
||||
|
||||
krhino_sem_take(ShufSynhandle, RHINO_WAIT_FOREVER);
|
||||
|
||||
krhino_task_dyn_del(ShufTaskHandle[0]);
|
||||
krhino_task_dyn_del(ShufTaskHandle[1]);
|
||||
|
||||
for (i = 0; i < SWITCH_NUM; i++) {
|
||||
ShufBUFF[i] = (double) Turn_to_Realtime(ShufBUFF[i]);
|
||||
}
|
||||
|
||||
show_times_detail(ShufBUFF , SWITCH_NUM, "BinaryShuf\t", 1);
|
||||
krhino_task_sleep(30);
|
||||
krhino_sem_give(SYNhandle);
|
||||
}
|
||||
141
Living_SDK/kernel/rhino/test/perf/taskpree.c
Normal file
141
Living_SDK/kernel/rhino/test/perf/taskpree.c
Normal file
|
|
@ -0,0 +1,141 @@
|
|||
/*
|
||||
* Copyright (C) 2015-2017 Alibaba Group Holding Limited
|
||||
*/
|
||||
|
||||
#include <k_api.h>
|
||||
#include "stdio.h"
|
||||
|
||||
#define TASK_TEST_PRI 20
|
||||
#define TASK_MAIN_PRI 15
|
||||
#define TASK_TEST_STACK_SIZE 1024
|
||||
|
||||
#define PreeTime 100
|
||||
|
||||
extern ksem_t *SYNhandle;
|
||||
extern void WaitForNew_tick(void);
|
||||
extern double Turn_to_Realtime(double counter);
|
||||
extern void show_times_detail(volatile double *ft, int nsamples,
|
||||
char *title, uint32_t ignore_first);
|
||||
|
||||
extern void hobbit_timer0_stop(void);
|
||||
extern void hobbit_timer0_init(uint32_t hz);
|
||||
extern void hobbit_timer0_start(void);
|
||||
extern uint32_t hobbit_timer0_get_curval(void);
|
||||
extern void hobbit_timer0_clr(void);
|
||||
|
||||
static ksem_t *PreeSynhandle;
|
||||
static double PreeBUFF[sizeof(double)*PreeTime] ;
|
||||
static ktask_t *PreeTaskHandle[5];
|
||||
static volatile unsigned long PreeCount = 0;
|
||||
static volatile unsigned long Starttime = 0, Endtime = 0, Runtime = 0;
|
||||
|
||||
static void Preemption0(void *arg)
|
||||
{
|
||||
while (1) {
|
||||
|
||||
Starttime = hobbit_timer0_get_curval();
|
||||
krhino_task_resume(PreeTaskHandle[1]);
|
||||
|
||||
if (PreeCount >= PreeTime) {
|
||||
krhino_sem_give(PreeSynhandle);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void Preemption1(void *arg)
|
||||
{
|
||||
while (1) {
|
||||
|
||||
Endtime = hobbit_timer0_get_curval();
|
||||
Runtime = Starttime - Endtime;
|
||||
|
||||
PreeBUFF[PreeCount++] = (double)Runtime;
|
||||
|
||||
if (PreeCount >= PreeTime) {
|
||||
krhino_sem_give(PreeSynhandle);
|
||||
}
|
||||
|
||||
Starttime = hobbit_timer0_get_curval();
|
||||
krhino_task_resume(PreeTaskHandle[2]);
|
||||
|
||||
krhino_task_suspend(krhino_cur_task_get());
|
||||
}
|
||||
}
|
||||
|
||||
static void Preemption2(void *arg)
|
||||
{
|
||||
while (1) {
|
||||
|
||||
Endtime = hobbit_timer0_get_curval();
|
||||
Runtime = Starttime - Endtime;
|
||||
PreeBUFF[PreeCount++] = (double)Runtime;
|
||||
|
||||
if (PreeCount >= PreeTime) {
|
||||
krhino_sem_give(PreeSynhandle);
|
||||
}
|
||||
|
||||
Starttime = hobbit_timer0_get_curval();
|
||||
krhino_task_resume(PreeTaskHandle[3]);
|
||||
|
||||
krhino_task_suspend(krhino_cur_task_get());
|
||||
}
|
||||
}
|
||||
|
||||
static void Preemption3(void *arg)
|
||||
{
|
||||
while (1) {
|
||||
|
||||
Endtime = hobbit_timer0_get_curval();
|
||||
Runtime = Starttime - Endtime;
|
||||
|
||||
PreeBUFF[PreeCount++] = (double)Runtime;
|
||||
|
||||
if (PreeCount >= PreeTime) {
|
||||
krhino_sem_give(PreeSynhandle);
|
||||
}
|
||||
|
||||
krhino_task_suspend(krhino_cur_task_get());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void PreemptionTimetest(void *arg)
|
||||
{
|
||||
unsigned long i ;
|
||||
WaitForNew_tick();
|
||||
krhino_sem_dyn_create(&PreeSynhandle, "pree", 0);
|
||||
|
||||
hobbit_timer0_stop();
|
||||
hobbit_timer0_init(0xffffffff);
|
||||
|
||||
memset(PreeBUFF, 0, sizeof(double)*PreeTime);
|
||||
krhino_task_dyn_create(&PreeTaskHandle[0], "test_task", 0, TASK_TEST_PRI + 4,
|
||||
0, TASK_TEST_STACK_SIZE, Preemption0, 1);
|
||||
krhino_task_dyn_create(&PreeTaskHandle[1], "test_task", 0, TASK_TEST_PRI + 3,
|
||||
0, TASK_TEST_STACK_SIZE, Preemption1, 1);
|
||||
krhino_task_dyn_create(&PreeTaskHandle[2], "test_task", 0, TASK_TEST_PRI + 2,
|
||||
0, TASK_TEST_STACK_SIZE, Preemption2, 1);
|
||||
krhino_task_dyn_create(&PreeTaskHandle[3], "test_task", 0, TASK_TEST_PRI + 1,
|
||||
0, TASK_TEST_STACK_SIZE, Preemption3, 1);
|
||||
krhino_task_suspend(PreeTaskHandle[1]);
|
||||
krhino_task_suspend(PreeTaskHandle[2]);
|
||||
krhino_task_suspend(PreeTaskHandle[3]);
|
||||
|
||||
hobbit_timer0_start();
|
||||
krhino_sem_take(PreeSynhandle, RHINO_WAIT_FOREVER);
|
||||
|
||||
krhino_task_dyn_del(PreeTaskHandle[0]);
|
||||
krhino_task_dyn_del(PreeTaskHandle[1]);
|
||||
krhino_task_dyn_del(PreeTaskHandle[2]);
|
||||
krhino_task_dyn_del(PreeTaskHandle[3]);
|
||||
|
||||
for (i = 0; i < PreeTime; i++) {
|
||||
PreeBUFF[i] = (double) Turn_to_Realtime(PreeBUFF[i]);
|
||||
}
|
||||
|
||||
show_times_detail(PreeBUFF , PreeTime, "TaskPree\t", 1);
|
||||
krhino_task_sleep(5);
|
||||
krhino_sem_give(SYNhandle);
|
||||
}
|
||||
106
Living_SDK/kernel/rhino/test/perf/taskswitch.c
Normal file
106
Living_SDK/kernel/rhino/test/perf/taskswitch.c
Normal file
|
|
@ -0,0 +1,106 @@
|
|||
/*
|
||||
* Copyright (C) 2015-2017 Alibaba Group Holding Limited
|
||||
*/
|
||||
|
||||
#include <k_api.h>
|
||||
#include "stdio.h"
|
||||
|
||||
#define TASK_TEST_PRI 20
|
||||
#define TASK_MAIN_PRI 15
|
||||
#define TASK_TEST_STACK_SIZE 1024
|
||||
|
||||
extern ksem_t *SYNhandle;
|
||||
extern void WaitForNew_tick(void);
|
||||
extern double Turn_to_Realtime(double counter);
|
||||
extern void show_times_detail(volatile double *ft, int nsamples,
|
||||
char *title, uint32_t ignore_first);
|
||||
|
||||
extern void hobbit_timer0_stop(void);
|
||||
extern void hobbit_timer0_init(uint32_t hz);
|
||||
extern void hobbit_timer0_start(void);
|
||||
extern uint32_t hobbit_timer0_get_curval(void);
|
||||
extern void hobbit_timer0_clr(void);
|
||||
|
||||
#define TASKSWITCH_NUM 100
|
||||
|
||||
static volatile unsigned long TaskSwitch = 0;
|
||||
static ktask_t *xSwitchTaskHandle[2];
|
||||
static volatile unsigned long Starttime, Endtime;
|
||||
static volatile double SwitchTimeBUFF[sizeof(double)*TASKSWITCH_NUM] ;
|
||||
static ksem_t *Switchhandle[2];
|
||||
static ksem_t *SwitchSynhandle;
|
||||
|
||||
|
||||
static void SwitchTask3(void *arg)
|
||||
{
|
||||
while (1) {
|
||||
for (TaskSwitch = 0; TaskSwitch < TASKSWITCH_NUM;) {
|
||||
Starttime = hobbit_timer0_get_curval();
|
||||
krhino_task_yield();
|
||||
Endtime = hobbit_timer0_get_curval();
|
||||
SwitchTimeBUFF[TaskSwitch++] = (double)(Starttime - Endtime);
|
||||
}
|
||||
|
||||
krhino_sem_give(SwitchSynhandle);
|
||||
}
|
||||
}
|
||||
|
||||
static void SwitchTask4(void *arg)
|
||||
{
|
||||
while (1) {
|
||||
for (; TaskSwitch < TASKSWITCH_NUM;) {
|
||||
Endtime = hobbit_timer0_get_curval();
|
||||
SwitchTimeBUFF[TaskSwitch++] = (double)(Starttime - Endtime);
|
||||
Starttime = hobbit_timer0_get_curval();
|
||||
krhino_task_yield();
|
||||
}
|
||||
|
||||
krhino_sem_give(SwitchSynhandle);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void TaskYIELDtimeTest(void *arg)
|
||||
{
|
||||
unsigned long i ;
|
||||
|
||||
krhino_sem_dyn_create(&SwitchSynhandle, "switch", 0);
|
||||
TaskSwitch = 0;
|
||||
WaitForNew_tick();
|
||||
|
||||
hobbit_timer0_stop();
|
||||
|
||||
hobbit_timer0_init(0xffffffff);
|
||||
|
||||
memset((void *)SwitchTimeBUFF, 0, sizeof(double)*TASKSWITCH_NUM);
|
||||
|
||||
krhino_sem_dyn_create(&Switchhandle[0], "s1", 0);
|
||||
|
||||
krhino_sem_dyn_create(&Switchhandle[1], "s1", 0);
|
||||
|
||||
|
||||
krhino_task_dyn_create(&xSwitchTaskHandle[0], "test_task", 0, TASK_TEST_PRI + 1,
|
||||
0, TASK_TEST_STACK_SIZE, SwitchTask3, 1);
|
||||
|
||||
krhino_task_dyn_create(&xSwitchTaskHandle[1], "test_task", 0, TASK_TEST_PRI + 1,
|
||||
0, TASK_TEST_STACK_SIZE, SwitchTask4, 1);
|
||||
|
||||
hobbit_timer0_start();
|
||||
|
||||
krhino_sem_take(SwitchSynhandle, RHINO_WAIT_FOREVER);
|
||||
|
||||
krhino_task_dyn_del(xSwitchTaskHandle[0]);
|
||||
krhino_task_dyn_del(xSwitchTaskHandle[1]);
|
||||
|
||||
|
||||
for (i = 0; i < TASKSWITCH_NUM; i++) {
|
||||
SwitchTimeBUFF[i] = Turn_to_Realtime(SwitchTimeBUFF[i]);
|
||||
|
||||
}
|
||||
|
||||
show_times_detail(SwitchTimeBUFF , TASKSWITCH_NUM, "TaskYIELD\t", 1);
|
||||
krhino_task_sleep(10);
|
||||
|
||||
krhino_sem_give(SYNhandle);
|
||||
|
||||
}
|
||||
78
Living_SDK/kernel/rhino/test/perf/timer.c
Normal file
78
Living_SDK/kernel/rhino/test/perf/timer.c
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
/*
|
||||
* Copyright (C) 2015-2017 Alibaba Group Holding Limited
|
||||
*/
|
||||
|
||||
#include <k_api.h>
|
||||
|
||||
#define putreg32(v, x) (*(volatile uint32_t*)(x) = (v))
|
||||
#define getreg32(x) (*(volatile uint32_t *)(x))
|
||||
#define HOBBIT_TIMER0_BASE (0x50000000)
|
||||
#define TIMER0_LOAD_COUNT (volatile uint32_t *)(HOBBIT_TIMER0_BASE + 0x00)
|
||||
#define TIMER0_CUR_VAL (volatile uint32_t *)(HOBBIT_TIMER0_BASE + 0x04)
|
||||
#define TIMER0_CONTROL (volatile uint32_t *)(HOBBIT_TIMER0_BASE + 0x08)
|
||||
#define TIMER0_EOI (volatile uint32_t *)(HOBBIT_TIMER0_BASE + 0x0C)
|
||||
#define TIMER0_INT_STAT (volatile uint32_t *)(HOBBIT_TIMER0_BASE + 0x10)
|
||||
|
||||
|
||||
|
||||
|
||||
#define TIMER_ENABLE (1UL << 0)
|
||||
#define TIMER_MOD_FREE (0UL << 1)
|
||||
#define TIMER_MOD_USER (1UL << 1)
|
||||
#define TIMER_INT_MASK (1UL << 2)
|
||||
|
||||
static inline uint32_t readreg32(volatile uint32_t *addr)
|
||||
{
|
||||
return *(volatile uint32_t *)addr;
|
||||
}
|
||||
|
||||
static inline void writereg32(uint32_t val, volatile uint32_t *addr)
|
||||
{
|
||||
*(volatile uint32_t *)addr = val;
|
||||
}
|
||||
|
||||
void hobbit_timer0_clr(void)
|
||||
{
|
||||
readreg32(TIMER0_EOI);
|
||||
}
|
||||
|
||||
uint32_t hobbit_timer0_get_curval(void)
|
||||
{
|
||||
return getreg32(TIMER0_CUR_VAL);
|
||||
}
|
||||
|
||||
void hobbit_timer0_stop(void)
|
||||
{
|
||||
uint32_t reg;
|
||||
|
||||
reg = getreg32(TIMER0_CONTROL);
|
||||
reg &= ~(TIMER_ENABLE);
|
||||
putreg32(reg, TIMER0_CONTROL);
|
||||
}
|
||||
|
||||
void hobbit_timer0_init(uint32_t hz)
|
||||
{
|
||||
uint32_t reg;
|
||||
|
||||
writereg32(hz, TIMER0_LOAD_COUNT);
|
||||
|
||||
reg = readreg32(TIMER0_CONTROL);
|
||||
reg |= TIMER_MOD_USER;
|
||||
reg |= TIMER_ENABLE;
|
||||
reg &= ~(TIMER_INT_MASK);
|
||||
writereg32(reg, TIMER0_CONTROL);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void hobbit_timer0_start(void)
|
||||
{
|
||||
uint32_t reg;
|
||||
|
||||
reg = getreg32(TIMER0_CONTROL);
|
||||
reg |= TIMER_ENABLE;
|
||||
putreg32(reg, TIMER0_CONTROL);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue