LiteOS学习笔记-1LiteOS简介

  • Lite OS特点
    • Lite OS内核
    • LiteOS SDK
      • Huawei IoT Link SDK
        • 1.SDk之OS选择
        • 2.SDk之代码位置
        • 3.SDk之编译设置
    • LiteOS 内核之任务管理
      • 一、任务
        • 1.任务状态
        • 2.任务ID
        • 3.任务优先级
        • 4.多任务运作机制
      • 二、任务管理API
        • 2.1.osal_task_create
        • 2.2.osal_task_kill
        • 2.3.osal_task_exit
        • 2.4.osal_task_sleep
    • LiteOS 内核之信号量
      • 一、信号量
        • 1.信号量使用方式
        • 2.信号量使用场景
        • 3.信号量申请模式
      • 二、信号量API
        • 2.1.osal_semp_create
        • 2.2.osal_semp_del
        • 2.3.osal_semp_pend
        • 2.4.osal_semp_post
    • LiteOS 内核之互斥锁
    • LiteOS 内核之内存管理
      • 内存管理API

此文参考华为云官方社区多篇文章,如有侵权,请联系删除。

Lite OS特点

轻量化,大小为10KB;面向IoT;支持功能静态裁剪;使用make文件可支持动态加载、分散加载。

Lite OS内核

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

LiteOS SDK

LiteOS SDK 是 Huawei LiteOS 软件开发工具包(Software Development Kit),包括端云互通组件,FOTA,JS引擎、传感器框架等内容。

Huawei IoT Link SDK

Huawei IoT Link SDK(下文统一简称SDK)是部署在具备广域网能力、对功耗/存储/计算资源有苛刻限制的终端设备上的轻量级互联互通中间件.

1.SDk之OS选择

Huawei IoT Link SDK 的底层拥有OS适配层,可以适配Linux、MacOS、LiteOS,以及其它第三方OS(需要自行适配),笔者适配的OS是LiteOS。

2.SDk之代码位置

为了用户开发方便,SDK的代码不会出现在 IoT Studio 中,IoT Studio中只有用户的目标工程代码(target),但是,SDK的代码会在编译的时候被编译进工程。
SDK代码位置:C:\Users\XXXXX\.iotlink

3.SDk之编译设置

SDK使用 arm-none-eabi-gcc 工具链进行编译,使用 make 工具构建编译,使用*.mk 文件留给用户配置一些 makefile 中的选项。

  1. 设置编译器和make工具路径
    一般情况下为默认即可。
  2. 设置工程makefile
    整个工程的 makefile 在 GCC 目录下,在编译之前,要确保在IoT SDK设置中指定该makefile。

LiteOS 内核之任务管理

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

一、任务

在 LiteOS 中,一个任务就是一个线程,多个任务按照优先级进行抢占式调度,达到多个任务“同时”运行的目的。
每个任务都有多种运行状态。当系统初始化完成并启动调度器后,系统中所有创建的任务就由内核进行调度,在不同运行状态之间切换,同时在系统中竞争一定的资源。

1.任务状态

任务的状态有以下四种:

  • 就绪(Ready):该任务在就绪列表中,只等待 CPU;
  • 运行(Running):该任务正在执行;
  • 阻塞(Blocked):该任务不在就绪列表中。包含任务被挂起、任务被延时、任务正在等待信号量、读写队列或者等待读写事件等;
  • 退出态(Dead):该任务运行结束,等待系统回收资源。

2.任务ID

任务 ID 在任务创建时通过参数返回给用户,作为任务的一个非常重要的标识。
用户可以通过任务ID对指定任务进行任务挂起、任务恢复、查询任务名等操作。

3.任务优先级

优先级表示任务执行的优先顺序。任务的优先级决定了在发生任务切换时即将要执行的任务,在就绪列表中的最高优先级的任务将得到执行。
Huawei LiteOS 的任务一共有 32 个优先级 (0-31),最高优先级为 0,最低优先级为 31。
因为是LiteOS的内核是抢占式调度内核,所以:
高优先级的任务可打断低优先级任务,低优先级任务必须在高优先级任务阻塞或结束后才能得到调度。

4.多任务运作机制

Liteos由用户实现每个新任务得到调度后将执行的函数,该函数称为任务入口函数
在多任务操作系统的内核中,为了方便对每个任务进行管理,每一个任务都有一个任务控制块(TCB),其中包含了任务上下文栈指针(stack pointer)、任务状态、任务优先级、任务ID、任务名、任务栈大小等信息,TCB 相当于每个任务在内核中的身份证,可以反映出每个任务运行情况。
每个任务相当于一个裸机程序,每个任务之间相互独立,这个“独立”指的是每个任务都有自己的运行环境 —— 栈空间,称为任务栈,栈空间里保存的信息包含局部变量、寄存器、函数参数、函数返回地址等。
用户创建任务时,系统会先申请任务控制块需要的内存空间,申请成功后,系统会将任务栈进行初始化,预置上下文。此外,系统还会将“任务入口函数”地址放在相应位置。这样在任务第一次启动进入运行态时,将会执行“任务入口函数”。

二、任务管理API

LiteOS 任务管理提供的 API 都是以 LOS 开头,但是这些 API 使用起来比较复杂,所以Huawei IoT Link SDK 提供了统一API接口,这些接口底层已经使用 LiteOS 提供的API实现,对用户而言更为简洁,API列表如下:

接口名 功能描述
osal_task_create 创建任务
osal_task_kill 删除任务(非自身)
osal_task_exit 任务退出
osal_task_sleep 任务休眠

osal的api接口声明在osal.h中,使用相关的接口需要包含该头文件,关于函数的详细参数请参考该头文件的声明。
任务相关的接口定义在osal.c中,基于LiteOS的接口实现在 liteos_imp.c文件中.

2.1.osal_task_create

void* osal_task_create(const char *name,int (*task_entry)(void *args),\void *args,int stack_size,void *stack,int prior)
{void *ret = NULL;if((NULL != s_os_cb) &&(NULL != s_os_cb->ops) &&(NULL != s_os_cb->ops->task_create)){ret = s_os_cb->ops->task_create(name, task_entry,args,stack_size,stack,prior);}return ret;
}

2.2.osal_task_kill

int osal_task_kill(void *task)
{int ret = -1;if((NULL != s_os_cb) &&(NULL != s_os_cb->ops) &&(NULL != s_os_cb->ops->task_kill)){ret = s_os_cb->ops->task_kill(task);}return ret;}

2.3.osal_task_exit

void osal_task_exit()
{if((NULL != s_os_cb) &&(NULL != s_os_cb->ops) &&(NULL != s_os_cb->ops->task_exit)){s_os_cb->ops->task_exit();}return ;}

2.4.osal_task_sleep

void osal_task_sleep(int ms)
{if((NULL != s_os_cb) &&(NULL != s_os_cb->ops) &&(NULL != s_os_cb->ops->task_sleep)){s_os_cb->ops->task_sleep(ms);}return ;}

LiteOS 内核之信号量

在多任务操作系统中,不同的任务之间需要同步运行,信号量功能可以为用户提供这方面的支持。信号量(Semaphore)是一种实现任务间通信的机制,实现任务之间同步或临界资源的互斥访问。

一、信号量

1.信号量使用方式

信号量可以被任务获取或者申请,不同的信号量通过信号量索引号来唯一确定,每个信号量都有一个计数值和任务队列。
通常一个信号量的计数值用于对应有效的资源数,表示剩下的可被占用的互斥资源数,其值的含义分两种情况:

  • 0:表示没有积累下来的 Post 操作,且有可能有在此信号量上阻塞的任务;
  • 正值:表示有一个或多个 Post 下来的释放操作;

当任务申请(Pend)信号量时,如果申请成功,则信号量的计数值递减,如若申请失败,则挂起在该信号量的等待任务队列上,一旦有任务释放该信号量,则等待任务队列中的任务被唤醒开始执行。

2.信号量使用场景

  • 互斥锁

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

  • 任务间同步

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

  • 资源计数

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

  • 中断与任务的同步

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

3.信号量申请模式

信号量有三种申请模式:非阻塞模式、永久阻塞模式、定时阻塞模式,用 timeout 参数的值选择。

  • 非阻塞模式(0):

任务需要申请信号量,若当前信号量的任务数没有到信号量设定的上限,则申请成功。否则,立即返回申请失败

  • 永久阻塞模式(cn_osal_timeout_forever或0xFFFFFFFF):

任务需要申请信号量,若当前信号量的任务数没有到信号量设定的上限,则申请成功。否则,该任务进入阻塞态,系统切换到就绪任务中优先级最高者继续执行。任务进入阻塞态后,直到有其他任务释放该信号量,阻塞任务才会重新得以执行

  • 定时阻塞模式(任意定时值,32bit):

任务需要申请信号量,若当前信号量的任务数没有到信号量设定的上限,则申请成功。否则,该任务进入阻塞态,系统切换到就绪任务中优先级最高者继续执行。任务进入阻塞态后,指定时间超时前有其他任务释放该信号量,或者用户指定时间超时后,阻塞任务才会重新得以执行

由于中断不能被阻塞,因此在申请信号量时,阻塞模式不能在中断中使用。

二、信号量API

API相关文件与任务管理相同。API列表如下:

接口名 功能描述
osal_semp_create 信号量创建
osal_semp_del 信号量删除
osal_semp_pend 信号量申请
osal_semp_post 信号量释放

2.1.osal_semp_create

bool_t  osal_semp_create(osal_semp_t *semp,int limit,int initvalue)
{bool_t ret = false;if((NULL != s_os_cb) &&(NULL != s_os_cb->ops) &&(NULL != s_os_cb->ops->semp_create)){ret = s_os_cb->ops->semp_create(semp,limit,initvalue);}return ret;}

2.2.osal_semp_del

bool_t  osal_semp_del(osal_semp_t semp)
{bool_t ret = false;if((NULL != s_os_cb) &&(NULL != s_os_cb->ops) &&(NULL != s_os_cb->ops->semp_del)){ret = s_os_cb->ops->semp_del(semp);}return ret;}

2.3.osal_semp_pend

bool_t  osal_semp_pend(osal_semp_t semp,unsigned int timeout)
{bool_t ret = false;if((NULL != s_os_cb) &&(NULL != s_os_cb->ops) &&(NULL != s_os_cb->ops->semp_pend)){ret = s_os_cb->ops->semp_pend(semp,timeout);}return ret;}

2.4.osal_semp_post

bool_t  osal_semp_post(osal_semp_t semp)
{bool_t ret = false;if((NULL != s_os_cb) &&(NULL != s_os_cb->ops) &&(NULL != s_os_cb->ops->semp_post)){ret = s_os_cb->ops->semp_post(semp);}return ret;}

LiteOS 内核之互斥锁

在多任务环境下,往往存在多个任务竞争同一共享资源的应用场景,互斥锁可被用于对共享资源的保护从而实现独占式访问。互斥锁(mutex)又称互斥型信号量,是一种特殊的二值信号量,用于实现对共享资源的独占式处理。另外,Huawei LiteOS提供的互斥锁通过优先级继承算法,解决了优先级翻转问题。 互斥锁操作与信号量类似,不再赘述。

LiteOS 内核之内存管理

LiteOS动态内存支持 DLINK 和 BEST LITTLE 两种标准算法。
LiteOS动态内存管理的方法使用宏定义的方法使能,在用户工程目录下的OS_CONFIG中的target_config.h文件中配置。
在该文件中,找到下面这两项宏定义,置为 YES 则表示使能:

  • 开启BEST LITTLE 算法
 #define LOSCFG_MEMORY_BESTFIT   YES
  • 开启SLAB机制
#define LOSCFG_KERNEL_MEM_SLAB  YES

此处不对算法进行赘述,直接看API。

内存管理API

API相关文件与任务管理相同。API列表如下:

接口名 功能描述
osal_malloc 按字节申请分配动态内存空间
osal_free 释放已经分配的动态内存空间
osal_zalloc 按字节申请分配动态内存空间,分配成功则初始化这块内存所有值为0
osal_realloc 重新申请分配动态内存空间
osal_calloc 申请分配num个长度为size的动态内存空间

无论选择使用哪种动态内存管理算法,都使用该API。

LiteOS学习笔记-1LiteOS内核相关推荐

  1. LIteOS学习笔记-7LiteOS启动流程与编译流程

    LIteOS学习笔记-7LiteOS启动流程与编译流程 LiteOS启动流程 1. 启动方式 2. 启动流程 硬件初始化 内核初始化 调试串口初始化 尝试进行网络连接 启动任务调度 LiteOS编译流 ...

  2. LiteOS学习笔记-9LiteOS SDK oc流程之MQTT

    LiteOS学习笔记-9LiteOS SDK oc流程之MQTT MQTT协议 MQTT协议简介 MQTT消息类型 LiteOS中MQTT实现 LiteOS OC MQTT 抽象组件 概述 配置并连接 ...

  3. LiteOS学习笔记-5通信模组之LiteOS的SAL及socket编程

    LiteOS学习笔记-5通信模组之LiteOS的SAL及socket编程 一.SAL套接字抽象层 二.Socket套接字简介 Socket概述 Socket结构体 字节序转换函数 ip地址的转换 字节 ...

  4. LiteOS学习笔记-4通信模组之AT框架

    LiteOS学习笔记-4通信模组之AT框架 一.AT客户端简介 什么是AT客户端 AT客户端框架作用 二.串口驱动框架实现 2.1串口初始化 2.2读写缓冲区ring_buffer 2.3读写实现与注 ...

  5. 哈工大操作系统学习笔记五——内核级线程实现

    哈工大os学习笔记五(内核级线程实现) 文章目录 哈工大os学习笔记五(内核级线程实现) 一. 中断入口.中断出口(前后两段) 1. 从int中断进入内核(中断入口第一段) 2.中断出口(最后一段) ...

  6. 内存管理基础学习笔记 - 2. 内核地址空间 - SLAB

    目录 1. 前言 2. slab总体说明 3. kmem_cache_create |- -__kmem_cache_create |- - -setup_cpu_cache 4. kmem_cach ...

  7. linux内核字符驱动设备,Linux学习笔记——linux内核字符设备驱动-Go语言中文社区...

    尝试在树莓派安装的raspbian系统上进行linux字符设备驱动 1.更新安装kernel header源码 sudo apt-get update sudo apt-get install ras ...

  8. linux学习笔记 linux内核6.0.2目录结构

    一.linux内核目录 arch 包含和硬件体系结构相关的代码,每种平台占一个相应的目录,如i386.arm.arm64.powerpc.mips等.Linux内核目前已经支持30种左右的体系结构.在 ...

  9. 国嵌linux内核编程,国嵌视频学习笔记---linux内核开发1

    一.linux内核简介 1.linux系统由两部分组成:内核空间和用户空间. 2.用户空间包括:用户应用程序和C库 3.内核空间包括:系统调用接口.内核和体系结构相关代码. 4.ARM处理器7种工作模 ...

最新文章

  1. Spring AOP相关术语解释及简单使用
  2. mysql查看数据类型命令_mysql菜鸟指南(增删查改、数据类型、常用命令)
  3. 深入理解Java虚拟机(类文件结构)
  4. 使用Azure静态Web应用部署Blazor Webassembly应用
  5. IO多路复用之select全面总结(必看篇)
  6. 基于php的外卖订餐系统开题报告_石化二小参加区2020省市级现代教育技术课题研究开题会议...
  7. Javascript图形处理库 -- Raphaël
  8. 20180312顺序查找
  9. 2017上半年软考 第十二章 重要知识点
  10. 沃尔什矩阵与哈达玛矩阵的简单理解与程序式快速生成
  11. java.sql.SQLSyntaxErrorException: Unknown database ‘数据库名‘
  12. python/appium实现华为应用商城app界面上下滑动打开关闭通知栏等功能
  13. 微信小程序getPhoneNumber获取手机号,解决code失效问题
  14. 正反向隔离装置(网闸)
  15. 行业认证标准:PCI DSS - 支付卡行业数据安全标准
  16. rule of thumb - “经验法则”或者“拇指规则”
  17. 基于Python对Lending Club信贷业务数的分析
  18. css垂直居中和水平居中方法总结
  19. 【大数据可视化分析】股吧帖子情感倾向及用户参与行为
  20. Python-函数应用

热门文章

  1. 广州金蝶财务软件|番禺金蝶财务软件|金蝶迷你版特价优惠中
  2. 十三、传智书城项目设计
  3. Eclipse新建工作空间后,怎么把之前的配置复制到新的空间上来?
  4. 程序人生:从全栈工程师看技术人生
  5. 使用包configparser,出现UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 155: illegal mu
  6. 深度学习笔记之关于常用模型或者方法
  7. 银行接口开发记录(招商银行,工商银行,建设银行)
  8. LibreOffice转换文档格式命令
  9. 第十三章 J20飞机游戏项目完整代码(尚学堂java300集笔记)
  10. 青蛙过河 C# 求解