xiuos/kernel/kernel_test/test_threadsched.c

200 lines
4.5 KiB
C

/*
* Copyright (c) 2020 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
/**
* @file test_threadsched.c
* @brief support to test thread sched function
* @version 1.0
* @author AIIT XUOS Lab
* @date 2021-04-24
*/
#include <xiuos.h>
#include <string.h>
#include <xs_assign.h>
extern long ShowTask(void);
extern unsigned int msleep(uint64_t msec);
static int32 tid1 = NONE;
static int32 tid2 = NONE;
static int32 tid3 = NONE;
static int32 tid4 = NONE;
static int32 tid5 = NONE;
#define DYNAMIC_TASK_STACK_SIZE 3072
#define PRIORITY 15
static void Task1Entry(void *parameter)
{
int cnt = 10;
DoubleLinklistType* node = NONE;
DoubleLinklistType* head = NONE;
struct TaskDescriptor *obj = NONE;
TaskDyncSchedMembeType *tmp = NONE;
register x_base level;
#ifdef ARCH_SMP
if (0 == strncmp(parameter,"-b",strlen("-b"))) { ///< if tasks bind to cpu 0
head = &(Assign.smp_os_assign_ready_rector[0].priority_ready_vector[PRIORITY]);
} else {
head = &(Assign.os_assign_read_vector.priority_ready_vector[PRIORITY]);
}
#else
head = &(Assign.os_assign_read_vector.priority_ready_vector[PRIORITY]);
#endif
while(cnt--) {
#ifdef TOOL_SHELL
ShowTask();
#endif
KPrintf("\n");
DOUBLE_LINKLIST_FOR_EACH(node, head) {
tmp = SYS_DOUBLE_LINKLIST_ENTRY(node, struct TaskDyncSchedMember, sched_link);
obj =CONTAINER_OF(tmp,struct TaskDescriptor, task_dync_sched_member);
KPrintf("task ready table node name = %s node remaining_tick= %d node advance_cnt =%d\n",obj->task_base_info.name,
obj->task_dync_sched_member.rest_timeslice, obj->task_dync_sched_member.advance_cnt);
}
#ifdef ARCH_SMP
#ifdef SCHED_POLICY_FIFO
MdelayKTask(30);
#else
msleep(30);
#endif
#else
#ifdef ARCH_ARM
MdelayKTask(3);
#else
MdelayKTask(80);
#endif
#endif
}
KTaskDelete(tid2);
KTaskDelete(tid3);
KTaskDelete(tid4);
KTaskDelete(tid5);
}
static void Task2Entry(void *parameter)
{
int i = 0;
while(RET_TRUE) {
i++;
}
}
static void Task3Entry(void *parameter)
{
int i = 0;
while(RET_TRUE) {
i++;
}
}
static void Task4Entry(void *parameter)
{
int i = 0;
while(RET_TRUE) {
i++;
}
}
static void Task5Entry(void *parameter)
{
int i = 0;
while(RET_TRUE) {
i++;
}
}
void DynamicTaskSchedTest(char* parm)
{
char t_parm[4];
#ifdef ARCH_SMP
if (0 == strncmp("-b", parm, strlen("-b")) || 0 == strncmp("-bind", parm, strlen("-bind"))){
strncpy(t_parm,"-b", 4);
}
#endif
tid1 = KTaskCreate("d_tid1",
Task1Entry,
t_parm,
DYNAMIC_TASK_STACK_SIZE,
16);
if (tid1 >= 0)
StartupKTask(tid1);
tid2 = KTaskCreate("d_tid2",
Task2Entry,
"d_tid2",
1024,
15);
#ifdef ARCH_SMP
if (0 == strncmp("-b", parm, strlen("-b")) || 0 == strncmp("-bind", parm, strlen("-bind"))){
KTaskCoreCombine(tid2, 0);
}
#endif
if (tid2 >= 0)
StartupKTask(tid2);
tid3 = KTaskCreate("d_tid3",
Task3Entry,
"d_tid3",
1024,
15);
#ifdef ARCH_SMP
if (0 == strncmp("-b", parm, strlen("-b")) || 0 == strncmp("-bind", parm, strlen("-bind"))){
KTaskCoreCombine(tid3, 0);
}
#endif
if (tid3 >= 0)
StartupKTask(tid3);
tid4 = KTaskCreate("d_tid4",
Task4Entry,
"d_tid4",
1024,
15);
#ifdef ARCH_SMP
if (0 == strncmp("-b", parm, strlen("-b")) || 0 == strncmp("-bind", parm, strlen("-bind"))){
KTaskCoreCombine(tid4, 0);
}
#endif
if (tid4 >= 0)
StartupKTask(tid4);
tid5 = KTaskCreate("d_tid5",
Task5Entry,
"d_tid5",
1024,
15);
#ifdef ARCH_SMP
if (0 == strncmp("-b", parm, strlen("-b")) || 0 == strncmp("-bind", parm, strlen("-bind"))){
KTaskCoreCombine(tid5, 0);
}
#endif
if (tid5 >= 0)
StartupKTask(tid5);
}
/********************************************************************/
static void UsageHelp(void)
{
KPrintf("test_task_ready_usage.\n");
}
int TestTaskReadyAndSched(int argc, char * argv[])
{
DynamicTaskSchedTest(argv[0]);
return 0;
}