电子说
Huawei LiteOS是华为面向IoT领域,构建的“统一物联网操作系统和中间件软件平台”,以轻量级(内核小于10k)、低功耗(1节5号电池最多可以工作5年),快速启动,互联互通,安全等关键能力,为开发者提供“一站式”完整软件平台,有效降低开发门槛、缩短开发周期。
Huawei LiteOS五大内核模块
下面对LiteOS基础内核的任务管理、内存管理、中断管理、信号量、互斥锁五大模块进行简单介绍。
01、LiteOS内核的任务管理
任务是竞争系统资源的最小运行单元。任务可以使用或等待CPU、使用内存空间等系统资源,并独立于其它任务运行。
Huawei LiteOS是一个支持多任务的操作系统,一个任务就表示一个线程,任务之间可以进行切换和通信。LiteOS的任务管理模块提供任务创建、删除、延时、挂起和恢复、更改任务优先级、锁定任务调度和解锁任务调度、根据任务控制块查询任务 ID、根据 ID 查询任务控制块信息等功能。
因为LiteOS内核是抢占式调度内核,所以高优先级的任务可以打断低优先级任务,低优先级任务必须在高优先级任务阻塞或结束后才能得到调度,同优先级任务会进行时间片轮转调度。优先级表示任务执行的优先顺序,决定了在发生任务切换时即将要执行的任务。LiteOS中的任务一共有32个优先级 (0-31),最高优先级为 0,最低优先级为31。
任务控制TCB
每一个任务都含有一个任务控制块(TCB)。TCB 包含了任务上下文栈指针(stack pointer)、任务状态(包括就绪、运行、阻塞、退出4种状态)、任务栈大小(任务栈里保存着局部变量、寄存器、函数参数、函数返回地址等)、任务优先级、任务ID、任务名等信息。TCB相当于每个任务在内核中的身份证,可以反映出每个任务运行情况。
运作机制
在任务模块初始化时,系统会先申请TCB需要的内存空间。如果任务初始化成功,则系统对TCB内容进行初始化。用户创建任务时,系统会将任务栈进行初始化,预置上下文。此外,系统还会将“任务入口函数”地址放在相应位置。这样在任务第一次启动进入运行态时,将会执行“任务入口函数”。
02、LiteOS内核的内存管理
Huawei LiteOS的内存管理模块管理系统的内存资源,主要包括内存的初始化、分配及释放,是操作系统的核心模块之一。在系统运行过程中,内存管理模块通过对内存的申请/释放操作,来管理用户和OS对内存的使用,使内存的利用率和使用效率达到最优,同时最大限度地解决系统的内存碎片问题。
Huawei LiteOS的内存管理分为动态内存管理和静态内存管理。
动态内存管理
在动态内存池中分配用户指定大小的内存块。
o 优点:按需分配。
o 缺点:内存池中可能出现碎片。
静态内存管理
在静态内存池中分配用户初始化时预设(固定)大小的内存块,初始化后块大小不可变更。
o 优点:分配和释放效率高,静态内存池中无碎片。
o 缺点:只能申请到初始化预设大小的内存块,不能按需申请。
03、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支持:中断初始化、中断创建、开/关中断、恢复中断、中断使能、中断屏蔽。
04、LiteOS内核的信号量
信号量(Semaphore)是一种实现任务间通信的机制,可以用于任务之间同步或临界资源的互斥访问。信号量可以被任务获取或者申请,不同的信号量通过信号量索引号来唯一确定,每个信号量都有一个计数值和任务队列。通常信号量的计数值表示有效的资源数,即剩下的可被占用的互斥资源数。当任务申请(Pend)信号量时,如果申请成功,则信号量的计数值递减,如申请失败,则挂起在该信号量的等待任务队列上,一旦有任务释放该信号量,则等待任务队列中的任务被唤醒开始执行。
信号量运作示意图:
使用场景
信号量是一种非常灵活的同步方式,可以运用在多种场合中,实现锁、同步、资源计数等功能,也能方便的用于任务与任务,中断与任务的同步中。
· 任务间互斥。用作互斥时,信号量创建后记数是满的,在需要使用临界资源时,先申请信号量,使其变空,这样其他任务需要使用临界资源时就会因为无法申请到信号量而阻塞,从而保证了临界资源的安全。
· 任务间同步。用作同步时,信号量在创建后被置为空,任务1申请信号量而阻塞,任务2在某种条件发生后,释放信号量,于是任务1得以进入READY或RUNNING态,从而达到了两个任务间的同步。
· 资源计数。用作资源计数时,信号量的作用是一个特殊的计数器,可以递增或者递减,但是值永远不能为负值,典型的应用场景是生产者与消费者的场景。
· 中断与任务的同步。用作中断与任务的同步时,可以在中断未触发时将信号量的值置为0,从而堵塞中断服务处理任务,一旦中断被触发,则唤醒堵塞的中断服务处理任务进行中断处理。
05、LiteOS内核的互斥锁
互斥锁(mutex)又称互斥型信号量,是一种特殊的二值信号量,用于实现对共享资源的独占式处理。互斥锁主要使用在多任务环境下,此时往往存在多个任务竞争同一共享资源的应用场景。另外,Huawei LiteOS通过优先级继承算法,解决了信号量存在的优先级翻转问题。
运作机制
任意时刻互斥锁只有两种状态:开锁或闭锁。当有任务持有时,互斥锁处于闭锁状态,这个任务获得该互斥锁的所有权。当该任务释放它时,该互斥锁被开锁,任务失去该互斥锁的所有权。当一个任务持有互斥锁时,其他任务将不能再对该互斥锁进行开锁或持有,所以其他任务此时访问这个公共资源将会被阻塞,直到互斥锁被持有该锁的任务释放后,其他任务才能重新访问该公共资源。
互斥锁运作示意图:
图解LiteOS开发环境快速搭建
下面介绍如何在Windows上搭建 LiteOS 的开发调试环境。基于的硬件平台采用的是华为官方推荐的IoT开发板——小熊派(BearPi)。下面将首先介绍开发板与 Windows连接所需的驱动安装,再介绍用于开发LiteOS系统级别软件的集成开发环境(IDE)。LiteOS开发可以使用两种IDE开发环境,分别是华为提供的LiteOS Studio和Keil公司提供的MDK。主要介绍华为目前自研主推的LiteOS Studio,并通过一个简单的用例演示如何使用LiteOS Studio创建一个工程,并对其进行编译、烧录和设备在线调试的具体操作步骤。
1、准备环境
1.1 小熊派(BearPi)介绍
小熊派(BearPi)是一款基于STM32L431RCT6设计的高性能物联网开发板。具有强大的可扩展性,提供给开发者评估及快速设计相关物联网的应用产品。下图展示了BearPi核心板的构成:
图 1 - BearPi 的核心板
出于演示多种物联网解决方案的目的,以及扩展性的需要,整个BearPi套件除了核心板外还提供有多款外扩扩展板插件,整体上这些外扩插件板分为两大类:
一类扩展板上集成了多种 “传感(Sensor)” 设备和 “动作(Actuator)” 设备,“Sensor” 的主要职能是负责从周边环境中采集信息并由MCU(图 2 中标号为 “2” 的黄色线框部分)进行读取,譬如温度传感器可以采集周边环境的温度值、光照传感器可以采集周边环境的光照值等等;而 “Actuator” 则指的是一些可以接受控制指令进行动作的元器件,譬如马达用于执行旋转功能、灯泡可以发光,蜂鸣器可以发出声音等等。这些 “Sensor” 和 “Acurator” 根据不同的应用场景组合后集成在一系列的扩展板上,可以通过标准的插口以插件的形式和 BearPi 的核心板进行连接。参考图2中标号为1的红色线框部分。
另一类扩展板上集成了各种通讯芯片和射频单元,譬如NB-IoT发射单元、Wi-Fi 发射单元等,这些扩展板主要负责在MCU的控制下实现网络连接,实现BearPi 和网络云端设备的互联互通。这些负责网络通讯的扩展板同样通过标准的插口以插件的形式连接在BearPi的核心板上。参考图2中标号为“3” 的绿色线框部分。
图 2 - BearPi 的三大组成部分
1.2 安装驱动
BearPi 开发板通过Micro USB线与PC连接,所以在具体开发调试前首先要在PC上为开发板安装USB驱动。BearPi 已经提供了配套的驱动和 LiteOS Studio 安装包,不做特殊说明,以下安装包采用的都是 BearPi 套件自带的版本。
驱动的安装比较简单,解压 “小熊派开发板资料1软件资料” 目录下的 “STLINK驱动.zip” 压缩包,双击与自己系统对应的安装程序即可, 如图3所示,32位系统选择 X86 安装程序,64位系统选择64位安装程序,并根据安装程序提示安装驱动(也可以直接运行stlink_winusb_install.bat这个批处理安装脚本文件)。要注意的是,由于后面安装的LiteOS Studio软件包只支持64位的版本,所以建议大家开发调试时使用Windows 7版本以上64位的系统,下面演示所使用的环境就是 Windows 7的64位系统。
图 3 - STLINK驱动的安装
安装完驱动后,将开发板通过Micro USB线与PC电脑连接,同时打开Windows的 设备管理器。如果在设备管理器中能找到如图四所示的COM端口,证明驱动安装成功。具体是 “COM3” 还是 “COM4”,这个值在不同的电脑上显示的可能不同,记住这个值,后面使用LiteOS Studio设置串口参数的时候会有用。
图 4 - STLINK 虚拟串口
但有时候插上USB线加载驱动会碰到问题,驱动提示安装不成功。
图 5 - 驱动提示安装不成功
同时设备管理器中出现恼人的黄色感叹号,并提示 “ST-Link VCP Ctrl”。
图 6 - 设备管理器提示 “ST-Link VCP Ctrl” 失败
这个问题据说多半是由于使用了非正版的Windows系统所致。
2、LiteOS Studio开发环境搭建
LiteOS Studio是华为基于LiteOS嵌入式系统软件开发的工具,支持C、C++、汇编等多种开发语言,提供代码编辑、编译、烧录及调试等一站式开发体验。目前支持 ARM Cortex-M0、Cortex-M4、Cortex-M7、Cortex-A7和ARM926EJ-S等芯片架构。LiteOS Studio目前已经适配了多种开发板,其中包括ST、HiSilicon、Fudan Microelectronics等主流厂商的开发板。BearPi基于ST的芯片方案,很方便地可以得到LiteOS Studio的支持。
2.1 安装LiteOS Studio
解压 “小熊派开发板资料1软件资料” 目录下的 “LiteOS_IDE.zip” 压缩包 ,双击安装程序,如 图7 所示, 根据提示进行安装。
安装过程中注意以下几点:
安装路径不能有中文路径,否则即使安装成功程序运行也会异常。
目前IDE只支持 Win7 以上的64位操作系统,所以安装前请先确认 Windows 系统版本是否满足。
图 7 - 安装 LiteOS Studio
2.2 创建LiteOS Studio工程
打开LiteOS Studio软件,在首页上单击 “创建LiteOS Studio工程”。
图 8 - 创建 LiteOS Studio 工程
然后LiteOS Studio会弹出 “配置工程界面”,此时可以对新创建的工程进行基本配置。我们采用最简单的方式进行演示,依次配置如下信息,参考图9的红色线框标识:
图 9 - 配置LiteOS Studio工程信息
LiteOS SDK版本:即本工程基于的LiteOS的内核和中间件的版本,对于LiteOS这样的嵌入式系统,应用和内核是一起参与编译的。这里我们使用缺省版本,即LiteOS Studio安装时自带的一份SDK模版。
工程名称:自己定义,本文填写为 demo。
工程目录:工程的父目录,请选择一个本机存在的目录即可,本文填写为 D:wsiot-dev。
工程类型:选择 “端云最佳实践”,这里LiteOS Studio 自带了一份配合BearPi 的样例工程,我们直接使用即可。
配置好后直接点击 “完成”,需要一些时间,完成后打开IDE的界面如下。
图 10 - LiteOS Studio 界面布局
同时在你指定的 “工程目录” 下创建名为demo的工程子目录并拷贝了相应的SDK和样板工程的代码在工程目录里。
图 11 - 创建的工程目录
2.3 配置LiteOS Studio工程
工程打开后先不要急着编译,正常流程中还需要先配置一下。菜单选择 “工程” -> “工程配置”,或者直接点击工具栏中的图标如下图所示。
图 12 - 配置LiteOS Studio工程
弹出如下 “工程配置” 对话框。由于这里我们使用的是样板工程,这些内容已经都给我们配置好了,所以可以直接忽略这一步。
图 13 - LiteOS Studio工程配置界面
2.4 编译LiteOS Studio工程
菜单选择 “工程” -> “编译” 或者点击工具栏上的图标如下图所示。
图 14 - 编译LiteOS Studio工程
编译会需要一点时间,但相对于Linux那样的大型系统来说还是很快的。编译完成后显示 “编译成功” 以及编译花费的时间。
图 15 - 编译成功
3.5 烧录LiteOS Studio工程
无论是运行还是调试,都需要将编译好的程序先下载(习惯上称之为 “烧录”)到开发板上去。这里我们先确保使用Micro USB线将BearPi 开发板和PC连接好,确保设备管理器上的虚拟串口加载完成(即设备管理器中出现COM端口,如图4所示),然后菜单选择 “工程” -> “烧录”,或者直接点击工具栏中的图标如下图所示。
图 16 - 烧录LiteOS Studio工程
等待烧录完成,界面的控制台中会输出整个烧录过程信息,直到完成后显示 “烧录成功”。
图 17 - 烧录成功
2.6 调试LiteOS Studio工程
简单介绍一下如何在 LiteOS 工程中通过串口打印实现日志跟踪以及如何使用在线调试单步跟踪。
2.6.1 串口打印
调试手段中最基本的就是加打印输出,LiteOS也支持通过串口输出跟踪信息。下面介绍一下如何配置串口。注意:如果要确保下面的步骤中能够在 “串口终端” 中看到打印输出,需要检查BearPi的AT开关,确保其拨到MCU一侧,如下图所示。
图 18 - AT 开关
采用LiteOS Studio自带的串口终端即可接收MCU发送的信息。第一次安装后缺省不显示串口终端,通过菜单选择 “查看” -> “串口终端” 可以将该终端窗口显示出来。
图 19 - 显示串口终端
串口终端显示后还需要对LiteOS Studio做一些串口的基本配置才可以接收串口信息。点击下图中左上侧的 “齿轮” 图标。
图 20 - 配置串口终端
再次打开 “工程配置” 对话框,选择 “串口配置” 项后配置如下信息:
图 21 - 配置串口终端界面
端口:这里选择在安装驱动时看到的COM的端口值,这里选择COM3。
波特率:115200,缺省不变。
数据位:8,缺省不变。
停止位:1,缺省不变。
奇偶(校验):None,缺省不变。
流控:None,缺省不变。
此外还可以勾选是否自动将串口输出的内容保存到日志文件中并指定日志文件的存放路径。
点击 “确认” 后保存串口配置,但此时串口并未开始工作,需要继续参考下图将端口打开使能。这样以后我们就可以看到 “串口终端” 中开始有内容输出了,左边显示的是可读的ASCII字符信息,右边显示的是对应的十六制输出。之所以存在输出是因为我们这里演示采用的例子中已经有一些调用printf() 函数的输出,以后我们在实验中也可以通过类似操作在这里查看程序的执行过程。
图 22 - 打开串口
2.6.2 单步跟踪 LiteOS Studio工程
LiteOS Studio也支持在线单步调试程序。方法很简单。首先确保BearPi开发板通过 Micro USB线连接PC(这也是我们称之为 “在线调试” 的原因),并将需要调试的程序下载烧录到开发板中,然后菜单选择 “调试” -> “开始/继续”,或者直接点击工具栏中的图标如下图所示。
图 23 - 调试LiteOS Studio工程
此时调试器会自动加载对应代码并暂停在整个系统程序的入口处,接下来的操作和我们操作其他的IDE类似。
图 24 - LiteOS Studio工程调试界面
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !