SylixOS线程创建的流程分析
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,概述本文档的主要内容是分析SylixOS线程创建的流程,详细介绍了SylixOS的线程创建函数API_ThreadCreate。环境和参数检查在SylixOS中,线程的创建函数不能在中断中调用。且在线
千家信息网最后更新 2025年12月03日SylixOS线程创建的流程分析
概述
本文档的主要内容是分析SylixOS线程创建的流程,详细介绍了SylixOS的线程创建函数API_ThreadCreate。
环境和参数检查
在SylixOS中,线程的创建函数不能在中断中调用。且在线程的创建时,系统会对线程的堆栈大小、优先级和名字等参数做有效性检查,一旦参数出错,则线程创建失败。当参数有效性检查完毕后,系统调用_Allocate_Tcb_Object函数,从空闲TCB控件池中取出一个空闲的TCB资源(TCB是线程控制块)。具体的代码实现如程序清单 2-1所示。
程序清单 2-1线程创建的环境和参数检查
/*********************************************************************************************************** 函数名称: API_ThreadCreate** 功能描述: 建立一个线程** 输 入 : pcName 线程名** pfuncThread 指线程代码段起始地址** pthreadattr 线程属性集合指针** pulId 线程生成的ID指针 可以为 NULL** 输 出 : pulId 线程句柄 同 ID 一个概念*********************************************************************************************************/LW_API LW_OBJECT_HANDLE API_ThreadCreate (CPCHAR pcName, PTHREAD_START_ROUTINE pfuncThread, PLW_CLASS_THREADATTR pthreadattr, LW_OBJECT_ID *pulId){ if (LW_CPU_GET_CUR_NESTING()) { /* 不能在中断中调用 */ return (LW_OBJECT_HANDLE_INVALID); } if (threadattrDefault.THREADATTR_stStackByteSize == 0) { threadattrDefault = API_ThreadAttrGetDefault(); /* 初始化默认属性 */ } if (pthreadattr == LW_NULL) { pthreadattr = &threadattrDefault; /* 使用默认属性 */ } /* 默认属性总是使用自动分配堆栈*/ #if LW_CFG_ARG_CHK_EN > 0 if (!pfuncThread) { /* 指线程代码段起始地址为空 */ return (LW_OBJECT_HANDLE_INVALID); } if (_StackSizeCheck(pthreadattr->THREADATTR_stStackByteSize)) { /* 堆栈大小不正确 */ return (LW_OBJECT_HANDLE_INVALID); } if (_PriorityCheck(pthreadattr->THREADATTR_ucPriority)) { /* 优先级错误 */ return (LW_OBJECT_HANDLE_INVALID); }#endif if (_Object_Name_Invalid(pcName)) { /* 检查名字有效性 */ return (LW_OBJECT_HANDLE_INVALID); } __KERNEL_MODE_PROC( ptcb = _Allocate_Tcb_Object(); /* 获得一个 TCB */ ); if (!ptcb) { /* 检查是否可以建立线程 */ return (LW_OBJECT_HANDLE_INVALID); }安全模式
如程序清单 3-1所示,在SylixOS中,系统对线程创建的环境和参数检查完毕后,会进入安全模式,安全模式的主要作用是保护主线程在创建新线程时不被删除。
在第2小节中提到"当参数有效性检查完毕后,系统调用_Allocate_Tcb_Object函数,从空闲TCB控件池中取出一个空闲的TCB资源",需要注意这里只是简单的获得一个TCB资源。当系统调用_TCBBuild函数,对TCB结构体的成员进行赋值后,才真正完成TCB的构建。
程序清单 3-1线程创建的安全模式
if (LW_SYS_STATUS_IS_RUNNING()) { _ThreadSafeInternal(); /* 进入安全模式 */ } lib_bzero(&ptcb->TCB_pstkStackTop, sizeof(LW_CLASS_TCB) - _LIST_OFFSETOF(LW_CLASS_TCB, TCB_pstkStackTop)); /* TCB 清零 */ ulIdTemp = _MakeObjectId(_OBJECT_THREAD, LW_CFG_PROCESSOR_NUMBER, ptcb->TCB_usIndex); /* 构建对象 id */ /* 初始化堆栈,SHELL */ pstkFristFree = archTaskCtxCreate((PTHREAD_START_ROUTINE)_ThreadShell, (PVOID)pfuncThread, /* 真正的可执行代码体 */ pstkTop, pthreadattr->THREADATTR_ulOption); ulError = _TCBBuildExt(ptcb); /* 首先先初始化扩展结构 */ if (ulError) { iErrLevel = 2; _ErrorHandle(ulError); goto __error_handle; } _TCBBuild(pthreadattr->THREADATTR_ucPriority, /* 构建 TCB */ pstkFristFree, /* 空闲栈区地址 */ pstkTop, /* 主栈区地址 */ pstkButtom, /* 栈底 */ pstkGuard, pthreadattr->THREADATTR_pvExt, pstkLowAddress, stStackSize, /* 相对于字对齐的堆栈大小 */ ulIdTemp, pthreadattr->THREADATTR_ulOption, pfuncThread, ptcb, pthreadattr->THREADATTR_pvArg); if (!(pthreadattr->THREADATTR_ulOption & LW_OPTION_THREAD_INIT)) { /* 非仅初始化 */ _TCBTryRun(ptcb); /* 尝试运行新任务 */ } if (pulId) { *pulId = ulIdTemp; /* 记录 ID */ } if (LW_SYS_STATUS_IS_RUNNING()) { _ThreadUnsafeInternal(); /* 退出安全模式 */ } return (LW_OBJECT_HANDLE_INVALID);}在安全模式中,当TCB构建完成后,会调用_TCBTryRun函数,尝试将新创建的线程加入候选表中。若候选表非空且新创建的线程优先级高于候选表里的线程时,会产生优先级卷绕。当CPU下次调度,检测到有优先级卷绕时,CPU会从就绪表中寻找一个最适合运行的线程去运行。
免责声明
内部交流文档,仅针对SylixOS平台,若发现相关错误或者建议,请及时联系文档创建者进行修订和更新。
线程
检查
安全
函数
参数
模式
优先级
堆栈
空闲
系统
有效
代码
地址
属性
有效性
清单
程序
大小
环境
资源
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
戴尔服务器远程管理模块
方舟生存进化服务器开不了控制台
网络技术选型
华为路由器软件开发怎么样
学生管理系统网络服务器功能概述
数据库四个关系模式
工行软件开发 待遇
游戏的网络安全管理怎么取消
网络安全管理制度重要性
软件开发销售的财务处理
网络安全电视电话会议
网页服务器爆满了怎么快速进去
win7安装数据库
最顶尖网络技术在哪
数据库经常被破坏
php留言本数据库设计
辽宁数据网络技术服务价目表
化工专业转行软件开发
虚拟专用网络安全工程师
筑志软件开发责任有限公司
pr创建数据库保存素材
js 加载 缓存数据库
上海智慧人口系统软件开发
新一代软件开发服务应用
闪烁之光水晶之墙服务器
注册苹果id连接不上服务器
网络安全法自何时起执行
虚拟机服务器硬件
武汉誉天网络技术
数据库管理员的自我评价