/* * 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 #include #include extern long ShowTask(void); extern unsigned int msleep(uint64_t msec); #define BATCH_TEST_TASK_SIZE 100 static int32 tid1 = NONE; static int32 tid2 = NONE; static int32 tid3 = NONE; static int32 tid4 = NONE; static int32 tid5 = NONE; static int32 tids[BATCH_TEST_TASK_SIZE]; #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 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 BatchTaskSchedTest(char* parm) { memset(tids, 0, sizeof(int32) * BATCH_TEST_TASK_SIZE); char task_name[20] = "batch_tid_"; for(int i = 0; i < BATCH_TEST_TASK_SIZE;i++){ task_name[9] = (char)(i / 100 + '0'); task_name[10] = (char)((i / 10) % 10 + '0'); task_name[11] = (char)(i % 10 + '0'); task_name[12] = 0; tids[i] = KTaskCreate(task_name, Task2Entry, task_name, 128, 15); if(tids[i] >= 0){ StartupKTask(tids[i]); } } } /********************************************************************/ static void UsageHelp(void) { KPrintf("test_task_ready_usage.\n"); } int TestTaskReadyAndSched(int argc, char * argv[]) { DynamicTaskSchedTest(argv[0]); BatchTaskSchedTest(argv[0]); return 0; }