/********************************************************************************************************* ** 函数名称: _CreateIdleThread ** 功能描述: 内核高层初始化 ** 输 入 : NONE ** 输 出 : NONE ** 全局变量: ** 调用模块: ** 注 意 : 最先建立的一定要是 idle 线程, 为每一个 SMP CPU 都建立一个. *********************************************************************************************************/ static VOID _CreateIdleThread (VOID) { #if LW_CFG_SMP_EN > 0 REGISTER INT i; LW_CLASS_CPUSET cpuset; #endif LW_CLASS_THREADATTR threadattr; API_ThreadAttrBuild(&threadattr, LW_CFG_THREAD_IDLE_STK_SIZE, LW_PRIO_IDLE, (LW_OPTION_THREAD_STK_CHK | LW_OPTION_THREAD_SAFE | LW_OPTION_OBJECT_GLOBAL | LW_OPTION_THREAD_AFFINITY_ALWAYS), (PVOID)0); #if LW_CFG_SMP_EN > 0 LW_CPU_ZERO(&cpuset); for (i = 0; i < LW_NCPUS; i++) { CHAR cIdle[LW_CFG_OBJECT_NAME_SIZE] = "t_idle"; lib_itoa(i, &cIdle[6], 10); API_ThreadAttrSetArg(&threadattr, (PVOID)i); _K_ulIdleId[i] = API_ThreadInit(cIdle, _IdleThread, &threadattr, LW_NULL); _K_ptcbIdle[i] = _K_ptcbTCBIdTable[_ObjectGetIndex(_K_ulIdleId[i])]; _K_ptcbIdle[i]->TCB_ucSchedPolicy = LW_OPTION_SCHED_FIFO; /* idle 必须是 FIFO 调度器 */ LW_CPU_SET(i, &cpuset); /* 锁定到指定 CPU */ _ThreadSetAffinity(_K_ptcbIdle[i], sizeof(LW_CLASS_CPUSET), &cpuset); LW_CPU_CLR(i, &cpuset); API_ThreadStart(_K_ulIdleId[i]); } #else _K_ulIdleId[0] = API_ThreadInit("t_idle", _IdleThread, &threadattr, LW_NULL); _K_ptcbIdle[0] = _K_ptcbTCBIdTable[_ObjectGetIndex(_K_ulIdleId[0])]; _K_ptcbIdle[0]->TCB_ucSchedPolicy = LW_OPTION_SCHED_FIFO; /* idle 必须是 FIFO 调度器 */ API_ThreadStart(_K_ulIdleId[0]); #endif /* LW_CFG_SMP_EN > 0 */ }
/********************************************************************************************************* ** 函数名称: _CreateITimerThread ** 功能描述: 内核高层初始化 ** 输 入 : NONE ** 输 出 : NONE ** 全局变量: ** 调用模块: *********************************************************************************************************/ static VOID _CreateITimerThread (VOID) { #if (LW_CFG_ITIMER_EN > 0) && (LW_CFG_MAX_TIMERS > 0) LW_CLASS_THREADATTR threadattr; API_ThreadAttrBuild(&threadattr, LW_CFG_THREAD_ITMR_STK_SIZE, LW_PRIO_T_TTIMER, (LW_CFG_ITIMER_OPTION | LW_OPTION_THREAD_SAFE | LW_OPTION_OBJECT_GLOBAL), LW_NULL); _K_ulThreadItimerId = API_ThreadInit("t_itimer", _ITimerThread, &threadattr, LW_NULL); API_ThreadStart(_K_ulThreadItimerId); #endif }
/********************************************************************************************************* ** 函数名称: API_TShellCreateEx ** 功能描述: 创建一个 ttiny shell 系统, SylixOS 支持多个终端设备同时运行. ** tshell 可以使用标准 tty 设备, 或者 pty 虚拟终端设备. ** 输 入 : iTtyFd 终端设备的文件描述符 ** ulOption 启动参数 ** pfuncRunCallback 初始化完毕后, 启动回调 ** 输 出 : shell 线程的句柄. ** 全局变量: ** 调用模块: API 函数 *********************************************************************************************************/ LW_API LW_OBJECT_HANDLE API_TShellCreateEx (INT iTtyFd, ULONG ulOption, FUNCPTR pfuncRunCallback) { LW_CLASS_THREADATTR threadattrTShell; LW_OBJECT_HANDLE hTShellHandle; INT iKernelFile; PLW_CLASS_TCB ptcbShell; _DebugHandle(__LOGMESSAGE_LEVEL, "ttniy shell system initialize...\r\n"); if (!isatty(iTtyFd)) { /* 检测是否为终端设备 */ _DebugHandle(__ERRORMESSAGE_LEVEL, "is not a tty or pty device.\r\n"); _DebugHandle(__LOGMESSAGE_LEVEL, "ttniy shell system is not initialize.\r\n"); return (0); } API_TShellInit(); /* 初始化 shell */ if (__PROC_GET_PID_CUR() != 0) { /* 在进程中启动 */ iKernelFile = dup2kernel(iTtyFd); /* 将此文件描述符 dup 到 kernel*/ if (iKernelFile < 0) { return (0); } ulOption |= LW_OPTION_TSHELL_CLOSE_FD; /* 执行完毕后需要关闭文件 */ pfuncRunCallback = LW_NULL; /* 进程创建不得安装回调 */ } else { iKernelFile = iTtyFd; } API_ThreadAttrBuild(&threadattrTShell, _G_stShellStackSize, /* shell 堆栈大小 */ LW_PRIO_T_SHELL, LW_CFG_SHELL_THREAD_OPTION | LW_OPTION_OBJECT_GLOBAL, (PVOID)iKernelFile); /* 构建属性块 */ hTShellHandle = API_ThreadInit("t_tshell", __tshellThread, &threadattrTShell, LW_NULL); /* 创建 tshell 线程 */ if (!hTShellHandle) { if (__PROC_GET_PID_CUR() != 0) { /* 在进程中启动 */ __KERNEL_SPACE_ENTER(); close(iKernelFile); /* 内核中关闭 dup 到内核的文件 */ __KERNEL_SPACE_EXIT(); } _DebugHandle(__ERRORMESSAGE_LEVEL, "tshell thread can not create.\r\n"); _DebugHandle(__LOGMESSAGE_LEVEL, "ttniy shell system is not initialize.\r\n"); return (0); } ptcbShell = __GET_TCB_FROM_INDEX(_ObjectGetIndex(hTShellHandle)); __TTINY_SHELL_SET_OPT(ptcbShell, ulOption); /* 初始化选项 */ __TTINY_SHELL_SET_CALLBACK(ptcbShell, pfuncRunCallback); /* 初始化启动回调 */ API_ThreadStart(hTShellHandle); /* 启动 shell 线程 */ return (hTShellHandle); }