嵌入式实时操作系统RT-Thread原理与应用第3章 RT-Thread线程管理.docVIP

嵌入式实时操作系统RT-Thread原理与应用第3章 RT-Thread线程管理.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

PAGE18

PAGE17

第3章RT-Thread线程管理

3.1线程管理的功能特点

生活中复杂任务分解为简单小问题解决,多线程系统类似,开发者将程序拆分为可调度单元,合理划分实现实时性能和时间要求。

以嵌入式系统为例,假设需要采集传感器数据并实时显示在屏幕上。在多线程实时系统中,可以将这个任务合理地分解为两个子任务(如图3-1所示)。

第一个子任务负责持续不断地读取传感器数据,并将其写入共享内存中;而第二个子任务则周期性地从共享内存中读取这些数据,并将其显示在屏幕上。通过这种方式,两个子任务协同工作,共同完成了整个复杂任务。

图3-1传感器数据接收任务与显示任务的切换执行

在RT-Thread操作系统中,子任务对应的程序实体是线程。

线程作为实现任务的载体,是RT-Thread中最基本的调度单位。它定义了任务执行的运行环境和优先等级。

对于重要的任务,可以为其设置较高的优先级;而对于不那么重要的任务,则可以设置较低的优先级。不同的任务也可以被设定为相同的优先级,此时它们将轮替运行。

当线程在运行时,它会认为自己独占CPU。线程的运行环境称之为“上下文”,它包含了各类变量和数据,如寄存器变量、堆栈以及内存信息等。

RT-Thread的线程管理主要涵盖了对线程的管理和调度。

在系统中,存在两类线程:系统线程和用户线程。

系统线程是由RT-Thread内核创建的,而用户线程则是由应用程序创建的。

每个线程都具备一些重要的属性,包括线程控制块、线程栈以及入口函数等。

图3-2对象容器与线程对象

RT-Thread线程调度器采用抢占式策略,从就绪列表选最高优先级线程,确保其获得CPU使用权。优先级更高线程满足条件时,当前线程被剥夺CPU,立即切换。

中断服务若激活高优先级线程,中断后高优先级先运行。调度器切换线程时保存并恢复上下文,保证线程正确运行,满足实时性能和资源管理需求。

3.2线程的工作机制

RT-Thread的线程机制通过线程控制块(TCB,ThreadControlBlock)来管理线程的状态、优先级、堆栈等关键属性。

每个线程都拥有独立的堆栈空间和上下文环境。

调度器会根据线程的优先级,选择最合适的线程来执行,并实现线程切换和上下文切换。

线程可以处于就绪、运行、挂起、等待等多种状态,并且可以通过系统调用进行线程的创建、删除、延时以及通信等操作。

3.2.1 线程控制块

在RT-Thread操作系统中,线程控制块由结构体structrt_thread来表示。

这是一个专门用于操作系统管理线程的数据结构,它存储了线程的各种信息,如优先级、线程名称、线程状态等。

其详细定义如下:

/*线程控制块*/

structrt_thread

{

/*rt对象*/

charname[RT_NAME_MAX];/*线程名称*/

rt_uint8_ttype;/*对象类型*

rt_uint8_tflags;/*标志位*/

rt_list_tlist;/*对象列表*/

rt_list_ttlist;/*线程列表*/

/*栈指针与入口指针*/

void*sp;/*栈指针*/

void*entry;/*入口函数指针*/

void*parameter;/*参数*/

void*stack_addr;/*栈地址指针*/

rt_uint32_tstack_size;/*栈大小*/

/*错误代码*/

rt_err_terror;/*线程错误代码*/

rt_uint8_tstat;/*线程状态*/

/*优先级*/

rt_uint8_tcurrent_priority;/*当前优先级*/

rt_uint8_tinit_priority;/*初始优先级*/

rt_uint32_tnumber_mask;

rt_ubase_tinit_tick;/*线程初始化计数值*/

rt_ubase_tremaining_tick;/*线程剩余计数值*/

structrt_timerthread_timer;/*内置线程定时器*/

void(*cleanup)(structrt_thread*tid);/*线程退出清除函数*/

rt_uint32_tuser_data;/*用户数据*/

};

init_priority为线程创建时的固定优先级,用户可手动调整。cleanup在线程退出时

文档评论(0)

ning2021 + 关注
实名认证
文档贡献者

中医资格证持证人

该用户很懒,什么也没介绍

领域认证该用户于2023年05月10日上传了中医资格证

1亿VIP精品文档

相关文档