漫谈Huawei LiteOS五大内核模块
【摘要】Huawei LiteOS是华为面向IoT领域,构建的“统一物联网操作系统和中间件软件平台”,以轻量级(内核小于10k)、低功耗(1节5号电池最多可以工作5年),快速启动,互联互通,安全等关键能力,为开发者提供“一站式”完整软件平台,有效降低开发门槛、缩短开发周期。下面对LiteOS基础内核的任务管理、内存管理、中断管理、信号量、互斥锁五大模块进行简单介绍。
LiteOS内核的任务管理
基本概念和功能
任务是竞争系统资源的最小运行单元。任务可以使用或等待CPU、使用内存空间等系统资源,并独立于其它任务运行。
Huawei LiteOS是一个支持多任务的操作系统,一个任务就表示一个线程,任务之间可以进行切换和通信。LiteOS的任务管理模块提供任务创建、删除、延时、挂起和恢复、更改任务优先级、锁定任务调度和解锁任务调度、根据任务控制块查询任务 ID、根据 ID 查询任务控制块信息等功能。
因为LiteOS内核是抢占式调度内核,所以高优先级的任务可以打断低优先级任务,低优先级任务必须在高优先级任务阻塞或结束后才能得到调度,同优先级任务会进行时间片轮转调度。优先级表示任务执行的优先顺序,决定了在发生任务切换时即将要执行的任务。LiteOS中的任务一共有32个优先级 (0-31),最高优先级为 0,最低优先级为31。
任务控制块TCB
每一个任务都含有一个任务控制块(TCB)。TCB 包含了任务上下文栈指针(stack pointer)、任务状态(包括就绪、运行、阻塞、退出4种状态)、任务栈大小(任务栈里保存着局部变量、寄存器、函数参数、函数返回地址等)、任务优先级、任务ID、任务名等信息。TCB相当于每个任务在内核中的身份证,可以反映出每个任务运行情况。
运作机制
在任务模块初始化时,系统会先申请TCB需要的内存空间。如果任务初始化成功,则系统对TCB内容进行初始化。用户创建任务时,系统会将任务栈进行初始化,预置上下文。此外,系统还会将“任务入口函数”地址放在相应位置。这样在任务第一次启动进入运行态时,将会执行“任务入口函数”。
LiteOS内核的内存管理
主要功能
Huawei LiteOS的内存管理模块管理系统的内存资源,主要包括内存的初始化、分配及释放,是操作系统的核心模块之一。
在系统运行过程中,内存管理模块通过对内存的申请/释放操作,来管理用户和OS对内存的使用,使内存的利用率和使用效率达到最优,同时最大限度地解决系统的内存碎片问题。
Huawei LiteOS的内存管理分为动态内存管理和静态内存管理。
动态内存管理
在动态内存池中分配用户指定大小的内存块。
-
优点:按需分配。
-
缺点:内存池中可能出现碎片。
静态内存管理
在静态内存池中分配用户初始化时预设(固定)大小的内存块,初始化后块大小不可变更。
-
优点:分配和释放效率高,静态内存池中无碎片。
-
缺点:只能申请到初始化预设大小的内存块,不能按需申请。
LiteOS内核的中断管理
中断的介绍
中断是指出现需要时,CPU暂停执行当前程序,转而执行新程序的过程。即在程序运行过程中,系统出现了一个必须由CPU立即处理的事务。此时,CPU暂时中止当前程序的执行转而处理这个事务,这个过程就叫做中断。
为什么需要中断
众多周知,CPU的处理速度比外设的运行速度快很多,外设可以在没有CPU介入的情况下完成一定的工作,但某些情况下需要CPU为其做一定的工作。通过中断机制,在外设不需要CPU介入时,CPU可以执行其它任务,而当外设需要CPU时通过产生中断信号使CPU立即中断当前任务来响应中断请求。用户通过中断申请,注册中断处理程序,可以指定CPU响应中断请求时所执行的具体操作。这样可以使CPU避免把大量时间耗费在等待、查询外设状态的操作上,因此将大大提高系统实时性以及执行效率。
相关的硬件
与中断相关的硬件可以划分为三类:设备、中断控制器、CPU本身。
-
设备:发起中断的源,当设备需要请求CPU时,产生一个中断信号,该信号连接至中断控制器。
-
中断控制器:中断控制器是 CPU 众多外设中的一个,它一方面接收其它外设中断引脚的输入,另一方面,它会发出中断信号给CPU。可以通过对中断控制器编程实现对中断源的优先级、触发方式、打开和关闭源等设置操作。常用的中断控制器有VIC(Vector Interrupt Controller)和GIC(General Interrupt Controller),在 ARM Cortex-M 系列中使用的中断控制器是NVIC(Nested Vector Interrupt Controller)。
-
CPU:CPU会响应中断源的请求,中断当前正在执行的任务,转而执行中断处理程序。
主要功能
Huawei LiteOS支持:
-
中断初始化
-
中断创建
-
开/关中断
-
恢复中断
-
中断使能
-
中断屏蔽
LiteOS内核的信号量
基本概念和功能
信号量(Semaphore)是一种实现任务间通信的机制,可以用于任务之间同步或临界资源的互斥访问。
信号量可以被任务获取或者申请,不同的信号量通过信号量索引号来唯一确定,每个信号量都有一个计数值和任务队列。通常信号量的计数值表示有效的资源数,即剩下的可被占用的互斥资源数。当任务申请(Pend)信号量时,如果申请成功,则信号量的计数值递减,如申请失败,则挂起在该信号量的等待任务队列上,一旦有任务释放该信号量,则等待任务队列中的任务被唤醒开始执行。
信号量运作示意图
![](https://pic1.zhimg.com/v2-3bf382c8425301c1a8ba9d146d328074_b.jpg)
使用场景
信号量是一种非常灵活的同步方式,可以运用在多种场合中,实现锁、同步、资源计数等功能,也能方便的用于任务与任务,中断与任务的同步中。
-
任务间互斥
用作互斥时,信号量创建后记数是满的,在需要使用临界资源时,先申请信号量,使其变空,这样其他任务需要使用临界资源时就会因为无法申请到信号量而阻塞,从而保证了临界资源的安全。
-
任务间同步
用作同步时,信号量在创建后被置为空,任务1申请信号量而阻塞,任务2在某种条件发生后,释放信号量,于是任务1得以进入READY或RUNNING态,从而达到了两个任务间的同步。
-
资源计数
用作资源计数时,信号量的作用是一个特殊的计数器,可以递增或者递减,但是值永远不能为负值,典型的应用场景是生产者与消费者的场景。
-
中断与任务的同步
用作中断与任务的同步时,可以在中断未触发时将信号量的值置为0,从而堵塞中断服务处理任务,一旦中断被触发,则唤醒堵塞的中断服务处理任务进行中断处理。
LiteOS内核的互斥锁
基本概念和功能
互斥锁(mutex)又称互斥型信号量,是一种特殊的二值信号量,用于实现对共享资源的独占式处理。互斥锁主要使用在多任务环境下,此时往往存在多个任务竞争同一共享资源的应用场景。另外,Huawei LiteOS通过优先级继承算法,解决了信号量存在的优先级翻转问题。
运作机制
任意时刻互斥锁只有两种状态:开锁或闭锁。当有任务持有时,互斥锁处于闭锁状态,这个任务获得该互斥锁的所有权。当该任务释放它时,该互斥锁被开锁,任务失去该互斥锁的所有权。当一个任务持有互斥锁时,其他任务将不能再对该互斥锁进行开锁或持有,所以其他任务此时访问这个公共资源将会被阻塞,直到互斥锁被持有该锁的任务释放后,其他任务才能重新访问该公共资源。
互斥锁运作示意图
![](https://pic1.zhimg.com/v2-807040df9a150b60f193891812181434_b.jpg)
![](https://pic4.zhimg.com/v2-903a506f9c7ea66b1f6cf4c10ade884b_b.jpeg)