【星闪基础开发】LiteOS基础与任务
基础
嵌入式操作系统介绍
嵌入式操作系统专为资源受限的设备设计,具有紧凑、有效、可剪裁和可移植的特点。常见的嵌入式操作系统包括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);
打印信息
由下文的串口打印信息可以看出,整个执行流程如下:
- 两个任务被创建并开始运行
- 高优先级任务先打印启动信息,等待2秒后将自己挂起
- 低优先级任务打印启动信息,等待2秒后恢复高优先级任务
- 高优先级任务恢复执行并打印恢复信息
- 低优先级任务打印它已恢复高优先级任务的信息
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!
更多推荐

所有评论(0)