网站建设做网站可以吗,中国宁波网站,厦门网红桥,p2p网贷网站建设方案目录 概述
1 RT-Thread线程定义
1.1 优先级设定方法
1.2 内存管理
1.2.1 RT-Thread的线程类别
1.2.2 RT-Thread的线程调度
2 线程重要属性
2.1 线程栈
2.2 线程状态
2.3 线程优先级
2.4 时间片 概述
本文主要介绍RT-Thread线程的定义和属性#xff0c;其包括线程的…目录 概述
1 RT-Thread线程定义
1.1 优先级设定方法
1.2 内存管理
1.2.1 RT-Thread的线程类别
1.2.2 RT-Thread的线程调度
2 线程重要属性
2.1 线程栈
2.2 线程状态
2.3 线程优先级
2.4 时间片 概述
本文主要介绍RT-Thread线程的定义和属性其包括线程的定义线程类别线程调度方法还重点介绍了线程的重要属性包括线程状态优先级和时间片等内容。
1 RT-Thread线程定义
在 RT-Thread 中与上述子任务对应的程序实体就是线程线程是实现任务的载体它是 RT-Thread 中最基本的调度单位它描述了一个任务执行的运行环境也描述了这个任务所处的优先等级。
1.1 优先级设定方法
1重要的任务可设置相对较高的优先级
2次重要的任务可以设置较低的优先级
3不同的任务允许设置相同的优先级轮流运行。
当线程运行时它会认为自己是以独占 CPU 的方式在运行线程执行时的运行环境称为上下文具体来说就是各个变量和数据包括所有的寄存器变量、堆栈、内存信息等。
1.2 内存管理
RT-Thread 线程管理的主要功能如下
1.2.1 RT-Thread的线程类别
系统中存在两类线程分别是系统线程和用户线程 系统线程由 RT-Thread 内核创建的线程 用户线程 由应用程序创建的线 这两类线程都会从内核对象容器中分配线程对象当线程被删除时与该线程相关的线程对象也会被从对象容器中删除。如下图所示每个线程都有一些重要的属性如线程控制块、线程栈、入口函数等。
1.2.2 RT-Thread的线程调度
RT-Thread 的线程调度器是抢占式的主要的工作就是从就绪线程列表中查找最高优先级线程保证最高优先级的线程能够被运行最高优先级的任务一旦就绪总能得到 CPU 的使用权。
当一个运行着的线程使一个比它优先级高的线程满足运行条件当前线程的 CPU 使用权就被剥夺了或者说被让出了高优先级的线程立刻得到了 CPU 的使用权。
如果是中断服务程序使一个高优先级的线程满足运行条件中断完成后被中断的线程挂起优先级高的线程开始运行。
当调度器调度线程切换时先将当前线程上下文保存起来当再切回到这个线程时线程调度器将该线程的上下文信息恢复。
2 线程重要属性
2.1 线程栈
RT-Thread 线程具有独立的栈当进行线程切换时会将当前线程的上下文存在栈中当线程要恢复运行时再从栈中读取上下文信息进行恢复。
线程栈还用来存放函数中的局部变量函数中的局部变量从线程栈空间中申请函数中局部变量初始时从寄存器中分配ARM 架构当这个函数再调用另一个函数时这些局部变量将放入栈中。
对于线程第一次运行可以以手工的方式构造这个上下文来设置一些初始的环境入口函数PC 寄存器、入口参数R0 寄存器、返回位置LR 寄存器、当前机器运行状态CPSR 寄存器。
线程栈的增长方向是芯片构架密切相关的RT-Thread 3.1.0 以前的版本均只支持栈由高地址向低地址增长的方式对于 ARM Cortex-M 架构线程栈可构造如下图所示。 线程栈大小可以这样设定对于资源相对较大的 MCU可以适当设计较大的线程栈也可以在初始时设置较大的栈例如指定大小为 1K 或 2K 字节然后在 FinSH 中用 list_thread 命令查看线程运行的过程中线程所使用的栈的大小通过此命令能够看到从线程启动运行时到当前时刻点线程使用的最大栈深度而后加上适当的余量形成最终的线程栈大小最后对栈空间大小加以修改。
2.2 线程状态
线程运行的过程中同一时间内只允许一个线程在处理器中运行从运行的过程上划分线程有多种不同的运行状态如初始状态、挂起状态、就绪状态等。在 RT-Thread 中线程包含五种状态操作系统会自动根据它运行的情况来动态调整它的状态。 RT-Thread 中线程的五种状态如下表所示
状态描述初始状态当线程刚开始创建还没开始运行时就处于初始状态在初始状态下线程不参与调度。此状态在 RT-Thread 中的宏定义为 RT_THREAD_INIT就绪状态在就绪状态下线程按照优先级排队等待被执行一旦当前线程运行完毕让出处理器操作系统会马上寻找最高优先级的就绪态线程运行。此状态在 RT-Thread 中的宏定义为 RT_THREAD_READY运行状态线程当前正在运行。在单核系统中只有 rt_thread_self() 函数返回的线程处于运行状态在多核系统中可能就不止这一个线程处于运行状态。此状态在 RT-Thread 中的宏定义为 RT_THREAD_RUNNING挂起状态也称阻塞态。它可能因为资源不可用而挂起等待或线程主动延时一段时间而挂起。在挂起状态下线程不参与调度。此状态在 RT-Thread 中的宏定义为 RT_THREAD_SUSPEND关闭状态当线程运行结束时将处于关闭状态。关闭状态的线程不参与线程的调度。此状态在 RT-Thread 中的宏定义为 RT_THREAD_CLOSE 2.3 线程优先级
RT-Thread 线程的优先级是表示线程被调度的优先程度。每个线程都具有优先级线程越重要赋予的优先级就应越高线程被调度的可能才会越大。
RT-Thread 最大支持 256 个线程优先级 (0~255)数值越小的优先级越高0 为最高优先级。在一些资源比较紧张的系统中可以根据实际情况选择只支持 8 个或 32 个优先级的系统配置
对于 ARM Cortex-M 系列普遍采用 32 个优先级。最低优先级默认分配给空闲线程使用用户一般不使用。在系统中当有比当前线程优先级更高的线程就绪时当前线程将立刻被换出高优先级线程抢占处理器运行。
2.4 时间片
每个线程都有时间片这个参数但时间片仅对优先级相同的就绪态线程有效。
系统对优先级相同的就绪态线程采用时间片轮转的调度方式进行调度时时间片起到约束线程单次运行时长的作用其单位是一个系统节拍OS Tick。 一个时间片的案例 假设有 2 个优先级相同的就绪态线程 A 与 B 1A 线程的时间片设置为 10B 线程的时间片设置为 5 2当系统中不存在比 A 优先级高的就绪态线程时系统会在 A、B 线程间来回切换执行并且每次对 A 线程执行 10 个节拍的时长对 B 线程执行 5 个节拍的时长 执行方式如下图