HCIA-IOT学习过程(七)

前几天有些许事情耽搁了~今天继续HCIA-IOT的学习~之前看了一下Huawei LiteOS操作系统的简介,今天就学习一下Huawei LiteOS操作系统的基础架构~Huawei LiteOS操作系统是Huawei1+2+1架构的重点,是华为物联网生态圈的一个重要组成部分。


 Huawei LiteOS Kernel

Huawei LiteOS框架

Huawei LiteOS基础内核是最精简的Huawei LiteOS操作系统,包括:

任务管理、内存管理、时间管理、通信机制、中断管理、队列管理、事件管理、定时器、异常管理等操作系统基础组件,可以单独运行。

任务

提供任务的创建、删除、延迟、挂起、恢复等功能,以及锁定和解锁任务调度。支持任务按优先级高低的抢占调度及同优先级时间片轮转调度。

任务同步

信号量:支持信号量的创建、删除、申请和释放等功能。

互斥锁:支持互斥锁的创建、删除、申请和释放等功能。

硬件相关

提供中断、定时器等功能。

中断:提供中断的创建、删除、使能、禁止、请求位的清除等功能。

定时器:提供定时器的创建、删除、启动、停止等功能。

IPC通信

提供事件、消息队列功能。

事件:支持读事件和写事件功能。

消息队列:支持消息队列的创建、删除、发送和接收功能。

时间管理

系统时间:系统时间是由定时/计数器产生的输出脉冲触发中断而产生的。

Tick时间:Tick是操作系统调度的基本时间单位,对应的时长由系统主频及每秒Tick数决定,由用户配置。

软件定时器:以Tick为单位的定时器功能,软件定时器的超时处理函数在系统创建的Tick软中断中被调用。

内存管理

提供静态内存和动态内存两种算法,支持内存申请、释放。目前支持的内存管理算法有固定大小的BOX算法、动态申请SLAB、DLINK算法。

提供内存统计、内存越界检测功能。

(希望了解更多的请看华为LiteOS开发指南 https://github.com/LiteOS/LiteOS/blob/master/doc/Huawei_LiteOS_Developer_Guide_zh.md

任务

       先说说任务,任务是LiteOS操作系统的核心模块之一,任务有两种调度机制,一种是基于优先级抢占式的调度机制,另一种是在优先级相同的情况下,基于时间片轮转调度方式(就像我们小时候玩电脑一人五分钟那种赶脚)。Huawei LiteOS系统中的每一任务都有多种运行状态。系统初始化完成后,创建的任务就可以在系统中竞争一定的资源,由内核进行调度。

任务状态通常分为以下四种:

就绪(Ready):该任务在就绪列表中,只等待CPU。

运行(Running):该任务正在执行。

阻塞(Blocked):该任务不在就绪列表中。包含任务被挂起、任务被延时、任务正在等待信号量、读写队列或者等待读写事件等。

退出态(Dead):该任务运行结束,等待系统回收资源。

这四种状态可以相互转换的~

就绪态→运行态:任务创建后进入就绪态,发生任务切换时,就绪列表中最高优先级的任务被执行,从而进入运行态,但此刻该任务依旧在就绪列表中。(还是拿小时候玩游戏来举例子,轮到你玩游戏了,你熟练的打开了拳皇,现在你已经从就绪变成了运行了,但是只有一台电脑啊,所以你还是排在最前面的那个)

运行态→阻塞态:正在运行的任务发生阻塞(挂起、延时、获取互斥锁、读消息、读信号量等待等)时,该任务会从就绪列表中删除,任务状态由运行态变成阻塞态,然后发生任务切换,运行就绪列表中剩余最高优先级任务。(玩的正开心呢,你妈拿着笤帚过来了,你被迫从运行态变成阻塞态了,被你妈揍回家了,你也从就绪名单里消失了)

阻塞态→就绪态(阻塞态→运行态):阻塞的任务被恢复后(任务恢复、延时时间超时、读信号量超时或读到信号量等),此时被恢复的任务会被加入就绪列表,从而由阻塞态变成就绪态;此时如果被恢复任务的优先级高于正在运行任务的优先级,则会发生任务切换,将该任务由就绪态变成运行态。(你回家之后又偷偷跑出来了,又从阻塞态变成了就绪态,本应该排在最后的,但是你厉害啊,你是孩子王啊,你上来就抢过了电脑,继续你的拳皇,你也直接从阻塞态变成了运行态,再次回归变成列表第一)

就绪态→阻塞态:任务也有可能在就绪态时被阻塞(挂起),此时任务状态会由就绪态转变为阻塞态,该任务从就绪列表中删除,不会参与任务调度,直到该任务被恢复。(你这边正玩着呢,你旁边小伙伴还没玩上呢,他妈就过来了,好家伙一顿打,把他也给打回家了,他也就从就绪态直接变成了阻塞态)

运行态→就绪态:有更高优先级任务创建或者恢复后,会发生任务调度,此刻就绪列表中最高优先级任务变为运行态,那么原先运行的任务由运行态变为就绪态,依然在就绪列表中。(这就是被你强抢了位置那孩子,无奈谁让你是孩子王呢,本来玩的好好的,你一来,他就从运行态变成了就绪态)。

运行态→退出态:运行中的任务运行结束,任务状态由运行态变为退出态。退出态包含任务运行结束的正常退出以及Invalid状态。例如,未设置分离属性(LOS_TASK_STATUS_DETACHED)的任务,运行结束后对外呈现的是Invalid状态,即退出态。(你终于玩开心了,于是快快乐乐的下机回家了,把位置让给了别的小朋友,你也退出了江湖,深藏功与名。)

阻塞态→退出态:阻塞的任务调用删除接口,任务状态由阻塞态变为退出态。(此时被妈见打的那个孩子还是没有回来,你知道,他今天是回不来了,他也彻底退出了这个游戏)。

内存

       任务要处理数据,数据是存在内存里面的,Lite OS有负责内存管理的一个模块,Huawei LiteOS的内存管理分为静态内存管理和动态内存管理,提供内存初始化、分配、释放等功能。内存管理模块管理系统的内存资源,它是操作系统的核心模块之一。在系统运行过程中,内存管理模块通过对内存的申请/释放操作,来管理用户和OS对内存的使用,使内存的利用率和使用效率达到最优,同时最大限度地解决系统的内存碎片问题。(假如我们不用操作系统而是裸机编程的话, 直接调用Malloc接口直接分配内存[不建议,无法实现一个动态的内存管理,这需要在启动阶段专门给其分配一段空闲的内存区域作为malloc的内存区],如果不使用操作系统的内存管理的话,应用开发者必须自己去规划内存使用的段,因为在申请的时候需要指定申请的起始地址,在申请和释放时必须有一定的规划,不然就会随着程序的执行,出现很多大片的内存中间夹杂一些小内存,这时候就无法再继续申请大片的内存了)还有比如内存写越界、非法指针访问等情况都需要操作系统进行管理。

动态内存: 在动态内存池中分配用户指定大小的内存块。

优点:按需分配。

缺点:内存池中可能出现碎片。

静态内存: 在静态内存池中分配用户初始化时预设(固定)大小的内存块。

优点:分配和释放效率高,静态内存池中无碎片。

缺点:只能申请到初始化预设大小的内存块,不能按需申请。

动态内存运作机制

动态内存管理,即在内存资源充足的情况下,从系统配置的一块比较大的连续内存(内存池),根据用户需求,分配任意大小的内存块。当用户不需要该内存块时,又可以释放回系统供下一次使用。

与静态内存相比,动态内存管理的好处是按需分配,缺点是内存池中容易出现碎片。

LiteOS动态内存支持DLINK和BEST LITTLE两种标准算法。

静态内存运作机制

静态内存实质上是一块静态数组,静态内存池内的块大小在初始化时设定,初始化后块大小不可变更。

静态内存池由一个控制块和若干相同大小的内存块构成。控制块位于内存池头部,用于内存块管理。内存块的申请和释放以块大小为粒度。

任务同步

互斥锁和信号量

信号量(Semaphore)

        信号量就是一个停车场,当前值是停车场里还剩下多少个空车位,最大值是停车场里最多能容纳多少个车位,当汽车进入停车场时,首先要在门口排队(sem_wait),得到进入许可后才能进入。排队顺序原则上先到先得,每进一辆车,停车场就少了1个停车位,即信号量当前值-1。当前值为0时,停车场停满了,所有车不得进入统统在门口排队等。当一辆车离开后,释放其所占据的停车位(sem_post),信号量当前值+1信号量值得到释放后,如果门口有正在排队的车,那么就放进来,每放进来一个就重复前面的步骤。

互斥锁(Mutex)

Mutex就是厕所的隔间,门开着的时候谁都可以进,但是一次只能进一个人进去后就从里面锁上门,厕所里有人的时候其他人就要排队等,直到里面的人出来。

这个解释是我看到的最通俗易懂的解释,基本上官方视频也是这么讲的。

IPC通信

事件:

事件是一种实现任务间通信的机制,可用于实现任务间的同步。一个任务可以等待多个事件的发生:可以是任意一个事件发生时唤醒任务进行事件处理;也可以是几个事件都发生后才唤醒任务进行事件处理。

多任务环境下,任务之间往往需要同步操作,一个等待即是一个同步。事件可以提供一对多、多对多的同步操作。一对多同步模型:一个任务等待多个事件的触发;多对多同步模型:多个任务等待多个事件的触发。

任务可以通过创建事件控制块来实现对事件的触发和等待操作。

Huawei LiteOS提供的事件具有如下特点:

事件不与任务相关联,事件相互独立,一个32位的无符号整型变量,用于标识该任务发生的事件类型,其中每一位表示一种事件类型(0表示该事件类型未发生、1表示该事件类型已经发生)。

事件仅用于任务间的同步,不提供数据传输功能。

多次向任务发送同一事件类型,等效于只发送一次。

允许多个任务对同一事件进行读写操作。

支持事件读写超时机制。

消息队列:

是一种常用于任务间通信的数据结构,实现了接收来自任务或中断的不固定长度的消息,并根据不同的接口选择传递消息是否存放在自己空间。任务能够从队列里面读取消息,当队列中的消息是空时,挂起读取任务;当队列中有新消息时,挂起的读取任务被唤醒并处理新消息。

用户在处理业务时,消息队列提供了异步处理机制,允许将一个消息放入队列,但并不立即处理它,同时队列还能起到缓冲消息作用。

Huawei LiteOS中使用队列数据结构实现任务异步通信工作,具有如下特性:

消息以先进先出方式排队,支持异步读写工作方式。

读队列和写队列都支持超时机制。

发送消息类型由通信双方约定,可以允许不同长度(不超过队列节点最大值)消息。

一个任务能够从任意一个消息队列接收和发送消息。

多个任务能够从同一个消息队列接收和发送消息。

当队列使用结束后,如果是动态申请的内存,需要通过释放内存函数回收。

时间管理

时间管理以系统时钟为基础。时间管理提供给应用程序所有和时间有关的服务。

系统时钟是由定时/计数器产生的输出脉冲触发中断而产生的,一般定义为整数或长整数。输出脉冲的周期叫做一个“时钟滴答”。系统时钟也称为时标或者Tick。一个Tick的时长可以静态配置。

用户是以秒、毫秒为单位计时,而操作系统时钟芯片CPU的计时是以Tick为单位的,当用户需要对系统操作时,例如任务挂起、延时等,输入秒为单位的数值,此时需要时间管理模块对二者进行转换。

Tick与秒之间的对应关系可以配置。

Huawei LiteOS的时间管理模块提供时间转换、统计、延迟功能以满足用户对时间相关需求的实现。

Huawei LiteOS系统中的时间管理主要提供以下两种功能:

时间转换:根据主频实现CPU Tick数到毫秒、微秒的转换。

时间统计:获取系统Tick数。

中断

中断是指出现需要时,CPU暂停执行当前程序,转而执行新程序的过程。即在程序运行过程中,系统出现了一个必须由CPU立即处理的事务。此时,CPU暂时中止当前程序的执行转而处理这个事务,这个过程就叫做中断。

与中断相关的硬件可以划分为三类:设备、中断控制器、CPU本身。

设备:发起中断的源,当设备需要请求CPU时,产生一个中断信号,该信号连接至中断控制器。

中断控制器:中断控制器是CPU众多外设中的一个,它一方面接收其它外设中断引脚的输入,另一方面,它会发出中断信号给CPU。可以通过对中断控制器编程实现对中断源的优先级、触发方式、打开和关闭源等设置操作。常用的中断控制器有VIC(Vector Interrupt Controller)和GIC(General Interrupt Controller),在ARM Cortex-M系列中使用的中断控制器是NVIC(Nested Vector Interrupt Controller)。在ARM Cortex-A7中使用的中断控制器是GIC。

CPU:CPU会响应中断源的请求,中断当前正在执行的任务,转而执行中断处理程序。

 Huawei LiteOS Framework

 

 LiteOS SDK由互联组件和增强组件两部分组成,互联组件负责实现云端互通能力,增强组件配套华为IOT云平台OceanConnect为行业伙伴打造的电信级IOT通用能力。

Huawei LiteOS SDK端云互通组件针对单模组、单MCU和外置MCU+模组两种应用场景,提供了不同的软件架构:

 

LiteOS SDK 端云互通组件软件主要由三个层次构成:

  • 开放API层: LiteOS SDK端云互通组件的开放API为应用程序定义了通用接口,终端设备调用开放API能快速完成华为OceanConnect IoT平台的接入、业务数据上报、下发命令处理等。对于外置MCU+模组的场景,LiteOS SDK端云互通组件还提供了AT 命令适配层,用于对AT命令做解析。

  • 协议层: LiteOS SDK端云互通组件集成了LwM2M/CoAP/DTLS/TLS/UDP等协议。

  • 驱动及网络适配层: LiteOS SDK端云互通组件为了方便终端设备进行集成和移植,提供了驱动及网络适配层,用户可以基于SDK提供的适配层接口列表,根据具体的硬件平台适配硬件随机数、内存管理、日志、数据存储以及网络Socket等接口。

互联框架

       互联框架主要是讲LiteOS对底层协议栈方面的一些支持,LiteOS支持TCP/IP、CoAP、TCP/UDP协议,并且提供对接华为云平台的lib库,对于应用开发者来说,只需调用lib库的接口就能快速的实现设备入网,设备入云,大大简化了编程。优化了Mesh自组网能力,满足海量终端组网,在应用层面提供快速自愈,快速组网的特性,互联框架主要解决的是设备与设备之间的,设备与云之间的通信方面的问题,无需开发者考虑协议栈的问题。

 

 传感框架

        传感框架主要应用在华为终端产品,例如华为手机、华为手表等等。假如没有传感框架的话,应用开发者需要自行负责每一个传感器的硬件的初始化、过程的数据接收、数据的管理,LiteOS的传感框架会提供一个多传感器的统一管理,应用开发者只需要做好传感器与底层的交互就可以了

 

 安全框架

Huawei LiteOS提供了安全框架,包括端云安全、传输安全和终端安全。

端云安全主要涉及云端的认证鉴权,云端会设置白名单,进行双向设备认证。

传输安全包含数据链路安全、网络层安全、路由层RPL安全、DTLS。其中DTLS是数据包传输层安全协议,其提供了UDP传输场景下的安全解决方案,能防止消息被窃听、篡改、身份冒充等问题。

终端安全里通常包含API的认证,对于调用API接口的任务程序与应用需要通过认证。同时,终端安全里划分了一个安全区域,包含白名单,用于端云安全的双向设备认证,设备管理的安全固件与升级,安全启动,安全ID,密钥管理,安全存储等。安全存储是在芯片内部划分了一部分存储空间,这部分空间不会让外部线程访问到。

 

JS运行引擎

js运行引擎是为了解决C代码编程上手难度大的问题,我们提供js编程框架以及配套的js虚拟机。

 

Huawei LiteOS API

 

 

 

本章的内容到这里也就结束了~本文是我对HCIA-IOT第八章的一个总结和归纳。

本文是对HCIA-IOT的学习,资料请自行到华为人才交流中心查看下载

 

2020-08-19    17:09:11

posted @ 2020-08-19 17:10  阿雷Sun  阅读(488)  评论(0)    收藏  举报