前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >嵌入式基础知识-系统调度

嵌入式基础知识-系统调度

作者头像
xxpcb
发布2023-08-22 09:38:26
2360
发布2023-08-22 09:38:26
举报
文章被收录于专栏:码农爱学习的专栏
系统调度是操作系统重要功能,在嵌入式开发,也要了解系统调度的基本原理。对于嵌入式Linux开发,一般使用多线程和多进程开发,对于运行RTOS的嵌入式系统,一般使用多任务开发。这些线程、进程、任务的调度,有许多相似之处。

1 进程的三种状态

  • 执行态(Run):进程占用CPU资源,对于单核处理器,任一时刻只能有一个进行处于执行态
  • 就绪态(Ready):进程本身具备运行条件,但由于处理机的个数少于可运行进行从个数,暂未运行,等待处理机资源
  • 等待态(Wait):也称挂起态(Suspended)、阻塞态、封锁态(Blocked)、睡眠态(Sleep)。该状态时,进行不具备运行条件,即使分给它处理机也不能运行。
  • (a):某个运行条件不能满足(如等待资源)
  • (b):等待条件消失(如等待的资源已经获得满足)
  • (c):就绪队列中的进程获得CPU的使用权
  • (d):进程资源放弃CPU使用权,或被强制剥夺CPU使用权

2 进程切换

进程切换是指,操作系统为了控制进程的执行,必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行,也称为任务切换,或上下文切换。

或者说,进程切换就是从正在运行的进程中收回处理器,再使待运行的进程占用处理器。

结合上面介绍的进程三种状态,有如下分析:

  • 当一个进程从运行态变成了阻塞态或就绪态,或完成工作被撤销,则该进程不再占用CPU,操作系统会进行进程调度,从就绪队列中重新选择一个进程执行
  • 当一个进程从就绪态变成运行态,则意味着操作系统将之前运行的进行切换,当前的进行开始占用CPU
  • 当一个进程从阻塞态变成就绪态,则该进程只是进入就绪队列,不会引起进程调度

3 AUTOSAR任务状态

AUTOSAR(Automotive Open System Architecture),中文是“汽车开放系统架构”,是一家致力于制定汽车电子软件标准的联盟.

AUTOSAR中定义的任务有两个类别:

  • 基础任务:只有运行、阻塞、就绪三个状态。
  • 扩展任务:在基础任务的基础上,多了一个等待状态。

各任务状态的特点如下:

  • 运行态:在任何一个时间点只有一个任务处于运行状态
  • 就绪态:所有任务都要转换为就绪态后才能转换为运行态,调度器决定哪一个就绪的任务将是下一个执行的任务
  • 阻塞态:处于阻塞态的任务是被动的,可以被激活
  • 等待态:处于等待态的任务将不能继续执行,它将等待至少一个事件发生
  • (a) 触发:一个新任务被设置成就绪状态
  • (b) 启动:一个就绪任务被调度器选择去执行
  • (c) 被抢占:调度器决定去执行另一任务,使得运行态任务进行就绪态
  • (d) 挂起:运行态任务通过调用系统服务使其转为阻塞态
  • (e) 等待:通过一个系统服务引起状态转换到等待态,等待任务等待一个事件,以能够继续操作
  • (f) 激活:至少一个任务等待的事件发生

4 RTOS任务切换

RTOS(Real Time Operating System),实时操作系统,指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,调度一切可利用的资源完成实时任务,并控制所有实时任务协调一致运行的操作系统。

RTOS属于多任务系统,与进程切换的思想类似,多个任务也会进行任务的调度与上下文切换。

任务上下文是任务控制块(TCB)的组成部分,上下文切换由RTOS内部完成,并且上下切换时间是影响RTOS性能的重要指标。

下图为FreeRTOS的任务调度示意图。

  • 1 任务创建完成后进入就绪态,表明任务已准备就绪,随时可以运行,只等待调度器进行调度。
  • 2 发生任务切换时,就绪列表中最高优先级的任务被执行,从而进入运行态。
  • 3 有更高优先级任务创建或者恢复后,会发生任务调度。
  • 4 正在运行的任务发生阻塞(挂起、延时、读信号量等待)时,该任务会从就绪列表中删除,任务状态由运行态变成阻塞态,然后发生任务切换,运行就绪列表中当前最高优先级任务。
  • 5 阻塞的任务被恢复后(任务恢复、延时时间超时、读信号量超时或读到信号量等),此时被恢复的任务会被加入就绪列表;如果此时被恢复任务的优先级高于正在运行任务的优先级,则会发生任务切换,将该任务将再次转换任务状态,由就绪态变成运行态。
  • 6、7、8 任务可以通过调用vTaskSuspend() API 函数都可以将处于任何状态的任务挂起,被挂起的任务得不到CPU的使用权,也不会参与调度,除非它从挂起态中解除。
  • 9 把一个挂起状态的任 务恢复的唯一途径就是调用vTaskResume() 或vTaskResumeFromISR() API 函数,如果此时被恢复任务的优先级高于正在运行任务的优先级,则会发生任务切换,将该任务将再次转换任务状态,由就绪态变成运行态。

5 总结

本篇介绍了系统调度的基础知识,包括进程的三种基本状态,进程切换,AUTOSAR与RTOS的任务切换基础知识。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农爱学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 进程的三种状态
  • 2 进程切换
  • 3 AUTOSAR任务状态
  • 4 RTOS任务切换
  • 5 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档