rel_1.6.0 init

This commit is contained in:
guocheng.kgc 2020-06-18 20:06:52 +08:00 committed by shengdong.dsd
commit 27b3e2883d
19359 changed files with 8093121 additions and 0 deletions

View file

@ -0,0 +1,3 @@
1 Open the compile switch CONFIG_TEST_PERFORMANCE in the defconfig
2 Performance test only support csky 802 mow.

View 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

View 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);
}

View 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);
}

View 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");
}

View 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);
}

View 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);
}

View 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);
}

View 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);
}