轻量级内核
更小体积、更低功耗、更快响应
轻量级内核
小体积:可伸缩,最小到6KB
低功耗:uA级功耗
强实时:us级响应
广适配:支持多种芯片架构
兼容性:提供标准接口liteOS源码核心文件夹分析
Kernal模块——任务
任务概念
- 从系统的角度看,任务是竞争系统资源的最小运行单元。任务可以使用或等待CPU、使用内存空间等系统资源,并独立于其它任务运行。
- LiteOS的任务模块可以给用户提供多个任务,实现了任务之间的切换和通信,帮助用户管理业务程序流程。这样用户可以将更多的精力投入到业务功能的实现中。
- LiteOS是一个支持多任务的操作系统,在LiteOS中,一个任务表示一个线程。
- LiteOS的任务是抢占式调度机制,同时支持时间片轮转调度模式
- 高优先级的任务可以打断低优先级的任务,低优先级的任务必须在高优先级任务阻塞或结束后才能执行
- LiteOS的任务总共有32个优先级(0-31),最高优先级是0,最低优先级是31
任务状态
- 就绪态(ready):该任务在就绪列表中,就绪的任务已经具备执行的能力,只等待调度器进行调度,新创建的任务会初始化为就绪态
- 运行态(running):该状态表面任务正在执行,此时它占用处理器,LiteOS调度器选择运行的永远是处于最高优先级的就绪态任务,当任务被运行的那一刻,它的任务状态就变成了运行态。
- 阻塞态(blocked):如果任务当前正在等待某个时序或者外部中断,我们就说最高任务处于阻塞状态,该任务不在就绪列表中。包含任务被挂起、任务被延迟、任务正在等待信号量、读写队列或者等待读写事件等。
- 退出态(dead):该任务运行结束,等待系统回收资源。
任务状态迁移说明
状态迁移 | 迁移说明 |
就绪态->运行态 | 任务创建后进入就绪态,发生任务切换时,就绪列表中最高优先级的任务被执行,从而进入运行态,但是此刻该任务依旧在就绪列表中 |
运行态->阻塞态 | 任务运行因挂起、读信号量等待等,在就绪列表被删除进入阻塞 |
阻塞态->就绪态,阻塞态->运行态 | 阻塞的任务被恢复后(任务恢复、延时时间超时、读信号量超时或读到信号量等),此时被恢复的任务会被加入就绪列表,从而由阻塞态变成就绪态,此时如果被恢复任务的优先级高于正在运行任务的优先级,则会发生任务切换,将该任务由就绪态变成运行态 |
就绪态->阻塞态 | 任务也有可能在就绪态时被阻塞(挂起) |
运行态->就绪态 | 有更高优先级任务创建成功或者恢复后,发生任务切换而进入就绪列表 |
运行态->退出态 | 任务运行结束,内核自动将此任务删除,此时由运行态变成退出态 |
阻塞态->退出态 | 阻塞的任务调用删除接口,任务状态由阻塞态变成退出态 |
任务管理简介
任务管理 | 简介 |
任务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>中。详细参考该头文件。