当前位置: 首页 > news >正文

OpenHarmony轻量级内核LiteOS-M技术详解与应用实践

1. 概述

LiteOS-M是华为开发的轻量级实时操作系统,专为物联网(IoT)和资源受限的嵌入式设备设计。作为OpenHarmony生态系统的重要组成部分,LiteOS-M提供了精简高效的内核、丰富的中间件组件和强大的开发工具链,支持从简单传感器到复杂智能设备的各种应用场景。

1.1 设计目标

LiteOS-M的设计目标是提供:

  • 极小资源占用:内核最小可配置至几KB RAM和几十KB ROM
  • 高实时性:微秒级中断响应和任务切换时间
  • 低功耗:完善的功耗管理机制,支持多种低功耗模式
  • 高可靠性:内存保护、栈溢出检测等安全机制
  • 易用性:标准POSIX接口和丰富的开发工具

1.2 应用场景

LiteOS-M主要应用于:

  • 智能家居设备(传感器、开关、控制器等)
  • 可穿戴设备(手环、手表等)
  • 工业物联网设备
  • 智能城市终端设备
  • 车载电子设备

2. 系统架构

LiteOS-M采用分层架构设计,从下到上包括:

┌─────────────────────────────────────────────────────┐
│                应用层                               │
├─────────────────────────────────────────────────────┤
│              中间件层                               │
│  ┌───────────┐ ┌───────────┐ ┌───────────┐         │
│  │  联接框架  │ │  安全框架  │ │  图形框架  │         │
│  └───────────┘ └───────────┘ └───────────┘         │
├─────────────────────────────────────────────────────┤
│              系统服务层                             │
│  ┌───────────┐ ┌───────────┐ ┌───────────┐         │
│  │  文件系统  │ │  网络协议  │ │  系统调用  │         │
│  └───────────┘ └───────────┘ └───────────┘         │
├─────────────────────────────────────────────────────┤
│              内核层                                 │
│  ┌───────────┐ ┌───────────┐ ┌───────────┐         │
│  │  任务管理  │ │  内存管理  │ │  IPC机制   │         │
│  │  时间管理  │ │  中断管理  │ │  同步原语  │         │
│  └───────────┘ └───────────┘ └───────────┘         │
├─────────────────────────────────────────────────────┤
│              硬件抽象层(HAL)                        │
│  ┌───────────┐ ┌───────────┐ ┌───────────┐         │
│  │  CPU抽象   │ │  驱动框架  │ │  板级支持  │         │
│  └───────────┘ └───────────┘ └───────────┘         │
└─────────────────────────────────────────────────────┘

3. 内核机制详解

3.1 任务管理

3.1.1 任务控制块(TCB)

LiteOS-M的任务控制块(LosTaskCB)是任务管理的核心数据结构,定义如下:

typedef struct {VOID            *stackPointer;      /* 任务栈指针 */UINT16          taskStatus;         /* 任务状态 */UINT16          priority;           /* 任务优先级 */UINT16          timeSlice;          /* 时间片 */UINT32          waitTimes;          /* 等待次数 */SortLinkList    sortList;           /* 排序链表节点 */UINT64          startTime;          /* 开始时间 */UINT32          stackSize;          /* 栈大小 */UINT32          topOfStack;         /* 栈顶 */UINT32          taskID;             /* 任务ID */TSK_ENTRY_FUNC  taskEntry;          /* 任务入口函数 */UINT32          semID;              /* 信号量ID */UINT32          muxID;              /* 互斥锁ID */UINT32          *args;              /* 任务参数 */CHAR            *taskName;          /* 任务名称 */LOS_DL_LIST     pendList;           /* 等待链表 */LOS_DL_LIST     timerList;          /* 定时器链表 */LOS_DL_LIST     joinList;           /* 连接链表 */UINT32          *stack;             /* 任务栈 */UINT32          taskMux;            /* 任务互斥锁 */UINT32          eventMask;          /* 事件掩码 */UINT32          eventMode;          /* 事件模式 */UINT32          *msg;               /* 消息 */UINT32          errorNo;            /* 错误号 */UINT32          signal;             /* 信号字段 */VOID            *extension;         /* 扩展字段 */
} LosTaskCB;
3.1.2 任务状态

LiteOS-M定义了12种任务状态:

#define OS_TASK_STATUS_UNUSED        0x0001U  /* 未使用 */
#define OS_TASK_STATUS_INIT          0x0002U  /* 初始化 */
#define OS_TASK_STATUS_READY         0x0004U  /* 就绪 */
#define OS_TASK_STATUS_RUNNING       0x0008U  /* 运行中 */
#define OS_TASK_STATUS_SUSPENDED     0x0010U  /* 挂起 */
#define OS_TASK_STATUS_BLOCKED       0x0020U  /* 阻塞 */
#define OS_TASK_STATUS_DELAY         0x0040U  /* 延迟 */
#define OS_TASK_STATUS_PEND          0x0080U  /* 等待资源 */
#define OS_TASK_STATUS_EXIT          0x0100U  /* 退出 */
#define OS_TASK_STATUS_FREE          0x0200U  /* 释放 */
#define OS_TASK_STATUS_LOCK          0x0400U  /* 锁定 */
#define OS_TASK_STATUS_DELETE        0x0800U  /* 删除 */
3.1.3 任务调度

LiteOS-M采用基于优先级的抢占式调度算法,支持32个优先级(0-31),0为最高优先级。调度器主要特性包括:

  • 时间片轮转:同优先级任务采用时间片轮转调度
  • 优先级抢占:高优先级任务可抢占低优先级任务
  • 防止优先级反转:通过优先级继承机制解决优先级反转问题

核心调度函数包括:

  • LOS_Schedule:触发任务调度
  • LOS_TaskYield:同优先级任务让出CPU
  • LOS_TaskPriSet:设置任务优先级
  • LOS_TaskLock/LOS_TaskUnlock:锁定/解锁任务调度

3.2 内存管理

3.2.1 内存池结构

LiteOS-M采用静态内存池管理方式,内存池结构如下:

typedef struct {VOID            *pool;             /* 内存池起始地址 */UINT32          poolSize;          /* 内存池大小 */UINT32          totalUsedSize;     /* 总使用大小 */UINT32          totalFreeSize;     /* 总空闲大小 */UINT32          maxFreeNodeSize;   /* 最大空闲节点大小 */UINT32          usedNodeNum;       /* 已使用节点数 */UINT32          freeNodeNum;       /* 空闲节点数 */UINT32          allocCount;        /* 分配次数 */UINT32          freeCount;         /* 释放次数 */UINT32          magic;             /* 魔数 */
} OsMemPoolInfo;typedef struct {struct OsMemNodeHead *prevNode;    /* 前一个节点 */struct OsMemNodeHead *nextNode;    /* 后一个节点 */UINT32              sizeAndFlag;   /* 大小和标志 */
} OsMemNodeHead;
3.2.2 内存分配算法

LiteOS-M采用伙伴算法和SLAB算法相结合的内存管理策略:

  • 小内存分配:使用SLAB算法管理小块内存
  • 大内存分配:使用伙伴算法管理大块内存
  • 内存对齐:支持按指定边界对齐的内存分配

核心内存管理API:

  • LOS_MemInit:初始化内存池
  • LOS_MemAlloc:分配内存
  • LOS_MemFree:释放内存
  • LOS_MemRealloc:重新分配内存
  • LOS_MemAllocAlign:按对齐边界分配内存

3.3 进程间通信(IPC)机制

3.3.1 队列(Queue)

队列是LiteOS-M中主要的通信机制,用于任务间传递消息:

typedef struct {UINT8          *queue;            /* 队列缓冲区 */UINT16         queueSize;         /* 队列大小 */UINT16         queueLen;          /* 队列长度 */UINT16         queueID;           /* 队列ID */UINT16         queueHead;         /* 队列头指针 */UINT16         queueTail;         /* 队列尾指针 */UINT16         readWriteableCnt;  /* 可读写计数 */UINT16         maxMsgSize;        /* 最大消息大小 */LOS_DL_LIST    readWriteList;     /* 读写等待链表 */LOS_DL_LIST    memList;           /* 内存管理链表 */
} LosQueueCB;

核心队列API:

  • LOS_QueueCreate:创建队列
  • LOS_QueueWrite:写入队列
  • LOS_QueueRead:读取队列
  • LOS_QueueDelete:删除队列
3.3.2 信号量(Semaphore)

信号量用于任务间同步和资源计数:

typedef struct {UINT16         semCount;          /* 信号量计数 */UINT16         maxSemCount;       /* 最大信号量计数 */UINT16         semID;             /* 信号量ID */LOS_DL_LIST    semList;           /* 等待链表 */
} LosSemCB;

核心信号量API:

  • LOS_SemCreate:创建信号量
  • LOS_SemPost:释放信号量
  • LOS_SemPend:获取信号量
  • LOS_SemDelete:删除信号量
3.3.3 互斥锁(Mutex)

互斥锁用于保护共享资源,防止多任务同时访问:

typedef struct {UINT16         muxCount;          /* 互斥锁计数 */UINT16         muxID;             /* 互斥锁ID */UINT32         owner;             /* 持有者任务ID */UINT16         priority;          /* 原始优先级 */LOS_DL_LIST    muxList;           /* 等待链表 */
} LosMuxCB;

核心互斥锁API:

  • LOS_MuxCreate:创建互斥锁
  • LOS_MuxLock:获取互斥锁
  • LOS_MuxUnlock:释放互斥锁
  • LOS_MuxDelete:删除互斥锁
3.3.4 事件(Event)

事件机制提供了一种灵活的任务间同步方式:

typedef struct {UINT32         uwEventID;         /* 事件ID */LOS_DL_LIST    stEventList;       /* 事件链表 */
} EVENT_CB_S;

核心事件API:

  • LOS_EventInit:初始化事件
  • LOS_EventWrite:写入事件
  • LOS_EventRead:读取事件
  • LOS_EventClear:清除事件

3.4 时间管理

3.4.1 软件定时器

LiteOS-M提供了软件定时器机制,支持单次和周期性定时:

typedef struct {UINT8          mode;              /* 定时器模式 */UINT8          state;             /* 定时器状态 */UINT16         timerID;           /* 定时器ID */UINT32         interval;          /* 定时间隔 */UINT32         count;             /* 当前计数 */SWTMR_PROC_FUNC handler;          /* 处理函数 */UINT32         *args;             /* 参数 */SortLinkList   sortList;          /* 排序链表节点 */
} LosSwtmrCB;

核心定时器API:

  • LOS_SwtmrCreate:创建定时器
  • LOS_SwtmrStart:启动定时器
  • LOS_SwtmrStop:停止定时器
  • LOS_SwtmrDelete:删除定时器
3.4.2 时间管理机制

LiteOS-M采用Tickless时间管理机制,以减少系统功耗:

  • 系统Tick:基于硬件定时器产生周期性中断
  • 时间链表:使用排序链表管理所有定时任务
  • 动态Tick:在空闲时关闭Tick中断,进入低功耗模式

3.5 中断管理

3.5.1 中断处理流程

LiteOS-M的中断处理流程如下:

  1. 中断响应:硬件中断触发,保存现场
  2. 中断处理:执行中断服务程序(ISR)
  3. 任务调度:检查是否需要任务调度
  4. 现场恢复:恢复被中断任务的上下文
3.5.2 中断嵌套

LiteOS-M支持多级中断嵌套,通过中断优先级管理:

  • 中断优先级:数值越小,优先级越高
  • 中断屏蔽:高优先级中断可以屏蔽低优先级中断
  • 快速中断(FIQ):最高优先级中断,用于时间敏感操作

4. 系统配置

4.1 配置文件

LiteOS-M通过配置文件los_config.h进行系统配置:

// 任务配置
#define LOSCFG_BASE_CORE_TSK_LIMIT          32      /* 最大任务数 */
#define LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE 0x800  /* 默认栈大小 */
#define LOSCFG_BASE_CORE_TSK_MIN_STACK_SIZE 0x180   /* 最小栈大小 */
#define LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT  10      /* 默认时间片 */// 内存配置
#define LOSCFG_SYS_HEAP_SIZE               0x10000  /* 堆大小 */
#define LOSCFG_BASE_MEM_NODE_SIZE          64       /* 内存节点大小 */// IPC配置
#define LOSCFG_BASE_IPC_QUEUE_LIMIT        16       /* 最大队列数 */
#define LOSCFG_BASE_IPC_SEM_LIMIT          16       /* 最大信号量数 */
#define LOSCFG_BASE_IPC_MUX_LIMIT          16       /* 最大互斥锁数 */// 定时器配置
#define LOSCFG_BASE_CORE_SWTMR_LIMIT       16       /* 最大软件定时器数 */
#define LOSCFG_BASE_CORE_SWTMR_QUEUE_SIZE  10       /* 定时器队列大小 */

4.2 裁剪配置

LiteOS-M支持模块化裁剪,可根据需求选择所需功能:

// 功能模块裁剪
#define LOSCFG_KERNEL_TICKLESS             YES     /* Tickless模式 */
#define LOSCFG_KERNEL_SMP                  NO      /* 多核支持 */
#define LOSCFG_KERNEL_CPUP                 YES     /* CPU使用率统计 */
#define LOSCFG_KERNEL_RUNSTOP              YES     /* 运行停止模式 */// 调试功能裁剪
#define LOSCFG_DEBUG_QUEUE                 YES     /* 队列调试 */
#define LOSCFG_DEBUG_SEM                   YES     /* 信号量调试 */
#define LOSCFG_DEBUG_MUTEX                 YES     /* 互斥锁调试 */

5. 开发指南

5.1 开发环境搭建

5.1.1 工具链准备
  • 编译工具:GCC ARM工具链
  • 调试工具:OpenOCD + GDB
  • 烧录工具:厂商提供的专用烧录工具
5.1.2 项目结构

典型的LiteOS-M项目结构如下:

project/
├── src/                 # 源代码目录
│   ├── main.c          # 主程序
│   ├── task_a.c        # 任务A
│   └── task_b.c        # 任务B
├── include/            # 头文件目录
├── board/              # 板级支持包
├── tools/              # 开发工具
├── Makefile            # 构建脚本
└── README.md           # 项目说明

5.2 应用开发示例

5.2.1 多任务示例
#include "los_task.h"
#include "los_sem.h"// 任务A
VOID TaskA(VOID *arg)
{while (1) {printf("Task A is running...\n");LOS_TaskDelay(1000);  // 延时1秒}
}// 任务B
VOID TaskB(VOID *arg)
{while (1) {printf("Task B is running...\n");LOS_TaskDelay(2000);  // 延时2秒}
}// 主函数
int main(VOID)
{UINT32 taskAId, taskBId;// 创建任务ATSK_INIT_PARAM_S taskAInit = {.pfnTaskEntry = (TSK_ENTRY_FUNC)TaskA,.uwStackSize = 0x800,.pcName = "TaskA",.usTaskPrio = 5,};LOS_TaskCreate(&taskAId, &taskAInit);// 创建任务BTSK_INIT_PARAM_S taskBInit = {.pfnTaskEntry = (TSK_ENTRY_FUNC)TaskB,.uwStackSize = 0x800,.pcName = "TaskB",.usTaskPrio = 6,};LOS_TaskCreate(&taskBId, &taskBInit);// 启动调度器LOS_Start();return 0;
}
5.2.2 信号量同步示例
#include "los_task.h"
#include "los_sem.h"// 全局信号量
static UINT32 g_semId;// 生产者任务
VOID ProducerTask(VOID *arg)
{while (1) {printf("Producer: Producing item...\n");LOS_TaskDelay(1000);  // 模拟生产过程// 释放信号量LOS_SemPost(g_semId);printf("Producer: Item produced, signal posted.\n");}
}// 消费者任务
VOID ConsumerTask(VOID *arg)
{while (1) {// 等待信号量LOS_SemPend(g_semId, LOS_WAIT_FOREVER);printf("Consumer: Item consumed.\n");}
}// 主函数
int main(VOID)
{UINT32 producerId, consumerId;// 创建信号量LOS_SemCreate(0, &g_semId);// 创建生产者任务TSK_INIT_PARAM_S producerInit = {.pfnTaskEntry = (TSK_ENTRY_FUNC)ProducerTask,.uwStackSize = 0x800,.pcName = "Producer",.usTaskPrio = 5,};LOS_TaskCreate(&producerId, &producerInit);// 创建消费者任务TSK_INIT_PARAM_S consumerInit = {.pfnTaskEntry = (TSK_ENTRY_FUNC)ConsumerTask,.uwStackSize = 0x800,.pcName = "Consumer",.usTaskPrio = 6,};LOS_TaskCreate(&consumerId, &consumerInit);// 启动调度器LOS_Start();return 0;
}

5.3 调试与性能分析

5.3.1 日志系统

LiteOS-M提供了分级日志系统:

#include "los_printf.h"// 日志级别
#define LOG_EMERG   0   /* 紧急 */
#define LOG_ALERT   1   /* 警报 */
#define LOG_CRIT    2   /* 严重 */
#define LOG_ERR     3   /* 错误 */
#define LOG_WARNING 4   /* 警告 */
#define LOG_NOTICE  5   /* 通知 */
#define LOG_INFO    6   /* 信息 */
#define LOG_DEBUG   7   /* 调试 */// 日志输出
PRINTK("This is an info message.\n");
PRINT_EMG("This is an emergency message.\n");
5.3.2 性能分析

LiteOS-M提供了性能分析接口:

// CPU使用率统计
extern UINT32 LOS_CpupUsageGet(UINT32 taskId);// 任务切换信息获取
extern UINT32 LOS_TaskSwitchInfoGet(TaskSwitchInfo *switchInfo);// 内存使用情况获取
extern UINT32 LOS_MemInfoGet(VOID *pool, MemInfo *memInfo);

6. 与LiteOS-A的对比

特性LiteOS-MLiteOS-A
目标平台MCU/资源受限设备应用处理器/资源丰富设备
内核大小最小几KB几百KB
内存管理静态内存池动态内存分配+虚拟内存
任务调度基于优先级抢占式基于优先级抢占式+公平调度
进程模型单进程多任务多进程多任务
文件系统简化版文件系统完整文件系统(VFS)
网络协议栈轻量级协议栈完整TCP/IP协议栈
图形支持无/简单图形完整图形系统
安全机制基本安全机制完整安全框架

7. 总结

LiteOS-M作为OpenHarmony面向轻量级设备的操作系统内核,具有以下特点:

  1. 轻量高效:内核极小,资源占用低,适合资源受限的设备
  2. 实时性好:微秒级中断响应,满足实时应用需求
  3. 功能完整:提供任务管理、内存管理、IPC、时间管理等完整功能
  4. 易于开发:提供标准POSIX接口和丰富的开发工具
  5. 高度可配置:支持模块化裁剪,可根据需求定制功能
http://www.dtcms.com/a/528038.html

相关文章:

  • hive自定义函数
  • 做新媒体每天必看的网站wordpress exif
  • Elasticsearch从入门到进阶——分布式特性
  • Elasticsearch并发更新冲突问题与解决
  • 数据结构14:查找
  • 怎样做网站模板wordpress用阿里云oss
  • Spring Java配置:告别XML新时代
  • Flutter 异步进阶:Isolate 与 compute 的性能优化实践
  • 太原网站建设模板网页制作的公司怎么注册
  • Linux拓展
  • 亚马逊云渠道商:本地SSD缓存如何保障数据安全?
  • seo外包公司排名深圳网站优化最好的方法
  • SQL优化详解与案例、以及索引失效场景;
  • llama.cpp:Linux_x86端测试Qwen2.5-Omni
  • Java-160 MongoDB副本集部署实战 单机三实例/多机同法 10 分钟起集群 + 选举/读写/回滚全流程
  • 使用RedisTemplate设计一个消息队列?
  • 海龟交易系统R
  • 【攻防实战】Redis未授权RCE联动metasploit打穿三层内网(上)
  • 织梦网站图片修改不了wordpress模板开发 2016
  • .Net Framework 3.5下载安装教程(附安装包)
  • pycharm远程提交Git
  • PLM实施专家宝典:离散制造企业工程变更的“流程金融”方案
  • Orleans分布式系统架构详细分析
  • 建设网站的价钱深圳宝安上市公司网站建设报价
  • F034 vue+neo4j 体育知识图谱系统|体育文献知识图谱vue+flask知识图谱管理+d3.js可视化
  • 【day10】分治
  • 【Go】C++转Go:数据结构练习(一)排序算法
  • 每天学习一个新注解——@SafeVarargs
  • valgrind交叉编译android版本
  • 公司网站开发设计题目来源怎么写佛山免费建站怎样