当前位置: 首页 > news >正文

网站检测器适合小县城的41个投资

网站检测器,适合小县城的41个投资,wordpress数据库被挂马,小游戏制作开发文章目录 前言一、线程的概念二、线程的调度三、上下文切换四、线程的重要属性1. 线程栈2. 线程的状态3. 线程优先级4. 线程时间片5. 线程的入口函数 五、RT-Thread命令查看系统线程信息总结 前言 前文中的最后一个任务发现#xff0c;一个main()函数很难同时实现按键功能和闪… 文章目录 前言一、线程的概念二、线程的调度三、上下文切换四、线程的重要属性1. 线程栈2. 线程的状态3. 线程优先级4. 线程时间片5. 线程的入口函数 五、RT-Thread命令查看系统线程信息总结 前言 前文中的最后一个任务发现一个main()函数很难同时实现按键功能和闪灯功能就好像人很难同时完成左手画圆右手画方一样这种情况可以安排一人去画圆、一人去画方并行进行就很容易了两人各司其职互不干扰。 操作系统中一个线程就像做事的一个人。一个操作系统可以有多个线程不同的线程完成不同的小任务各司其职完成整个系统大任务。 一、线程的概念 日常生活中完成一个复杂的任务一般会先将他分解成多个简单、容易解决的小任务再将小任务分配给不同的人完成当小任务逐个被完成时复杂任务也就随之完成了。 嵌入式系统一般也是用于完成一些特定任务而设计的这些特定任务可能比较复杂这就要求开发人员把复杂的任务进行功能分解形成若干个不同功能的小任务而不同功能的小任务由运行于操作系统中的不同程序来完成再由操作系统统一协调各个程序之间的运行。这些运行在操作系统之上的程序单元就是线程。 当合理地划分任务并正确地执行时这种设计能够让系统满足实时系统的性能及时间的要求例如让嵌入式系统执行这样的任务系统通过红外传感器采集寻迹数据并根据数据采集结果决定小车的行驶方向如直走纠偏等在多线程实时系统中可以将这个任务分解成两个子任务如下图所示 子任务1不间断地读取传感器数据并将数据写到共享内存中。 子任务2周期性地从共享内存中读取数据并根据传感器数据修正行进路线。 在 RT-Thread 中线程是实现任务的载体它是 RT-Thread 中最基本的调度单位。 二、线程的调度 调度是什么先讲个故事小朋友去游乐场玩荡秋千秋千只有一个但想玩的小朋友很多那怎么办游乐场的服务员小姐姐就想了一个办法想玩的小朋友要排队一个一个轮流玩而且每人一次只能玩5分钟如果还想再玩一次的话得重新排队。这样听话的小朋友们就在服务员小姐姐的统一调度下开心有序的玩起了荡秋千。 对于单核系统CPU就好比秋千线程就好比游乐场的小朋友系统中有多个线程每个线程的运行都要占有CPU而CPU只有一个这样想让所有线程在操作系统上有序地运行就需要有一个统一的协调者这个协调者我们叫它调度器而它的工作就是负责线程调度给不同的线程分配运行时间使操作系统上的所有线程有序地运行。综上所述线程调度是指按照特定机制为多个线程分配CPU的使用权。 线程调度方式常见的有两种分别为分时调度和抢占式调度。 1分时调度就是所有线程轮流拥有CPU的使用权,平均分配每个线程占用CPU的时间 2抢占式调度就是让优先级高的线程优先使用CPU,如果线程的优先级相同,则会像分时调度一样轮流使用CPU。 RT-Thread实时操作系统采用的调度方式是抢占式调度方式。 三、上下文切换 线程是程序的一个运行实例线程执行时的运行环境称为上下文每个线程都有自己的上下文包括程序的代码、数据、堆栈、寄存器、程序计数器等。 操作系统的调度器在进行线程调度时会发生上下文件切换从正在运行的线程的上下文切换到另一个线程的上下文。相当从一个程序代码切换到另一个程序代码但又不仅是代码的切换上下文件的其它内容如数据、堆栈、寄存器、程序计数器等也要一起切换。 线程的运行是需要运行环境的对于线程来说运行环境就是CPU资源包括运算单元、程序指针、堆栈指针以及各种通用寄存器。当线程运行时它会认为自己是以独占CPU资源的方式在运行会根据自己需要对这些资源进行修改。 而CPU资源只有一套当另一个线程运行时它也想独占CPU资源那么前面已占用CPU资源的线程必须把CPU资源让给后面的线程使用。但它又担心后面的线程把CPU资源修改了所以它在让出资源之前还要做一件重要的事就是把它当前的资源使用情况记录下来这个动作也叫保护现场方便下次运行时重新布置资源。 另一个线程得到资源后此时得到的资源的状态不适合它运行因此在运行之前它必须根据自己的需要把资源重新布置这个动作也叫恢复现场才能运行。 这种把CPU资源从一个状态切换到另一个状态的过程就是上下文切换。 我们拿舞台剧来做个不太恰当的比喻。每一场舞台剧的表演都需要一个舞台资源场地、灯光和道具等而且独占舞台资源表演时会根据自己表演剧情的需要把舞台资源进行布置。而到下一场表演时也要独占舞台资源而且此时的舞台资源布置情况不适合下一场表演的剧情需要必须在开始前重新布置舞台资源。所在从一场表演切换到另一场表演时需要进行舞台场景的切换。 四、线程的重要属性 1. 线程栈 线程栈用于保存线程的上下文函数调用过程、局部变量等 进行上下文切换时需要记录线程的上下文信息那么就需要有一个地方来保存这些数据。RT-Thread的每一各线程都具有独立的栈当进行线程切换时会将当前线程的上下文保存在栈中当线程要恢复运行时再从栈中读取上下文信息进行恢复。 线程栈还用来存放函数中的局部变量函数中的局部变量从线程空间中申请在初始时从寄存器中分配ARM架构当这个函数再调用另一个函数时这些局部变量将放入栈中。 线程栈的大小设定 1对于资源相对较大的MCU可以适当设计较大的线程栈 2在初始时设置较大的栈例如指定大小为1KB或2KB然后在FinSH中用list_thread命令查看线程运行过程中线程所使用的栈的大小通过此命令能够看到从线程启动运行时到当前时刻点线程使用的最大栈深度而后加上适当的余量形成最终的线程栈大小最后对栈空间加以修改。 2. 线程的状态 系统运行的过程中同一时间内只允许一个线程在处理器中运行从运行的过程上划分线程有多种不同的运行状态。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 RT-Thread提供一系列的操作系统调用接口使线程的状态在5个状态之间来回切换。几种状态间的切换关系如图所示 线程通过调用函数 rt_thread_create/init() 进入到初始状态RT_THREAD_INIT初始状态的线程通过调用函数 rt_thread_startup() 进入到就绪状态RT_THREAD_READY就绪状态的线程被调度器调度后进入运行状态RT_THREAD_RUNNING当处于运行状态的线程调用①中的rt_thread_delay()rt_sem_take()rt_mutex_take()rt_mb_recv()等函数或者获取不到资源时将进入到挂起状态RT_THREAD_SUSPEND处于挂起状态的线程如果等待超时依然未能获得资源或由于其他线程释放了资源那么它将返回到就绪状态挂起状态的线程如果调用rt_thread_delete/detach() 函数将更改为关闭状态RT_THREAD_CLOSE而运行状态的线程如果运行结束就会在线程的最后部分执行 rt_thread_exit() 函数将状态更改为关闭状态。 3. 线程优先级 RT-Thread 线程的优先级是表示线程被调度的优先程度。每个线程都具有优先级线程越重要赋予的优先级就应越高线程被调度的可能才会越大。 RT-Thread 最大支持 256 个线程优先级 (0~255)数值越小的优先级越高0 为最高优先级。在一些资源比较紧张的系统中可以根据实际情况选择只支持 8 个或 32 个优先级的系统配置对于 ARM Cortex-M 系列普遍采用 32 个优先级。最低优先级默认分配给空闲线程使用用户一般不使用。在系统中当有比当前线程优先级更高的线程就绪时当前线程将立刻被换出高优先级线程抢占处理器运行。 4. 线程时间片 回到前文小朋友荡秋千每个小朋友荡秋千的时间是有限的不能一直占着秋千否则会导致其他小朋友不能参与秋千。 同样操作系统中的线程也不能一直占用CPU每个线程都有时间片这个参数表示线程每次可以占用CPU运行的时间当时间片用完线程就要让出CPU。 但时间片仅对优先级相同的就绪态线程有效。系统对于优先级相同的就绪态线程采用时间片轮转的调度方式进行调度时间片起到约束线程单次运行时长的作用其单位是一个系统节拍OS Tick后面讲时钟时会讲。 假设有2个优先级相同的就绪态线程A与BA线程的时间片设置为10B线程的时间片设置为5那么当系统中不存在比A优先级高的就绪态线程时系统会在A、B线程间来回切换执行并且每次对A线程执行10个节拍的时长对对 B 线程执行 5 个节拍的时长如下图可以看出线程A占用CPU运行时间较长。所以我们要根据程序所执行的所需长度定时间片长度以执行完程序。 5. 线程的入口函数 线程的入口函数是线程实现预期功能的函数它是线程第一个运行的函数也是线程开始运行的地方。线程控制块中的 entry 是线程的入口函数它是线程实现预期功能的函数。线程的入口函数由用户设计实现可以有以下几点模式。 1无限循环模式 在实时系统中线程通常是被动式的这个是由实时系统的特性所决定的实时系统通常总是等待外界事件的发生而后进行相应的服务。 void thread_entry(void* paramenter) {while (1){/* 等待事件的发生 *//* 对事件进行服务、进行处理 */} } 线程看似没有什么限制程序执行的因素似乎所有的操作都可以执行。但是作为一个实时系统一个优先级明确的实时系统如果一个线程中的程序陷入了死循环操作那么比它优先级低的线程都将不能够得到执行。所以在实时操作系统中必须注意的一点就是线程中不能陷入死循环操作必须要有让出 CPU 使用权的动作如循环中调用延时函数或者主动挂起。用户设计这种无限循环的线程的目的就是为了让这个线程一直被系统循环调度运行永不删除。 2顺序执行或有限次循环模式 如简单的顺序语句、do while() 或 for()循环等此类线程不会循环或不会永久循环可谓是 “一次性” 线程一定会被执行完毕。在执行完毕后线程将被系统自动删除。 static void thread_entry(void* parameter) {/* 处理事务 #1 */…/* 处理事务 #2 */…/* 处理事务 #3 */ }五、RT-Thread命令查看系统线程信息 在第3章 PIN设备GPIO的使用中的任务4基础上使用命令查看系统线程信息。在终端输入命令help观看输出结果如图所示 可以发现help命令可以查看系统支持的所有命令其中有两个命令与线程相关分别时ps和list_thread。这两个命令都可以用于查看系统中存在哪些线程以及线程的信息其命令输出结果如下图所示 连个命令输出一样目前系统有4个线程分别为tshell、tidle0、timer、main。tshell、tidle0、timer三个线程是系统线程由系统在启动时自动创建并运行。 tshell是用户线程在系统开启finsh命令组件时创建此线程默认是开启的他负责解析并执行终端命令最后向终端输出命令执行结果tidle0是一个空闲线程在系统空闲的时候运行用于处理系统中一些非紧急的任务如僵尸线程的资源清理就是在空闲线程中进行的timer是定时器线程负责处理定时器任务main就是我们程序中的main函数单独作为一个线程运行通常也叫主线程。 总结 本章主要讲了线程的基本概念
http://www.dnsts.com.cn/news/126915.html

相关文章:

  • qq空间怎么添加wordpress2022百度seo最新规则
  • 长春火车站什么时候解封域名交易asp.net 网站
  • 广州网站定制开发公司哪家好网站常用的一种js的图片幻灯片特效代码
  • 宁城网站建设公司怎样做网站个人简介
  • 做h5游戏的网站网站开发需要如何压缩代码
  • 潍坊恒信建设集团网站哈尔滨seo优化排名
  • 天津有哪些有名的网站建设公司免费开放代理
  • wap网站和app的区别com域名注册费用
  • 旅游网站项目评估长沙专业做网络的公司
  • 自己做网站需要主机吗邢台wap网站建设价格
  • 中学网站建设方案计划网站优化主要怎么做
  • 国外空间网站源码网站云服务器
  • 网站建设中 下载漯河网站建设xknt
  • 专业网站建设价格大全wordpress插件禁用
  • 南京建设工程公共资源交易中心网站移动应用开发专业怎么样
  • 做文库网站怎么赚钱吗做策划有帮助的网站
  • 一学一做动漫视频网站莱阳 网站建设
  • 兵团第二师建设环保局网站旅游网站的主要功能
  • 免费网站搭建wordpress多站点搭建
  • 制作动态表情的网站杨和网站设计制作
  • 设计logo网站推荐北京手机建站模板
  • 内网门户网站建设河南省做网站的企业
  • 网站建设保密协议范本网站设计开发中的具体步骤
  • 网站制作公司业务员中国十大国企公司排名
  • 新干县城乡建设局网站wordpress建站指南
  • 网站更新维护页面wordpress 内容采集 差价
  • 个人网站做项目福建建设信息网站
  • 网站怎么做充值系统下载wordpress安装说明
  • 大气宽屏企业网站源码自己怎么做机构网站
  • 陕西中洋建设工程有限公司网站国内较好的网站开发商城