架构 任务 分发 汇总 任务系统架构_架构


轻量级内核

更小体积、更低功耗、更快响应

架构 任务 分发 汇总 任务系统架构_优先级_02


轻量级内核

小体积:可伸缩,最小到6KB

低功耗:uA级功耗

强实时:us级响应

广适配:支持多种芯片架构

兼容性:提供标准接口liteOS源码核心文件夹分析

架构 任务 分发 汇总 任务系统架构_架构_03


Kernal模块——任务

任务概念

  • 从系统的角度看,任务是竞争系统资源的最小运行单元。任务可以使用或等待CPU、使用内存空间等系统资源,并独立于其它任务运行。
  • LiteOS的任务模块可以给用户提供多个任务,实现了任务之间的切换和通信,帮助用户管理业务程序流程。这样用户可以将更多的精力投入到业务功能的实现中。
  • LiteOS是一个支持多任务的操作系统,在LiteOS中,一个任务表示一个线程。
  • LiteOS的任务是抢占式调度机制,同时支持时间片轮转调度模式
  • 高优先级的任务可以打断低优先级的任务,低优先级的任务必须在高优先级任务阻塞或结束后才能执行
  • LiteOS的任务总共有32个优先级(0-31),最高优先级是0,最低优先级是31

任务状态

  • 就绪态(ready):该任务在就绪列表中,就绪的任务已经具备执行的能力,只等待调度器进行调度,新创建的任务会初始化为就绪态
  • 运行态(running):该状态表面任务正在执行,此时它占用处理器,LiteOS调度器选择运行的永远是处于最高优先级的就绪态任务,当任务被运行的那一刻,它的任务状态就变成了运行态。
  • 阻塞态(blocked):如果任务当前正在等待某个时序或者外部中断,我们就说最高任务处于阻塞状态,该任务不在就绪列表中。包含任务被挂起、任务被延迟、任务正在等待信号量、读写队列或者等待读写事件等。
  • 退出态(dead):该任务运行结束,等待系统回收资源。

架构 任务 分发 汇总 任务系统架构_架构 任务 分发 汇总_04

任务状态迁移说明

状态迁移

迁移说明

就绪态->运行态

任务创建后进入就绪态,发生任务切换时,就绪列表中最高优先级的任务被执行,从而进入运行态,但是此刻该任务依旧在就绪列表中

运行态->阻塞态

任务运行因挂起、读信号量等待等,在就绪列表被删除进入阻塞

阻塞态->就绪态,阻塞态->运行态

阻塞的任务被恢复后(任务恢复、延时时间超时、读信号量超时或读到信号量等),此时被恢复的任务会被加入就绪列表,从而由阻塞态变成就绪态,此时如果被恢复任务的优先级高于正在运行任务的优先级,则会发生任务切换,将该任务由就绪态变成运行态

就绪态->阻塞态

任务也有可能在就绪态时被阻塞(挂起)

运行态->就绪态

有更高优先级任务创建成功或者恢复后,发生任务切换而进入就绪列表

运行态->退出态

任务运行结束,内核自动将此任务删除,此时由运行态变成退出态

阻塞态->退出态

阻塞的任务调用删除接口,任务状态由阻塞态变成退出态

任务管理简介

任务管理

简介

任务ID

在任务创建时通过参数返回给用户,作为任务的一个非常重要的标识

任务优先级

优先级表示任务执行的优先顺序

任务入口函数

每个新任务得到调度后执行的函数

任务控制块TCB

每个任务都含有一个任务控制块(TCB),TCB包含了任务上下文栈指针(stack pointer),任务状态,任务优先级,任务ID,任务名,任务栈大小等信息,TCB可以反映每个任务运行情况。

任务栈

每一个任务都拥有一个独立的栈空间,我们成为任务栈。

任务上下文

任务在运行中使用到的一些资源,如寄存器等,我们成为任务上下文,LiteOS在任务挂起的时候会将文本任务的任务上下文信息,保存在自己的任务栈里面,以便任务恢复后,从栈空间中恢复挂起时的上下文信息,从而继续执行被挂起时被打断的代码

任务切换

任务切换包含就绪列表中最高优先级任务、切出任务上下文保存、切入任务上下文恢复等动作

任务的运作机制

  • LiteOS任务管理模块提供任务创建、任务删除、任务延时、任务挂起和任务恢复、更改任务优先级、锁任务调度和解锁任务调度。根据任务控制模块查询任务ID、根据ID查询任务控制块信息功能。
  • 在任务模块初始化时,系统会优先申请任务控制块需要的内存空间,如果系统可用的内存空间小于其所需要的内存空间,任务模块就会初始化失败。如果任务初始化成功,则系统对任务控制块内容进行初始化。
  • 用户创建任务时,系统会将任务栈初始化,预置上下文。此外,系统还会将“任务入口函数”地址放在相应位置。这样在任务第一次启动进入运行态时,将会执行“任务入口函数”。

操作系统抽象层简介

  • 为了让SDK能够更广泛的应用,所以提出了OSAL。SDK内部集成的组件以及SDK本身使用的OS功能,都调用的是OSAL接口,所以SDK要运行起来,必须注册相关的OS进OSAL才行。
  • OSAL使用说明
    ——osal的api接口声明在<osal.h>中,使用相关的接口都要包含该头文件,关于函数的详细参数请参考该头文件的声明
    ——目前已适配了LiteOS/Linux/MACOS等,SDK可以在这些系统下运行。如果需要在非上述系统下运行SDK,需要将新系统适配进OSAL,保障SDK需要的OS功能正常。
  • 适配OSAL:
    ——需要在系统初始化完毕后,调用osal_install接口将系统 注册进SDK即可。使用该接口需要包含<osal_imp.h>,相关宏定义在<osal_type.h>中。详细参考该头文件。

架构 任务 分发 汇总 任务系统架构_架构_05