基础

嵌入式操作系统介绍

嵌入式操作系统专为资源受限的设备设计,具有紧凑、有效、可剪裁和可移植的特点。常见的嵌入式操作系统包括FreeRTOS、μC/OS-II等,它们通常用于实时应用。随着物联网的发展,如RT-Thread、AliOS Things、Zephyr、LiteOS等新型系统应运而生。

LiteOS起源与发展

华为于2015年推出LiteOS,旨在服务于物联网领域。其内核体积小于10KB,支持快速启动,适用于MCU设备。LiteOS提供了丰富的中间件与组件支持,如多种轻量级物联网协议栈,并且支持各种无线通信技术。自开源以来,LiteOS逐步发展成开放平台,广泛应用于智能家居、车联网等领域。到2020年,LiteOS发布V5.0版本,引入模块化设计和支持AI功能。至2022年,LiteOS演变为LiteOS-m和LiteOS-a两种形态,并融入OpenHarmony生态体系。

星闪系列芯片与LiteOS集成架构

在海思星闪系列芯片中,通过标准化的操作系统抽象层(OSAL)实现了与LiteOS的高效集成。这种设计使得上层协议栈和应用能够通过统一接口访问系统服务,提升了软件的复用性和可移植性,便于未来适配不同的RTOS平台,如 FreeRTOS、RT-Thread。
在这里插入图片描述

任务

任务的基本概念

在LiteOS中,任务是程序执行的基本单元,拥有独立的运行上下文、栈空间和优先级。系统为每个任务分配栈空间保存状态信息,实现多任务并发执行的效果。
LiteOS采用抢占式调度机制,确保高优先级任务能够及时响应,支持32个优先级级别(0为最高)。对于相同优先级的任务,使用时间片轮转调度。

任务相关概念

  • 任务控制块(TCB):管理任务的数据结构,包含任务上下文、状态、优先级等信息。
  • 任务栈:每个任务的独立栈空间,用于存储局部变量和调用信息。需合理设置大小以避免溢出或浪费资源。
  • 任务状态:包括就绪态、运行态、阻塞态和退出态,由内核调度器统一管理。
    在这里插入图片描述

使用案例

环境配置

参考资料:【星闪LiteOS开发】入门第一课:WSL子系统开发环境搭建篇

使用开发板

参考Hispark代码仓推荐的开发板,任意一款即可

参考代码

#include "securec.h"    
#include "osal_task.h"  
#include "osal_debug.h" 
#include "app_init.h"   
#include "soc_osal.h" 
#include "stdint.h"
#include "tcxo.h"

// 定义测试线程使用的栈大小(单位:字节)
#define TEST_THREAD_STACK_SIZE 0x1000

// 定义两个线程的优先级
// 注意:数值越小优先级越高(具体行为取决于底层系统实现)
#define TEST_THREAD_PRIO_HI 24  // 高优先级线程
#define TEST_THREAD_PRIO_LOW 25 // 低优先级线程


osal_task *task_handle_high = NULL;  // 低优先级线程句柄
osal_task *task_handle_low = NULL; // 高优先级线程句柄


// 高优先级线程入口函数
static void *test_thread_high(void)
{
    osal_printk("test_thread_high start!\r\n"); // 打印启动信息
    osal_msleep(2000);
    osal_printk("test_thread_high going to suspend!\r\n"); // 打印线程挂起信息
    osal_kthread_suspend(task_handle_high);
    osal_printk("test_thread_high resume!\r\n"); // 打印线程挂起信息

    return NULL; // 返回 NULL 表示线程正常结束
}

// 低优先级线程入口函数
static void *test_thread_low(void)
{
    osal_printk("test_thread_low start!\r\n"); // 打印启动信息
    osal_msleep(2000);
    osal_kthread_resume(task_handle_high);
    osal_printk("test_thread_low resume test_thread_high!\r\n"); // 打印线程恢复信息

    return NULL;
}

// 任务入口函数,程序执行起点
void TaskEntry(void)
{ 
    osal_kthread_lock(); // 锁定任务调度,防止在创建线程时发生上下文切换
    // 创建低优先级线程
    task_handle_low = osal_kthread_create((osal_kthread_handler)test_thread_low, 0, "test_thread_low",
                                      TEST_THREAD_STACK_SIZE);
    if (task_handle_low != NULL)
    {
        osal_kthread_set_priority(task_handle_low, TEST_THREAD_PRIO_LOW); // 设置为低优先级
        osal_printk("test_thread_low create success!\r\n");
    }
    // 创建高优先级线程
    task_handle_high = osal_kthread_create((osal_kthread_handler)test_thread_high, 0, "test_thread_high",
                                       TEST_THREAD_STACK_SIZE);
    if (task_handle_high != NULL)
    {
        osal_kthread_set_priority(task_handle_high, TEST_THREAD_PRIO_HI); // 设置为高优先级
        osal_printk("test_thread_high create success!\r\n");
    }

    osal_kthread_unlock(); // 解锁任务调度,允许线程切换
}

// 注册 TaskEntry 为应用启动任务
app_run(TaskEntry);

打印信息

由下文的串口打印信息可以看出,整个执行流程如下:

  1. 两个任务被创建并开始运行
  2. 高优先级任务先打印启动信息,等待2秒后将自己挂起
  3. 低优先级任务打印启动信息,等待2秒后恢复高优先级任务
  4. 高优先级任务恢复执行并打印恢复信息
  5. 低优先级任务打印它已恢复高优先级任务的信息
test_thread_low create success!
test_thread_high create success!
test_thread_high start!
test_thread_low start!
test_thread_high going to suspend!
test_thread_high resume!
test_thread_low resume test_thread_high!
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐