/********************************************************************************************************* ** 函数名称: usrStartup ** 功能描述: 初始化应用相关组件, 创建操作系统的第一个任务. ** 输 入 : NONE ** 输 出 : NONE ** 全局变量: ** 调用模块: *********************************************************************************************************/ static VOID usrStartup (VOID) { LW_CLASS_THREADATTR threakattr; /* * 注意, 不要修改该初始化顺序 (必须先初始化 vmm 才能正确的初始化 cache, * 网络需要其他资源必须最后初始化) */ halIdleInit(); #if LW_CFG_CPU_FPU_EN > 0 halFpuInit(); #endif /* LW_CFG_CPU_FPU_EN > 0 */ #if LW_CFG_RTC_EN > 0 halTimeInit(); #endif /* LW_CFG_RTC_EN > 0 */ #if LW_CFG_VMM_EN > 0 halVmmInit(); #endif /* LW_CFG_VMM_EN > 0 */ #if LW_CFG_CACHE_EN > 0 halCacheInit(); #endif /* LW_CFG_CACHE_EN > 0 */ API_ThreadAttrBuild(&threakattr, __LW_THREAD_BOOT_STK_SIZE, LW_PRIO_CRITICAL, LW_OPTION_THREAD_STK_CHK, LW_NULL); API_ThreadCreate("t_boot", (PTHREAD_START_ROUTINE)halBootThread, &threakattr, LW_NULL); /* Create boot thread */ }
/********************************************************************************************************* ** 函数名称: _netJobqueueInit ** 功能描述: 初始化 Net jobqueue 处理 机制 ** 输 入 : NONE ** 输 出 : 是否初始化成功 ** 全局变量: ** 调用模块: *********************************************************************************************************/ INT _netJobqueueInit (VOID) { LW_OBJECT_HANDLE hNetJobThread; LW_CLASS_THREADATTR threadattr; if (_jobQueueInit(&_G_jobqNet, &_G_jobmsgNet[0], LW_CFG_LWIP_JOBQUEUE_SIZE, LW_FALSE)) { return (PX_ERROR); } API_ThreadAttrBuild(&threadattr, LW_CFG_LWIP_STK_SIZE, LW_PRIO_T_NETJOB, (LW_OPTION_THREAD_STK_CHK | LW_OPTION_THREAD_SAFE | LW_OPTION_OBJECT_GLOBAL), LW_NULL); hNetJobThread = API_ThreadCreate("t_netjob", (PTHREAD_START_ROUTINE)_NetJobThread, (PLW_CLASS_THREADATTR)&threadattr, LW_NULL); /* 建立 job 处理线程 */ if (!hNetJobThread) { _jobQueueFinit(&_G_jobqNet); return (PX_ERROR); } return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: _excInit ** 功能描述: 初始化 异常处理 机制 ** 输 入 : NONE ** 输 出 : 是否初始化成功 ** 全局变量: ** 调用模块: *********************************************************************************************************/ INT _excInit (VOID) { LW_CLASS_THREADATTR threadattr; if (_jobQueueInit(&_G_jobqExc, &_G_jobmsgExc[0], MAX_EXC_MSG_NUM, LW_FALSE)) { return (PX_ERROR); } API_ThreadAttrBuild(&threadattr, LW_CFG_THREAD_SIG_STK_SIZE, LW_PRIO_T_EXCPT, /* 最高优先级 */ (LW_OPTION_THREAD_STK_CHK | LW_OPTION_THREAD_SAFE | LW_OPTION_OBJECT_GLOBAL), LW_NULL); _S_ulThreadExceId = API_ThreadCreate("t_except", (PTHREAD_START_ROUTINE)_ExcThread, &threadattr, LW_NULL); /* 建立异常处理线程 */ if (!_S_ulThreadExceId) { _jobQueueFinit(&_G_jobqExc); return (PX_ERROR); } return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: _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 }
/********************************************************************************************************* ** 函数名称: _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 */ }
/********************************************************************************************************* ** 函数名称: _hotplugInit ** 功能描述: 初始化 hotplug 库 ** 输 入 : NONE ** 输 出 : 是否初始化成功 ** 全局变量: ** 调用模块: *********************************************************************************************************/ INT _hotplugInit (VOID) { LW_OBJECT_HANDLE hHotplugThread; LW_CLASS_THREADATTR threadattr; if (_jobQueueInit(&_G_jobqHotplug, &_G_jobmsgHotplug[0], LW_CFG_HOTPLUG_MAX_MSGS, LW_FALSE)) { return (PX_ERROR); } _G_hHotplugLock = API_SemaphoreMCreate("hotplug_lock", LW_PRIO_DEF_CEILING, LW_OPTION_INHERIT_PRIORITY | LW_OPTION_DELETE_SAFE | LW_OPTION_WAIT_FIFO | LW_OPTION_OBJECT_GLOBAL, LW_NULL); /* 建立 poll 链操作锁 */ if (!_G_hHotplugLock) { _jobQueueFinit(&_G_jobqHotplug); return (PX_ERROR); } API_ThreadAttrBuild(&threadattr, LW_CFG_THREAD_HOTPLUG_STK_SIZE, LW_PRIO_T_SYSMSG, (LW_CFG_HOTPLUG_OPTION | LW_OPTION_THREAD_SAFE | LW_OPTION_OBJECT_GLOBAL), LW_NULL); hHotplugThread = API_ThreadCreate("t_hotplug", (PTHREAD_START_ROUTINE)_hotplugThread, (PLW_CLASS_THREADATTR)&threadattr, LW_NULL); /* 建立 job 处理线程 */ if (!hHotplugThread) { API_SemaphoreMDelete(&_G_hHotplugLock); _jobQueueFinit(&_G_jobqHotplug); return (PX_ERROR); } _G_hHotplug = hHotplugThread; #if LW_CFG_DEVICE_EN > 0 _hotplugDrvInstall(); /* 初始化热插拔消息设备 */ _hotplugDevCreate(); #endif /* LW_CFG_DEVICE_EN > 0 */ return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: 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); }