SylixOS线程创建的流程分析
来源:互联网 发布:经传软件指标全集 编辑:程序博客网 时间:2024/04/30 09:14
概述
本文档的主要内容是分析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平台,若发现相关错误或者建议,请及时联系文档创建者进行修订和更新。
阅读全文
1 0
- SylixOS线程创建的流程分析
- SylixOS单个线程的退出方式
- SylixOS中MTD调用底层接口流程分析
- SylixOS中断流程
- SylixOS中断流程
- SylixOS 基于AT91SAM9X25的CAN总线传输流程解析
- SylixOS线程调度浅析
- SylixOS线程间通信-SylixOS信号量
- 线程创建流程
- NTPL线程创建流程
- 内核的创建流程与代码分析
- Windows进程创建的流程分析。
- Windows进程创建的流程分析
- Windows进程创建的流程分析
- ceph的pool创建流程--代码分析
- cinder创建volume的流程分析
- SylixOS Makefile分析
- SylixOS启动脚本分析
- 洛谷P1015回文数
- python实现校园网自动登录
- 第三方实用控件 未完待续
- ecplise 选择工作空间启动出错(java9)
- 【大组会整理】深度生成模型可视化刘世霞深度生成网络可视化
- SylixOS线程创建的流程分析
- (全网最详细!)bzoj 2548 灭鼠行动 模拟 解题报告
- C++对传参和传返回值时构造的优化处理
- 艾伦人工智能研究所CEO Oren Etzioni:深度学习离人类水平的人工智能还差得很远
- Java-数据库
- 从 13 年开发史中,谷歌无人车之父预见自动驾驶的未来
- 冒泡排序的改进
- GMIS 2017大会杨洋演讲:认知分析-透过机器重新审视商业本质
- GMIS 2017 大会杨琼演讲:人工智能+医疗——噱头,还是未来?