forked from xuos/xiuos
				
			
		
			
				
	
	
		
			200 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			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 <xizi.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;
 | 
						|
}
 | 
						|
 | 
						|
 |