/********************************************************************************************************* ** 函数名称: API_KernelReboot ** 功能描述: 内核重新启动函数 ** 输 入 : iRebootType 重启类型 LW_REBOOT_FORCE LW_REBOOT_WARM LW_REBOOT_COLD LW_REBOOT_SHUTDOWN LW_REBOOT_POWEROFF ** ulStartAddress 启动地址 ** 输 出 : NONE ** 全局变量: ** 调用模块: API 函数 *********************************************************************************************************/ LW_API VOID API_KernelRebootEx (INT iRebootType, addr_t ulStartAddress) { INTREG iregInterLevel; ULONG ulI; if (iRebootType == LW_REBOOT_FORCE) { archReboot(iRebootType, ulStartAddress); /* 调用体系架构重启操作 */ _BugHandle(LW_TRUE, LW_TRUE, "kernel reboot error!\r\n"); /* 不会运行到这里 */ } if (LW_CPU_GET_CUR_NESTING() || (API_ThreadIdSelf() != API_KernelGetExc())) { _excJobAdd(API_KernelRebootEx, (PVOID)iRebootType, (PVOID)ulStartAddress, 0, 0, 0, 0); return; } _DebugHandle(__LOGMESSAGE_LEVEL, "kernel rebooting...\r\n"); _K_ulRebootStartAddress = ulStartAddress; /* 记录局部变量, 防止 XXX */ #if LW_CFG_SMP_EN > 0 if (LW_NCPUS > 1) { __makeOtherDown(); /* 将其他 CPU 设置为 idle 模式 */ } #endif /* LW_CFG_SMP_EN */ if (iRebootType != LW_REBOOT_FORCE) { __LW_KERNEL_REBOOT_HOOK(iRebootType); /* 调用回调函数 */ _cppRtUninit(); /* 卸载 C++ 运行时 */ } for (ulI = 0; ulI < LW_CFG_MAX_INTER_SRC; ulI++) { API_InterVectorDisable(ulI); /* 关闭所有中断 */ } iregInterLevel = __KERNEL_ENTER_IRQ(); /* 进入内核同时关闭中断 */ #if LW_CFG_CACHE_EN > 0 API_CacheDisable(DATA_CACHE); /* 禁能 CACHE */ API_CacheDisable(INSTRUCTION_CACHE); #endif /* LW_CFG_CACHE_EN > 0 */ #if LW_CFG_VMM_EN > 0 API_VmmMmuDisable(); /* 关闭 MMU */ #endif /* LW_CFG_VMM_EN > 0 */ archReboot(iRebootType, _K_ulRebootStartAddress); /* 调用体系架构重启操作 */ _BugHandle(LW_TRUE, LW_TRUE, "kernel reboot error!\r\n"); /* 不会运行到这里 */ __KERNEL_EXIT_IRQ(iregInterLevel); /* 退出内核同时打开中断 */ }
/********************************************************************************************************* ** 函数名称: sigTrap ** 功能描述: 向指定任务发送信号, 同时停止自己. (本程序在异常上下文中执行) ** 输 入 : ulId 线程 id (不允许为进程号) ** sigvalue 信号参数 ** 输 出 : ERROR or OK ** 全局变量: ** 调用模块: API 函数 *********************************************************************************************************/ LW_API INT sigTrap (LW_OBJECT_HANDLE ulId, const union sigval sigvalue) { REGISTER PLW_CLASS_TCB ptcbCur; if (!LW_CPU_GET_CUR_NESTING()) { /* 必须在异常中 */ _DebugHandle(__ERRORMESSAGE_LEVEL, "not in exception mode.\r\n"); return (PX_ERROR); } LW_TCB_GET_CUR_SAFE(ptcbCur); /* 当前任务控制块 */ __KERNEL_ENTER(); /* 进入内核 */ _ThreadStop(ptcbCur); __KERNEL_EXIT(); /* 退出内核 */ _excJobAdd(__sig_trap, (PVOID)ulId, (PVOID)ptcbCur->TCB_ulId, sigvalue.sival_ptr, 0, 0, 0); return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: sigqueue ** 功能描述: 发送队列类型信号, 如果是进程, 将发送给其主线程. ** 输 入 : ulId 线程 id 或者 进程号 ** iSigNo 信号 ** sigvalue 信号 value ** 输 出 : ERROR or OK ** 全局变量: ** 调用模块: API 函数 *********************************************************************************************************/ LW_API INT sigqueue (LW_OBJECT_HANDLE ulId, INT iSigNo, const union sigval sigvalue) { REGISTER UINT16 usIndex; REGISTER PLW_CLASS_TCB ptcb; LW_SEND_VAL sendval; #if LW_CFG_MODULELOADER_EN > 0 if (ulId < LW_CFG_MAX_THREADS) { /* 进程号 */ ulId = vprocMainThread((pid_t)ulId); } #endif /* LW_CFG_MODULELOADER_EN > 0 */ usIndex = _ObjectGetIndex(ulId); if (!_ObjectClassOK(ulId, _OBJECT_THREAD)) { /* 检查 ID 类型有效性 */ _ErrorHandle(ESRCH); return (PX_ERROR); } if (_Thread_Index_Invalid(usIndex)) { /* 检查线程有效性 */ _ErrorHandle(ESRCH); return (PX_ERROR); } if (!__issig(iSigNo)) { _ErrorHandle(EINVAL); return (PX_ERROR); } if (LW_CPU_GET_CUR_NESTING() || (ulId == API_ThreadIdSelf())) { _excJobAdd((VOIDFUNCPTR)sigqueue, (PVOID)ulId, (PVOID)iSigNo, (PVOID)sigvalue.sival_ptr, 0, 0, 0); return (ERROR_NONE); } #if LW_CFG_SMP_EN > 0 if (LW_NCPUS > 1) { /* 正工作在 SMP 多核模式 */ if (API_ThreadStop(ulId)) { return (PX_ERROR); } } #endif /* LW_CFG_SMP_EN */ __KERNEL_ENTER(); /* 进入内核 */ if (_Thread_Invalid(usIndex)) { __KERNEL_EXIT(); /* 退出内核 */ _ErrorHandle(ESRCH); return (PX_ERROR); } ptcb = __GET_TCB_FROM_INDEX(usIndex); if (ptcb->TCB_iDeleteProcStatus) { __KERNEL_EXIT(); /* 退出内核 */ _ErrorHandle(ERROR_THREAD_OTHER_DELETE); return (PX_ERROR); } sendval = _doSigQueue(ptcb, iSigNo, sigvalue); #if LW_CFG_SMP_EN > 0 if (LW_NCPUS > 1) { /* 正工作在 SMP 多核模式 */ _ThreadContinue(ptcb, LW_FALSE); /* 在内核状态下唤醒被停止线程 */ } #endif /* LW_CFG_SMP_EN */ __KERNEL_EXIT(); /* 退出内核 */ #if LW_CFG_SIGNALFD_EN > 0 if (sendval == SEND_BLOCK) { _sigfdReadUnblock(ulId, iSigNo); } #endif /* LW_CFG_SIGNALFD_EN > 0 */ return (ERROR_NONE); }