精华内容
下载资源
问答
  • Huawei LiteOS简介 Huawei LiteOS是华为面向物联网领域开发的一个基于实时内核的轻量级操作系统。本项目属于华为物联网操作系统[Huawei LiteOS]源码,现有基础内核包括不可裁剪的极小内核和可裁剪的其他模块。极小...
  • Hi35xx Huawei LiteOS开发环境用户指南_海思_liteos开发资料_LiteOS.zip
  • LiteOS-LiteOS-master.zip

    2020-09-13 19:54:35
    Huawei LiteOS 是华为面向IoT领域,构建的"统一物联网操作系统和中间件软件平台",以轻量级(内核小于10k)、低功耗(1节5号电池最多可以工作5年),快速启动,互联互通,安全等关键能力,为开发者提供 “一站式” ...
  • 华为海思开发平台,采用最新的liteos系统
  • Hi35xx Huawei LiteOS开发环境用户指南_海思_liteos开发资料_LiteOS_源码.zip
  • LiteOS STM32L431 EVBM1移植教程V1.1
  • LiteOS STM32L431_STM32L431_Lite-OS_LiteOS.zip
  • LiteOS Cortex-A Introduction Directory Structure Constraints Usage Preparations Source Code Acquisition Compilation and Building Repositories Involved Introduction The OpenHarmony ...
  • LiteOS STM32L431_STM32L431_Lite-OS_LiteOS_源码.zip
  • LiteOS Cortex-A Introduction Directory Structure Constraints Usage Preparations Source Code Acquisition Compilation and Building Repositories Involved Introduction The OpenHarmony ...
  • 文章目录1、获取源码2、什么是LiteOS3、LiteOS的目录介绍4、LiteOS 中Make体系5、LiteOS 中Kconfig的配置5.1、顶层Kconfig5.2、具体板级的deconfig文件6、编译7、顶层目录下的config.mk文件主要完成如下功能的配置:...

    在这里插入图片描述

    1、获取源码

    OpenHarmonyHarmonyOS的开源版,由华为捐赠给开放原子开源基金会(OpenAtom Foundation)开源。第一个开源版本支持在128KB~128MB设备上运行,欢迎参加开源社区一起持续演进。

    代码仓库地址1:https://codechina.csdn.net/openharmony
    在这里插入图片描述

    代码仓库地址2:https://openharmony.gitee.com
    在这里插入图片描述

    本专栏主要分析OpenHarmony内核的相关代码:
    Cortex-A系列处理器内核:kernel_liteos_a
    Cortex-M系列处理器内核:kernel_liteos_m

    2、什么是LiteOS

    Huawei LiteOS是华为针对物联网领域推出的轻量级物联网操作系统,是华为物联网战略的重要组成部分,具备轻量级、低功耗、互联互通、组件丰富、快速开发等关键能力,基于物联网领域业务特征打造领域性技术栈,为开发者提供 “一站式” 完整软件平台,有效降低开发门槛、缩短开发周期,可广泛应用于可穿戴设备、智能家居、车联网、LPWA等领域。

    Huawei LiteOS微内核在OpenHarmony源码中所处的位置:
    在这里插入图片描述

    3、LiteOS的目录介绍

    我们以Cortex-A系列处理器内核为例:kernel_liteos_a
    在这里插入图片描述
    可以看到有12目录、4个文件。

    • 目录的作用
    名称描述
    apps用户态的init和shell应用程序。
    arch体系架构的目录,如arm等。
    bsdfreebsd相关的驱动和适配层模块代码引入,例如USB等。
    compat内核posix接口的兼容。
    fs文件系统模块,主要来源于NuttX开源项目。
    kernel进程、内存、IPC等模块。
    lib内核的lib库。
    net网络模块,主要来源于lwip开源项目。
    platform支持不同的芯片平台代码,如Hi3516DV300等。
    security安全特性相关的代码,包括进程权限管理和虚拟id映射管理。
    syscall系统调用。
    tools构建工具及相关配置和代码。
    • 文件的作用
    名称描述
    Makefile存储了源码文件构建目标文件的规则,具体是否按着规则去执行还要看配置变量。
    Kconfig配置变量
    config.mk主要进行编译选项的设置、编译工具的定义、编译时包含的文件、编译的链接地址。
    build.sh编译脚本

    4、LiteOS 中Make体系

    顶层 Makefile 在编译时是入口点,从整体上组织所有的 Makefile 文件,并定义终极目标,在这里还定义了与平台无关的很多核心变量与一些很重要的 make目标。顶层 Makefile 位于内核源码的根目录,下面我们分析顶层 Makefile 的主要工作。

    用户在内核目录中键入make menuconfig之后 ,工作流程如下 :

    1. 顶 层 Makefile调用解析顶层Kconfig文件,获得待配置条目;
    2. 判断是否有已配置好的.config文件,如果有则导入;
    3. 用户在配置好后,将配置结果存入配置文件。

    Linux类似LiteOSMake体系顶层 makefile会通过读取配置文件,递归编译内核代码树的相关目录。
    /kernel_liteos_a/Makefile

    ##### make menuconfig #####
    export CONFIG_=LOSCFG_
    MENUCONFIG_PATH = $(LITEOSTOPDIR)/tools/menuconfig
    KCONFIG_FILE_PATH = $(LITEOSTOPDIR)/Kconfig
    

    5、LiteOS 中Kconfig的配置

    无论在什么平台上,软件配置是用户接触程序的第一步,我们这里是内核配置,那么入口就是Kconfig文件。

    5.1、顶层Kconfig

    通过顶层的Kconfig我们可以看见内核所以支持的功能,类似说明书一样,等待你去打开功能。
    例如:

    kernel_liteos_a/Kconfig

    //包含其他的Kconfig
    source "../../vendor/hisi/hi35xx/platform/hiedmac/Kconfig"
    source "../../kernel/liteos_a/bsd/dev/usb/Kconfig"
    source "../../drivers/hdf/lite/Kconfig"
    
    config USB_DEBUG
        bool "Enable USB Debug"
        default n
        depends on SHELL && DRIVERS_USB && DEBUG_VERSION
        help
          Answer Y to enable LiteOS support usb debug.
          use shell command to open the specified debug level print.
          
    config MEM_DEBUG
        bool "Enable MEM Debug"
        default n
        depends on DEBUG_VERSION
        help
          Answer Y to enable LiteOS support mem debug.
    

    通过source加载其他的Kconfig例如加载USB相关配置

    kernel_liteos_a/bsd/dev/usb/Kconfig:

    config DRIVERS_USB
        bool "Enable USB"
        default y
        depends on DRIVERS && COMPAT_BSD
        help
          Answer Y to enable LiteOS support usb.
    
    config DRIVERS_USB_HOST_DRIVER
        bool "Enable USB HCD"
        default y
        depends on DRIVERS_USB && DRIVERS
        help
          Answer Y to enable LiteOS to support usb host controller driver.
    ...
    

    5.2、具体板级的deconfig文件

    可配置说明书有了,我们也不能每次都重新配置一遍把,这个时候就有板级默认配置。

    目前LiteOS中Cortex-A系列处理器内核为例:kernel_liteos_a适配的开发板:hi3518hi3516,并提供了已经配置好的.config,下来我们以hi3518为例子对其进行分析。
    源文件为:tools/build/config/hi3516dv300_release.config
    在这里插入图片描述
    通过该文件我们可以知道内核配置包括了些什么?
    CPU、开发板、文件系统、驱动程序和调试等大量的待配置信息。

    # Automatically generated file; DO NOT EDIT.
    # Huawei LiteOS Configuration
    
    # Compiler
    ...
    # Platform
    ...
    # Extra Configurations
    ...
    # Kernel
    ...
    # Lib
    ...
    # Compat
    ...
    # FileSystem
    ...
    # Net
    ...
    # Debug
    ...
    # Driver
    LOSCFG_DRIVERS=y
    LOSCFG_DRIVERS_USB=y
    LOSCFG_DRIVERS_USB_HOST_DRIVER=y
    # LOSCFG_DRIVERS_USB_HOST_EHCI is not set
    LOSCFG_DRIVERS_USB_HOST_XHCI=y
    LOSCFG_DRIVERS_USB_DEVICE_CLASS_DRIVERS=y
    

    后面我们就将以LOSCFG_DRIVERS_USB为切入点分析源码,但在这之前,我们配置有了,下来就是编译了。

    6、编译

    kernel_liteos_a/bsd/dev/usb/Makefile
    最后编译时候,会根据.config编译相关的源代码:

    例如下面这些代码都将会进行编译,生成了目标文件usb_bask

    include $(LITEOSTOPDIR)/config.mk
    
    MODULE_NAME := usb_base
    
    ifeq ($(LOSCFG_DRIVERS_USB), y)
    LOCAL_SRCS += $(CORE_SRC)/usb_dynamic.c  \
                  $(CORE_SRC)/usb_parse.c  \
                  $(CORE_SRC)/usb_error.c  \
                  $(CORE_SRC)/usb_handle_request.c  \
                  $(CORE_SRC)/usb_util.c  \
                  $(CORE_SRC)/usb_lookup.c  \
                  $(CONTROLLER_HOST_SRC)/usb_controller.c  \
                  $(QUIRK_SRC)/usb_quirk.c \
                  $(CORE_SRC)/usb_device.c  \
                  $(CORE_SRC)/usb_process.c  \
                  $(CORE_SRC)/usb_hub.c  \
                  $(CORE_SRC)/usb_request.c  \
                  $(CORE_SRC)/usb_transfer.c  \
                  $(CORE_SRC)/usb_dev.c  \
                  $(CORE_SRC)/usb_mbuf.c  \
                  $(CORE_SRC)/usb_generic.c \
                  $(CORE_SRC)/usb_if.c
    endif
    

    这里生成目标文件是如何链接的内核中,这个时候我们就要开始分析config.mk的作用了:

    7、顶层目录下的config.mk文件主要完成如下功能的配置:

    1、确定生成可执行文件过程中需要的各种工具,如编译器(arm-linux-gcc)、连接器(arm-linux-ld)、反汇编器(arm-linux-objdump
    2、确定CPU、板相关的配置文件,存在于各个目录下的config.mk
    3、确定编译、链接、转换等过程的操作选项
    4、根据步骤3确定的编译连接选项生成需要的文件
    kernel_liteos_a/Makefile:

    $(LD) $(LITEOS_LDFLAGS) $(LITEOS_TABLES_LDFLAGS) $(LITEOS_DYNLDFLAGS) -Map=$(OUT)/$@.map -o $(OUT)/$@ --start-group $(LITEOS_LIBDEP) --end-group
    

    kernel_liteos_a\config.mk:

    ############### this is a makefile that you can config it ###############
    -include $(LITEOSTOPDIR)/tools/build/mk/los_config.mk
    ...
    LITEOS_LIBDEP   := $(LITEOS_BASELIB)
    

    目录:kernel_liteos_a\tools\build\mk\los_config.mk

    ############################# Platform Option Begin#################################
    include $(LITEOSTOPDIR)/platform/bsp.mk
    ...
    ifeq ($(LOSCFG_DRIVERS_USB), y)
        LITEOS_BASELIB  += -lusb_base
        LIB_SUBDIRS     += $(LITEOSTOPDIR)/bsd/dev/usb
        LITEOS_USB_INCLUDE += -I $(LITEOSTOPDIR)/bsd/dev/usb
    ifeq ($(LOSCFG_USB_DEBUG), y)
        LITEOS_CMACRO   += -DLOSCFG_USB_DEBUG
    endif
    endif
    ...
    

    看到这里,我相信大家对kernel_liteos_a整个代码框架有了整体的印象,后面我们就会深入到具体的驱动模块及子系统中看看,它是如何实现的。

    我正在参加 CSDN 的鸿蒙技术征文活动,给我点赞支持,感谢。

    展开全文
  • LiteOS Cortex-M Introduction Directory Structure Constraints Usage Repositories Involved Introduction The OpenHarmony LiteOS Cortex-M is the kernel designed for the lightweight operating system ...
  • LiteOS学习笔记-1LiteOS简介Lite OS特点Lite OS内核LiteOS SDK 此文参考https://bbs.huaweicloud.com/blogs/124244 Lite OS特点 轻量化,大小为10KB;面向IoT;支持功能静态裁剪;使用make文件可支持动态加载、分散...


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

    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 Studio零成本学习LiteOS物联网操作系统

    千次阅读 多人点赞 2020-12-15 11:25:56
    LiteOS社区现在对外开放了对Qemu模拟器的适配工程,在不使用开发板的情况下,也可以搭建LiteOS开发环境,做到零成本,非常方便初学者学习。 Qemu简介 Qemu是一套由FabriceBellard编写的以GPL许可证的模拟处理器,...
    摘要:大家在学习物联网操作系统开发的时候,都不得不准备一套开发板和仿真器,也是一笔不小的投资。LiteOS社区现在对外开放了对Qemu模拟器的适配工程,在不使用开发板的情况下,也可以搭建LiteOS开发环境,做到零成本,非常方便初学者学习。

    Qemu简介

    Qemu是一套由FabriceBellard编写的以GPL许可证的模拟处理器,在GNU/Linux平台上使用广泛,也支持在X86环境上运行。有关Qemu的介绍可参考其github社区内容。LiteOS Stduio使用Qemu realview-pbx-a9开发板来模拟运行LiteOS开源工程。本文主要介绍Windows下基于Qemu运行LiteOS。

    安装Qemu

    在Windows上安装Qemu。下载qemu-w64-setup-20201124.exe,默认安装即可,不再赘述。如下图:

    LiteOS Studio安装

    HUAWEI LiteOS Studio 是以Visual Studio Code社区开源代码为基础,根据LiteOS嵌入式系统软件开发语言、业务场景等特点开发的一款轻量级定制集成开发环境解决方案。对于熟悉Visual Studio Code的开发者,非常容易上手。

    访问LiteOS Studio官网,下载LiteOS Studio安装软件,安装过程非常简单,直接看官网资料即可,不赘述。安装完毕之后,需要参考官网文档,搭建windows开发环境

    (如下图)。

    注意,新建工程时,需要git客户端工具,请确保本地已安装git for windows工具并添加环境变量。

    新建Qemu仿真工程

    点击新建工程图标,打开新建工程界面。在使用LiteOS Studio新建工程时,确保网络畅通,可以访问LiteOS开源社区站点https://gitee.com/LiteOS/LiteOS。

    • 工程名称:填入自定义的工程名
    • 工程目录:填入或选择工程存储路径
    • SDK版本号:选择Gitee-LiteOS-Master
    • 开发板列表:选择Qemureakview-pbx-a9开发板

    点击确认,后台将下载并保存所选目标板的SDK,下载完成后自动打开新建的工程。

    编译Qemu仿真工程

    点击工具栏上的编译图标, 开始编译。编译成功后,在控制台输出如下信息:

    在编译完毕,打开工程设置,在烧录器Burner和调测器Debugger设置里,分别设置需要烧录的bin文件和调测使用的elf可执行文件,分别如下图:
    烧录器Burner配置:

    调试器Debugger配置:

    除了烧录器、调试器,LiteOS Studio工程设置还支持对开发板、编译器、组件管理、串口等进行设置,大家可以自行查看相应的设置。本文使用默认设置即可,设置完毕后,点击确认Comfirm保存。

    运行Qemu仿真工程

    对于真实开发板,需要把镜像bin或者hex文件烧录到开发板,才能运行。使用Qemu模拟器好处是并不需要真实烧录,启动Qemu传入镜像参数即可。我们复用烧录功能,点击工具栏上的图标进行烧录,启动Qemu模拟器运行编译的LiteOS工程。

    运行成功的截图如下:

    默认的配置时,输出启动信息后,就进入shell模式,我们可以输入task,查看运行中的任务的信息。更多LiteOS shell命令,请参考 https://gitee.com/LiteOS/LiteOS/tree/master/shell 。Shell命令输出示例如下:

    如果想退出Qemu运行,在Terminal终端窗口同时按Ctrl + A,然后按X键即可退出。

    配置Qemu仿真工程运行Kernel Demo

    LiteOS是高度可配置的系统,除了默认设置,我们可以在工程设置--组件管理中对系统组件配置进行定制。这里演示下如何开启Kernel Demo在Qemu模拟器上运行。

    开启的这个Kernel Task DemoDemo代码执行入口如下:

    UINT32 Example_TskCaseEntry(VOID)
    {
        UINT32 ret;
        TSK_INIT_PARAM_S stInitParam;
    
        /* lock task shcedue */
        printf("\nKernel task demo begin.\n");
        LOS_TaskLock();
    
        printf("LOS_TaskLock() ok.\n");
    
        stInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_TaskHi;
        stInitParam.usTaskPrio = TSK_PRIOR_HI;
        stInitParam.pcName = "HIGH_NAME";
        stInitParam.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;
        /* create high prio task */
        ret = LOS_TaskCreate(&g_demoTaskHiId, &stInitParam);
        if (ret != LOS_OK) {
            LOS_TaskUnlock();
    
            printf("Example_TaskHi failed.\n");
            return LOS_NOK;
        }
    
        printf("Create Example_TaskHi ok.\n");
    
        stInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_TaskLo;
        stInitParam.usTaskPrio = TSK_PRIOR_LO;
        stInitParam.pcName = "LOW_NAME";
        stInitParam.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;
        /* create low prio task */
        ret = LOS_TaskCreate(&g_demoTaskLoId, &stInitParam);
        if (ret != LOS_OK) {
            /* delete high prio task */
            if (LOS_OK != LOS_TaskDelete(g_demoTaskHiId)) {
                printf("Delete TaskHi failed.\n");
            }
    
            LOS_TaskUnlock();
    
            printf("Create Example_TaskLo failed.\n");
    
            return LOS_NOK;
        }
    
        printf("Create Example_TaskLo ok.\n");
    
        /* unlock task schedue */
        LOS_TaskUnlock();
        LOS_TaskDelay(40);
     
        return ret;
    }

    示例代码先后创建了2个任务,一个名为HIGH_NAME、一个名为LOW_NAME。在两个任务里,演示了Task相关的接口LOS_TaskSuspend、LOS_TaskResume、LOS_TaskDelay、LOS_TaskDelete的使用。更完整的示例请访问https://gitee.com/LiteOS/LiteOS/blob/master/demos/kernel/api/los_api_task.c。
    了解到Demo代码后,重新编译一下。编译成功后,点击烧录按钮运行,即可看到如下输出:

    看到实际运行的效果后,建议读者们好好阅读下相关的Demo代码,包含任务、内存管理、中断、IPC通信、时间管理、双向链表、任务同步等。请参考:https://gitee.com/LiteOS/LiteOS/tree/master/demos/kernel

    调测Qemu仿真工程

    HUAWEI LiteOS Studio 调测非常简单易用,点击工具栏上的调测按钮即可开启GDB图形化调测。对于我们的Qemu工程,开始调测后的界面如下:

    对界面上的区域进行介绍下:

    • 变量Variable

    展示局部变量、全局变量、静态变量的值。

    • 监视Watch

    监视指定的表达式,可以输入变量名称或者表达式,实时计算结果。

    • 调用堆栈Call Stack

    展示当前运行状态和暂停状态的任务调用堆栈。

    • 断点Breakpoints

    展示设置的断点。

    • 寄存器Registers

    查看各个寄存器的数值,支持复制数值操作。

    • 源代码窗口

    高亮显示当前执行的源代码行。

    • 反汇编窗口

    对应当前源代码文件行所在的反汇编代码。

    • 输出Output

    展示GDB客户端的输出日志。

    • 调试控制台Debug Console

    展示GDB Server的输出日志。
    读者们可以继续尝试,继续、单步、跳入、调测、停止等调测动作。更加详细的调测介绍,请参考 ---调试器-执行调试。

    本文演示了如何准备LiteOS Studio环境,如何新建Qemu工程,如何编译、烧录、如何组件配置Kernel Demo、如何GDB调测。
    LiteOS Studio工具还是容易上手的,非常适合学习物联网开发的。特别是对于初学者,不需要购买开发板,即可以学习、体验LiteOS物联网操作系统开发。通过对LiteOS开源社区提供的Kernel Demo的学习、实际上手练习,会对LiteOS操作系统内核会有个更深入的了解。

    附资料:

    LiteOS Studio社区资料:https://liteos.gitee.io/liteos_studio/#/

    LieOS开源代码:https://gitee.com/liteos

    Qemu介绍: https://github.com/qemu/qemu

    QEMU Binaries for Windows (64 bit)下载:https://qemu.weilnetz.de/w64/

    Linux环境基于Qemu运行LiteOS,请参考:https://gitee.com/LiteOS/LiteOS/blob/master/targets/realview-pbx-a9/README_CN.md

     

     

    点击关注,第一时间了解华为云新鲜技术~

    展开全文
  • LiteOS】小白进阶之 LiteOS 基础详解

    万次阅读 多人点赞 2019-01-21 16:40:54
    1、Huawei LiteOS 的内核浅析 内核分为两个层次: 第一层是基础内核,第二层是扩展内核。 基础内核的源码是开源的,可以在 github 上看到 Huawei LiteOS 基础内核源码项目地址: Huawei LiteOS 基础内核源码: ...

    1、Huawei LiteOS 的内核浅析

    内核分为两个层次:

    第一层是基础内核,第二层是扩展内核。

    基础内核的源码是开源的,可以在 github 上看到 Huawei LiteOS 基础内核源码项目地址:

    Huawei LiteOS 基础内核源码:

    LiteOS 源码

    基础内核提供的能力包括:

    任务调度
    内存管理
    中断机制
    队列管理
    事件管理
    IPC 机制
    时间管理
    软定时器
    双向链表等常用数据结构

    扩展内核提供的能力包括:

    运行-暂停机制
    动态框架

    基于这两层内核,Huawei LiteOS 的主要特征如下:

    实时内核
    轻量级
    低功耗
    快速启动
    可裁剪
    分散加载

    三个上层开发框架及其意义:

    1)传感器协同控制与管理框架

    该框架有如下三方面主要特征:

    实时传感器事件机制:

    以事件处理的形式将实时传感器所涉及的数据感应管理起来;

    多传感器数据融合算法:

    不仅仅是依次简单处理单个传感器的传感数据,而是采用数据融合算法将多个传感器的传感数据融合处理获取维度更广的实时数据,以支撑系统做出智能决策;

    传感器管理:

    鉴于物联网时代的智能设备绝对不仅仅集成数量极少的传感器,而很有可能是数量庞大的传感器,那如何有效的管理这些传感器就成为了一个极有挑战性的话题。

    该框架所代表的意义:

    以事件机制来管理实时传感器数据,可以简化编程模型,对于未来的智能设备开发者多有裨益;
    以多传感器数据融合算法为基础,可以在更多传感器数据基础上得到更加智能的系统决策;
    更进一步设想,在将来的 AR、VR 和 MR 时代中,此类多传感器的使用场景不在少数,而该框架为这类场景提供了最佳的解决方案基石。

    2)联接引擎框架

    该框架具备如下特征:

    多场景互联支持:支持智慧家庭、设备、工业环境等;
    多协议互联支持:支持多种联接协议;
    多样距离互联支持 - 支持多种长距或短距联接协议。

    该框架的意义在于:

    可以同时支持多种联接协议,而不必担心会被既有的使用某些特定物联网协议的开发者所遗弃;
    可以最大程度上满足现有物联网领域开发者的需求,从而极大拓展自身的生态圈。

    3)运行时引擎

    该框架主要包含如下模块:

    轻量级 JavaScript 引擎:构建于 Huawei LiteOS 内核之上,支撑 JavaScript 运行时环境;
    JavaScript 开发框架:物联网领域开发者可以基于该框架开发应用;

    JavaScript 运行时引擎的意义包括:

    可以将为数众多 JavaScript 程序员作为目标群体,并且可以有效降低物联网领域开发者的入门门槛;
    构建于低功耗内核之上的运行时引擎可以与内核协同优化性能和功耗;
    如果说 Android 成功的一个主要原因是它采用 Java 作为主要开发语言的话,那么 JavaScript 作为 Huawei LiteOS 开发语言的意义绝不亚于Java 之于 Android。
    
    

    2、基本概念

    从系统的角度看,任务是竞争系统资源的最小运行单元。

    任务可以使用或等待 CPU、使用内存空间等系统资源,并独立于其它任务运行。

    Huawei LiteOS 的任务模块可以给用户提供多个任务,实现了任务之间的切换和通信,帮助用户管理业务程序流程。

    Huawei LiteOS 是一个支持多任务的操作系统。

    在 Huawei LiteOS 中,一个任务表示一个线程。

    Huawei LiteOS 中的任务是抢占式调度机制,同时支持时间片轮转调度方式。

    高优先级的任务可打断低优先级任务,低优先级任务必须在高优先级任务阻塞或结束后才能得到调度。

    Huawei LiteOS 的任务一共有 32 个优先级(0-31),最高优先级为 0,最低优先级为 31。

    3、任务相关概念

    3.1、任务状态

    Huawei LiteOS 系统中的每一任务都有多种运行状态。

    系统初始化完成后,创建的任务就可以在系统中竞争一定的资源,由内核进行调度。

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

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

    任务状态迁移说明:

    就绪态→运行态:

    任务创建后进入就绪态,发生任务切换时,就绪列表中最高优先级的任务被执行,从而进入运行态,但此刻该任务依旧在就绪列表中。

    运行态→阻塞态:

    正在运行的任务发生阻塞(挂起、延时、读信号量等待)时,该任务会从就绪列表中删除,任务状态由运行态变成阻塞态,然后发生任务切换,运行就绪列表中剩余最高优先级任务。

    阻塞态→就绪态(阻塞态→运行态):

    阻塞的任务被恢复后(任务恢复、延时时间超时、读信号量超时或读到信号量等),此时被恢复的任务会被加入就绪列表,从而由阻塞态变成就绪态;此时如果被恢复任务的优先级高于正在运行任务的优先级,则会发生任务切换,将该任务由就绪态变成运行态。

    就绪态→阻塞态:

    任务也有可能在就绪态时被阻塞(挂起),此时任务状态会有就绪态转变为阻塞态,该任务从就绪列表中删除,不会参与任务调度,直到该任务被恢复。

    运行态→就绪态:

    有更高优先级任务创建或者恢复后,会发生任务调度,此刻就绪列表中最高优先级任务变为运行态,那么原先运行的任务由运行态变为就绪态,依然在就绪列表中。

    运行态→退出态:

    运行中的任务运行结束,任务状态由运行态变为退出态。退出态包含任务运行结束的正常退出以及impossible状态。例如,未设置分离属性(LOS_TASK_STATUS_DETACHED)的任务,运行结束后对外呈现的是impossible状态,即退出态。

    阻塞态→退出态:

    阻塞的任务调用删除接口,任务状态由阻塞态变为退出态。

    3.2、任务 ID

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

    3.3、任务优先级

    优先级表示任务执行的优先顺序。任务的优先级决定了在发生任务切换时即将要执行的任务。在就绪列表中的最高优先级的任务将得到执行。

    3.4、任务入口函数

    每个新任务得到调度后将执行的函数。

    该函数由用户实现,在任务创建时,通过任务创建结构体指定。

    3.5、任务控制块 TCB

    每一个任务都含有一个任务控制块(TCB)。

    TCB 包含了任务上下文栈指针(stack pointer)、任务状态、任务优先级、任务 ID、任务名、任务栈大小等信息。

    TCB 可以反映出每个任务运行情况。

    3.6、任务栈

    每一个任务都拥有一个独立的栈空间,我们称为任务栈。栈空间里保存的信息包含局部变量、寄存器、函数参数、函数返回地址等。任务在任务切换时会将切出任务的上下文信息保存在自身的任务栈空间里面,以便任务恢复时还原现场,从而在任务恢复后在切出点继续开始执行。

    3.7、任务上下文

    任务在运行过程中使用到的一些资源,如寄存器等,我们称为任务上下文。当这个任务挂起时,其他任务继续执行,在任务恢复后,如果没有把任务上下文保存下来,有可能任务切换会修改寄存器中的值,从而导致未知错误。

    因此,Huawei LiteOS在任务挂起的时候会将本任务的任务上下文信息,保存在自己的任务栈里面,以便任务恢复后,从栈空间中恢复挂起时的上下文信息,从而继续执行被挂起时被打断的代码。

    3.8、任务切换

    任务切换包含获取就绪列表中最高优先级任务、切出任务上下文保存、切入任务上下文恢复等动作。

    3.9、运作机制

    Huawei LiteOS 任务管理模块提供任务创建、任务延时、任务挂起和任务恢复、锁任务调度和解锁任务调度、根据任务控制块查询任务ID、根据ID查询任务控制块信息功能。

    在用户创建任务之前,系统会先申请任务控制块需要的内存空间,如果系统可用的内存空间小于其所需要的内存空间,任务模块就会初始化失败。如果任务初始化成功,则系统对任务控制块内容进行初始化。

    用户创建任务时,系统会将任务栈进行初始化,预置上下文。此外,系统还会将“任务入口函数”地址放在相应位置。这样在任务第一次启动进入运行态时,将会执行“任务入口函数”。

     

    展开全文
  • Huawei_LiteOS在STM32系列处理器上的移植-Huawei_LiteOS_workshop
  • LiteOS】HUAWEI LiteOS 详解

    千次阅读 2019-02-12 16:03:46
    Huawei LiteOS 是华为面向 IoT 领域,构建的轻量级物联网操作系统,遵循 BSD-3 开源许可协议,可广泛应用于智能家居、个人穿戴、车联网、城市公共服务、制造业等领域,大幅降低设备布置及维护成本,有效降低开发门槛...
  • 摘要:本文带来基于LiteOS一站式开发工具LiteOS Studio,通过单步调试,来动态分析LiteOS的启动流程。 编者按:在LiteOS大揭秘系列,我们和读者们分享了《LiteOS是怎么在STM32上开始运行的》,从源码上静态分析了一...
  • 1、LiteOS 简介 Huawei LiteOS 是华为轻量级物联网操作系统,其体系架构如下图所示: Huawei LiteOS由Huawei LiteOS kernel、互联互通中间件、开放API以及安全组成: 1)Huawei LiteOS Kernel为Huawei LiteOS...
  • Huawei LiteOS是华为面向物联网领域开发的一个基于实时内核的轻量级操作系统。第一感觉文档相当全面!!!可以去LiteOS的GitHub查看:https://github.com/LiteOS/LiteOS 安装IoT-Studio_0.3.6(最新版本)。 Lite...
  • LiteOS】STM32F103-LiteOS移植教程(详细篇)

    万次阅读 多人点赞 2019-10-14 10:54:34
    本文基于STM32F103C8T6,详细讲述华为LiteOS的移植过程。开发工具是MDK5。LiteOS官方已经适配过cortex M系列内核的单片机,因此移植过程非常简单。 LiteOS有两种移植方案:OS接管中断和非接管中断方式。接管中断...
  • stm32f103的华为物联系统liteos系统的移植和显示屏的驱动代码
  • LiteOS内核

    2017-06-16 13:30:10
    liteos源文件,包括多个工程模板
  • LiteOS移植常见问题分析1、CMSIS版本导致的问题2、无法下载和调试代码3、没有重定向printf导致程序死掉4、关于OS是否托管中断5、关于时间片轮转6、其他问题 发现很多人在LiteOS的移植过程中总会遇到一些问题,现在...
  • Huawei LiteOS 官方学习资源 LiteOS 是在 2015 华为网络大会上华为发布的敏捷网络 3.0 中的一个轻量级的物联网操作系统,LiteOS 体积只有 10KB 级。 2015 年 5 月 20日,在 2015 华为网络大会上,华为发布了敏捷...
  • LiteOSLiteOS移植教程(STM32F103C8+MDK)

    千次阅读 多人点赞 2019-09-28 22:18:36
    本文基于STM32F103C8T6,详细讲述华为LiteOS的移植过程。开发工具是MDK5。LiteOS官方已经适配过cortex M系列内核的单片机,因此移植过程非常简单。 LiteOS有两种移植方案:OS接管中断和非接管中断方式。接管中断的...
  • LiteOSLiteOS移植常见问题

    千次阅读 2019-10-14 10:50:58
    发现很多人在LiteOS的移植过程中总会遇到一些问题,现在简单做一些总结。后续有新的问题提再继续补充。 1、CMSIS版本导致的问题 问题现象一般如下图所示,编译后报错,Undefined symbol __get_IPSR (找不到 符号__...
  • 利用STM32指南者开发板以及STM32CubeMX(移植采用STM32HAL库)移植华为物联网操作系统LiteOS源码(华为官网LiteOS_develop源码)以及NB相关组件,之前移植走了很多坑,所以做了一个详细的笔记,从源码下载到移植测试...
  • 物联网技术包括万象,其端测开发离不开LiteOS,首先本文主要介绍LiteOS概述包括定义、特点、SDK、应用以及意义,支持的硬件、其与鸿蒙的关系,后续将对开发板的串口、中断、gpio、用户按键、时钟、systick、timer、...
  • Liteos_howevercgv_rootfiz_stm32_基于liteos的i2c_华为_源码.zip

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,048
精华内容 5,219
关键字:

liteos