写点什么

漫谈 Huawei LiteOS 五大内核模块

  • 2020-06-12
  • 本文字数:2789 字

    阅读完需:约 9 分钟

漫谈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)信号量时,如果申请成功,则信号量的计数值递减,如申请失败,则挂起在该信号量的等待任务队列上,一旦有任务释放该信号量,则等待任务队列中的任务被唤醒开始执行。


信号量运作示意图



使用场景


信号量是一种非常灵活的同步方式,可以运用在多种场合中,实现锁、同步、资源计数等功能,也能方便的用于任务与任务,中断与任务的同步中。


  • 任务间互斥

  • 用作互斥时,信号量创建后记数是满的,在需要使用临界资源时,先申请信号量,使其变空,这样其他任务需要使用临界资源时就会因为无法申请到信号量而阻塞,从而保证了临界资源的安全。

  • 任务间同步

  • 用作同步时,信号量在创建后被置为空,任务 1 申请信号量而阻塞,任务 2 在某种条件发生后,释放信号量,于是任务 1 得以进入 READY 或 RUNNING 态,从而达到了两个任务间的同步。

  • 资源计数

  • 用作资源计数时,信号量的作用是一个特殊的计数器,可以递增或者递减,但是值永远不能为负值,典型的应用场景是生产者与消费者的场景。

  • 中断与任务的同步

  • 用作中断与任务的同步时,可以在中断未触发时将信号量的值置为 0,从而堵塞中断服务处理任务,一旦中断被触发,则唤醒堵塞的中断服务处理任务进行中断处理。

LiteOS 内核的互斥锁

基本概念和功能


互斥锁(mutex)又称互斥型信号量,是一种 特殊的二值信号量,用于实现对共享资源的独占式处理。互斥锁主要使用在多任务环境下,此时往往存在多个任务竞争同一共享资源的应用场景。另外,Huawei LiteOS 通过优先级继承算法,解决了信号量存在的优先级翻转问题。


运作机制


任意时刻互斥锁只有两种状态:开锁或闭锁。当有任务持有时,互斥锁处于闭锁状态,这个任务获得该互斥锁的所有权。当该任务释放它时,该互斥锁被开锁,任务失去该互斥锁的所有权。当一个任务持有互斥锁时,其他任务将不能再对该互斥锁进行开锁或持有,所以 其他任务此时访问这个公共资源将会被阻塞,直到互斥锁被持有该锁的任务释放后,其他任务才能重新访问该公共资源。


互斥锁运作示意图



2020-06-12 20:281620

评论

发布
暂无评论
发现更多内容

软件测试 | 编程语言中的Interface

测吧(北京)科技有限公司

测试

毕业设计-100w秒杀设计

Sam

架构实战营

锐捷网络,无边光景一时新

脑极体

网络

Django笔记二十五之数据库函数之日期函数

Hunter熊

Python django extract trunc

【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache功能的开发实战指南

码界西柚

spring 缓存服务 三周年征文 CacheManager 缓存系统

10年IT老兵亲述SpringCloud开发从入门到实战文档

程序知音

Java 微服务 java架构 Java进阶 spring-cloud

什么是点对点传输?什么是点对多传输

镭速

全新 – Amazon EC2 R6a 实例由第三代 AMD EPYC 处理器提供支持,适用于内存密集型工作负载

亚马逊云科技 (Amazon Web Services)

Amazon EC2

【干货集】PCBA板边器件布局重要性

华秋PCB

工具 电路 PCB 布局 PCB设计

接口测试

测吧(北京)科技有限公司

测试

视频监控系统选择硬盘,绿盘、蓝盘、紫盘、黑盘、红盘到底选择哪个?

wljslmz

视频监控 三周年连更

开源工具系列7:Kube-bench

HummerCloud

Kubernetes 云原生安全

Fabarta 与青岛市城阳区政府达成战略合作,共同推动区域数据要素市场建设

Fabarta

数据挖掘 数据要素 数据资产管理 图智能 数据要素流通

Prometheus实战-从0构建高可用监控平台(五)

小毛驴的烂笔头

Linux Prometheus

对比编程语言的四种错误处理方法,哪种才是最优方案?

Python猫

编程

JAVA快速开发框架 一键生成表单模板代码

力软低代码开发平台

安卓机上 4G 内存跑 alpaca,欢迎试用轻量级 LLM 模型推理框架 InferLLM

MegEngineBot

开源 大模型 MegEngine LLM

数据标注——数字世界的基石

数据堂

今日分享丨inBuilder低代码平台有关前端的“道、法、术、器”

inBuilder低代码平台

前端 低代码平台

JMeter实时性能监控平台实战

测吧(北京)科技有限公司

测试

Django认证系统

测吧(北京)科技有限公司

测试

mac软件卸载不干净怎么办?

真大的脸盆

Mac Mac 软件 软件卸载工具 卸载软件

阿里云 EMAS & 魔笔:4月产品动态

移动研发平台EMAS

阿里云 DevOps 消息推送 低代码平台 兼容性测试

数字化管理时代来临,瓴羊Quick BI、帆软Fine BI领跑国产BI市场

对不起该用户已成仙‖

Prometheus实战-从0构建高可用监控平台(四)

小毛驴的烂笔头

Linux Prometheus

2023-05-08:我们定义了一个函数 countUniqueChars(s) 来统计字符串 s 中的唯一字符, 并返回唯一字符的个数。 例如:s = “LEETCODE“ ,则其中 “L“, “T

福大大架构师每日一题

Go 算法 rust 福大大

Alibaba技术官熬夜肝出的,Kafka“限量笔记”牛掰!

程序知音

Java kafka java架构 Java进阶 后端技术

Prometheus实战-从0构建高可用监控平台(三)

小毛驴的烂笔头

Linux Prometheus

如何有效的向 AI 提问 ?

繁依Fanyi

人工智能

漫谈Huawei LiteOS五大内核模块_5G/IoT_华为云开发者联盟_InfoQ精选文章