Hi3861 OpenHarmony嵌入式应用入门--LiteOS Thread

目录

Thread API

主要接口说明

测试代码编写

代码分析


hi3861使用的实时系统主要是基于Huawei LiteOS-M,这是华为针对物联网领域推出的轻量级物联网操作系统内核。LiteOS-M是Huawei LiteOS的一个分支,专为IoT领域构建,主要面向没有MMU(内存管理单元)的处理器。它具备轻量级、低功耗、组件丰富、快速开发等关键能力,为开发者提供“一站式”完整软件平台。

技术特点:

轻量级:LiteOS-M内核小巧,适合在资源受限的设备上运行。

低功耗:针对IoT设备的特点,LiteOS-M优化了功耗管理,使设备在运行时更省电。

快速开发:提供丰富的组件和API,降低开发门槛,缩短开发周期。

LiteOS-M通过优化任务调度和中断处理,保证了系统的实时响应能力。

结合hi3861的硬件性能,LiteOS-M能够确保在IoT设备中快速响应各种事件和数据变化。

Thread API

API名称

说明

osThreadNew

创建一个线程并将其加入活跃线程组中

osThreadGetName

返回指定线程的名字

osThreadGetId

返回当前运行线程的线程ID

osThreadGetState

返回当前线程的状态

osThreadSetPriority

设置指定线程的优先级

osThreadGetPriority

获取当前线程的优先级

osThreadYield

将运行控制转交给下一个处于READY状态的线程

osThreadSuspend

挂起指定线程的运行

osThreadResume

恢复指定线程的运行

osThreadDetach

分离指定的线程(当线程终止运行时,线程存储可以被回收)

osThreadJoin

等待指定线程终止运行

osThreadExit

终止当前线程的运行

osThreadTerminate

终止指定线程的运行

osThreadGetStackSize

获取指定线程的栈空间大小

osThreadGetStackSpace

获取指定线程的未使用的栈空间大小

osThreadGetCount

获取活跃线程数

osThreadEnumerate

获取线程组中的活跃线程数

主要接口说明

osThreadId_t osThreadNew(osThreadFunc_t func, void *argument,const osThreadAttr_t *attr )

注意 :不能在中断服务调用该函数

参数:

名字

描述

func

线程函数.

argument

作为启动参数传递给线程函数的指针

attr

线程属性

osStatus_t osThreadTerminate (osThreadId_t thread_id)

名字

描述

thread_id

指定线程id,该id是由osThreadNew或者osThreadGetId获得

测试代码编写

修改D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\BUILD.gn文件

# Copyright (c) 2023 Beijing HuaQing YuanJian Education Technology Co., Ltd
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# 
#    http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License. import("//build/lite/config/component/lite_component.gni")lite_component("demo") {features = [#"base_00_helloworld:base_helloworld_example",#"base_01_led:base_led_example",#"base_02_loopkey:base_loopkey_example",#"base_03_irqkey:base_irqkey_example",#"base_04_adc:base_adc_example",#"base_05_pwm:base_pwm_example",#"base_06_ssd1306:base_ssd1306_example","kernel_01_task:kernel_task_example",]
}

创建D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\kernel_01_task文件夹

文件夹中创建D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\kernel_01_task\kernel_task_example.c文件D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\kernel_01_task\BUILD.gn文件

# Copyright (c) 2023 Beijing HuaQing YuanJian Education Technology Co., Ltd
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License. static_library("kernel_task_example") {sources = ["kernel_task_example.c",]include_dirs = ["//utils/native/lite/include","//kernel/liteos_m/kal/cmsis","//base/iot_hardware/peripheral/interfaces/kits","//vendor/hqyj/fs_hi3861/common/bsp/include"]
}
/** Copyright (C) 2023 HiHope Open Source Organization .* Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**     http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/#include <stdio.h>
#include <unistd.h>#include "ohos_init.h"
#include "cmsis_os2.h"#define THREAD_NUM (1000)
#define STACK_SIZE (1024)
#define DELAY_TICKS_20   (20)
#define DELAY_TICKS_100 (100)osThreadId_t newThread(char *name, osThreadFunc_t func, char *arg)
{osThreadAttr_t attr = {name, 0, NULL, 0, NULL, STACK_SIZE*2, osPriorityNormal, 0, 0};osThreadId_t tid = osThreadNew(func, (void *)arg, &attr);if (tid == NULL) {printf("[Thread Test] osThreadNew(%s) failed.\r\n", name);} else {printf("[Thread Test] osThreadNew(%s) success, thread id: %d.\r\n", name, tid);}return tid;
}void threadTest(char *arg)
{static int count = 0;printf("%s\r\n", arg);osThreadId_t tid = osThreadGetId();printf("[Thread Test] threadTest osThreadGetId, thread id:%p\r\n", tid);while (count < THREAD_NUM) {count++;printf("[Thread Test] threadTest, count: %d.\r\n", count);osDelay(DELAY_TICKS_20);}
}void rtosv2_thread_main(void)
{osThreadId_t tid = newThread("test_thread", threadTest, "This is a test thread.");const char *t_name = osThreadGetName(tid);printf("[Thread Test] osThreadGetName, thread name: %s.\r\n", t_name);osThreadState_t state = osThreadGetState(tid);printf("[Thread Test] osThreadGetState, state :%d.\r\n", state);osStatus_t status = osThreadSetPriority(tid, osPriorityNormal4);printf("[Thread Test] osThreadSetPriority, status: %d.\r\n", status);osPriority_t pri = osThreadGetPriority(tid);printf("[Thread Test] osThreadGetPriority, priority: %d.\r\n", pri);status = osThreadSuspend(tid);printf("[Thread Test] osThreadSuspend, status: %d.\r\n", status);status = osThreadResume(tid);printf("[Thread Test] osThreadResume, status: %d.\r\n", status);uint32_t stacksize = osThreadGetStackSize(tid);printf("[Thread Test] osThreadGetStackSize, stacksize: %u.\r\n", stacksize);uint32_t stackspace = osThreadGetStackSpace(tid);printf("[Thread Test] osThreadGetStackSpace, stackspace: %u.\r\n", stackspace);uint32_t t_count = osThreadGetCount();printf("[Thread Test] osThreadGetCount, count: %u.\r\n", t_count);osDelay(DELAY_TICKS_100);status = osThreadTerminate(tid);printf("[Thread Test] osThreadTerminate, status: %d.\r\n", status);
}static void ThreadTestTask(void)
{osThreadAttr_t attr;attr.name = "rtosv2_thread_main";attr.attr_bits = 0U;attr.cb_mem = NULL;attr.cb_size = 0U;attr.stack_mem = NULL;attr.stack_size = STACK_SIZE;attr.priority = osPriorityNormal;if (osThreadNew((osThreadFunc_t)rtosv2_thread_main, NULL, &attr) == NULL) {printf("[ThreadTestTask] Falied to create rtosv2_thread_main!\n");}
}
APP_FEATURE_INIT(ThreadTestTask);

代码分析

创建线程,创建成功则打印线程名字和线程ID

osThreadId_t newThread(char *name, osThreadFunc_t func, char *arg)
{// 定义线程属性结构体osThreadAttr_t attr = {name, 0, NULL, 0, NULL, STACK_SIZE*2, osPriorityNormal, 0, 0};// 创建线程,并传入参数osThreadId_t tid = osThreadNew(func, (void *)arg, &attr);if (tid == NULL) {// 如果创建失败,输出提示信息printf("[Thread Test] osThreadNew(%s) failed.\r\n", name);} else {// 如果创建成功,输出提示信息printf("[Thread Test] osThreadNew(%s) success, thread id: %d.\r\n", name, tid);}return tid;
}

该函数首先会打印自己的参数,然后对全局变量count进行循环+1操作,之后会打印count的值

void threadTest(char *arg)
{// 定义静态变量count,用于记录线程执行次数static int count = 0;// 打印传入参数printf("%s\r\n", arg);// 获取当前线程IDosThreadId_t tid = osThreadGetId();// 打印当前线程IDprintf("[Thread Test] threadTest osThreadGetId, thread id:%p\r\n", tid);// 当count小于THREAD_NUM时,循环执行while (count < THREAD_NUM) {// count加1count++;// 打印count值printf("[Thread Test] threadTest, count: %d.\r\n", count);// 延时20个节拍osDelay(DELAY_TICKS_20);}
}

主程序rtosv2_thread_main创建线程并运行,并使用上述API进行相关操作,最后终止所创建的线程。

void rtosv2_thread_main(void)
{// 创建一个新的线程osThreadId_t tid = newThread("test_thread", threadTest, "This is a test thread.");// 获取线程名称const char *t_name = osThreadGetName(tid);printf("[Thread Test] osThreadGetName, thread name: %s.\r\n", t_name);// 获取线程状态osThreadState_t state = osThreadGetState(tid);printf("[Thread Test] osThreadGetState, state :%d.\r\n", state);// 设置线程优先级osStatus_t status = osThreadSetPriority(tid, osPriorityNormal4);printf("[Thread Test] osThreadSetPriority, status: %d.\r\n", status);// 获取线程优先级osPriority_t pri = osThreadGetPriority(tid);printf("[Thread Test] osThreadGetPriority, priority: %d.\r\n", pri);// 暂停线程status = osThreadSuspend(tid);printf("[Thread Test] osThreadSuspend, status: %d.\r\n", status);// 恢复线程status = osThreadResume(tid);printf("[Thread Test] osThreadResume, status: %d.\r\n", status);// 获取线程栈大小uint32_t stacksize = osThreadGetStackSize(tid);printf("[Thread Test] osThreadGetStackSize, stacksize: %u.\r\n", stacksize);// 获取线程栈空间uint32_t stackspace = osThreadGetStackSpace(tid);printf("[Thread Test] osThreadGetStackSpace, stackspace: %u.\r\n", stackspace);// 获取活跃线程数uint32_t t_count = osThreadGetCount();printf("[Thread Test] osThreadGetCount, count: %u.\r\n", t_count);// 延时100个时钟周期osDelay(DELAY_TICKS_100);// 终止线程status = osThreadTerminate(tid);printf("[Thread Test] osThreadTerminate, status: %d.\r\n", status);
}

使用build,编译成功后,使用upload进行烧录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/31388.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sqlmap使用以及GUI安装

下载 GUI版地址: GitHub - honmashironeko/sqlmap-gui: 基于官版本 SQLMAP 进行人工汉化&#xff0c;并提供GUI界面及多个自动化脚本 GUI使用 可以点击.bat启动 如果点击.bat启动不了就在这里打开cmd,输入对应的.bat来启动 linux安装 地址:sqlmap: automatic SQL injection…

记忆化搜索——AcWing 901. 滑雪

记忆化搜索 定义 记忆化搜索是一种结合了搜索和动态规划思想的方法。它通过将已经计算过的结果存储起来&#xff0c;在后续遇到相同情况时直接返回存储的结果&#xff0c;避免重复计算。 运用情况 当问题可以用递归方式求解&#xff0c;但存在大量重复计算时。一些复杂的组…

收藏||电商数据采集流程||电商数据采集API接口

商务数据分析的流程 第一步&#xff1a;明确分析目的。首先要明确分析目的&#xff0c;并把分析目的分解成若干个不同的分析要点&#xff0c;然后梳理分析思路&#xff0c;最后搭建分析框架。 第二步&#xff1a;数据采集。主流电商API接口数据采集&#xff0c;一般可以通过数…

顶顶通呼叫中心中间件-私有化asrproxy安装指南

一、安装asrproxy 上传asrproxy安装包到服务器目录&#xff1a;/root 上传完成之后依次执行下面的命令即可依次执行以下命令 cd ~mkdir -p /ddt/asrproxyunzip asrproxy_*.zip -d /ddt/asrproxycd /ddt/asrproxychmod x installlib.sh./installlib.shchmod x asrproxychmod x…

工控巨头去年业绩飙升10%,今年250亿出售子业务给美国黑石集团,意欲何为?...

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 更多的海量【智能制造】相关资料&#xff0c;请到智能制造online知识星球自行下载。 在工业自动化领域&#xff0c;艾默生一直以其卓越的技术和强…

CubeFS - 新一代云原生存储系统

CubeFS 是一种新一代云原生存储系统,支持 S3、HDFS 和 POSIX 等访问协议,支持多副本与纠删码两种存储引擎,为用户提供多租户、 多 AZ 部署以及跨区域复制等多种特性。 官方文档 CubeFS 作为一个云原生的分布式存储平台,提供了多种访问协议,因此其应用场景也非常广泛,下面…

驱动芯片退饱和保护(DESAT)

短路测试和双脉冲测试。 功率模块的短路承受能力的评估分为短路时间评估和短路能量评估两大类。短路时间由短路检测时间与短路关断时间共同构成 短路检测需要兼顾时效性与抗扰性能&#xff0c;要求系统能够及时响应&#xff0c;避免功率模块损坏。同时能够屏蔽开关过程的干扰…

车辆轨迹预测系列 (一):轨迹预测方法综述解析

文章目录 车辆轨迹预测系列 (一)&#xff1a;轨迹预测方法综述解析1、Contextual FactorsPhysics-related factors (物理相关因素):Road-related factors (道路相关因素):Interaction-related factors (交互相关因素): 2、Output TypesUnimodal Trajectory Prediction(单一模式…

AI音乐大模型:是创意的助力还是产业的挑战?

近期音乐界迎来了一场前所未有的革命。随着多家科技公司纷纷推出音乐大模型&#xff0c;素人生产音乐的门槛被前所未有地拉低&#xff0c;一个崭新的“全民音乐时代”似乎已近在眼前。然而&#xff0c;在这场技术革新的浪潮中&#xff0c;关于AI产品版权归属、创意产业如何在AI…

Python Web实战:Python+Django+MySQL实现基于Web版的增删改查

项目实战 1.创建项目(sms) File->New Project->Django 稍等片刻&#xff0c;项目的目录结构如下图 项目创建后确认是否已安装Django和mysqlclient解释器&#xff0c;如何确认&#xff1f;file->Settings 如果没有请在Terminal终端输入以下命令完成安装 pip instal…

C++初学者指南第一步---5.介绍std::vector

C初学者指南第一步—5.介绍std::vector 目录 C初学者指南第一步---5.介绍std::vector1.初始化/访问2.添加元素3.Resizing调整大小4.在尾部删除元素5. 复制一直是深拷贝&#xff01; 注意std代表C标准库的命名空间&#xff0c;vector&#xff08;向量&#xff09;是标准库中的一…

18V-180V降5V500mA恒压WT5118

18V-180V降5V500mA恒压WT5118 如何实现18V-180V宽电压输入下的恒压5V 500mA输出。输入电压是波动的18V还是高达180V,WT5118都能确保输出端提供稳定的5V电压和500mA的电流。 WT5118 是一款集成了 180V 高电压 MOSFET 的 DC-DC 控制器&#xff0c;专为开关电源设计。该设备具备内…

国产化ETL产品必备的特性(非开源包装)

ETL负责将分布的、异构数据源中的数据如关系数据、平面数据文件等抽取到临时中间层后进行抽取、清洗&#xff08;净化&#xff09;、转换、装载、标准、集成&#xff08;汇总&#xff09;...... 最后加载到数据仓库或数据集市中&#xff0c;成为联机分析处理、数据挖掘的基础。…

代码生成器技术乱弹五十三,人工智能和通用代码生成器的共同点:Token

代码生成器技术乱弹五十三&#xff0c;人工智能和通用代码生成器的共同点&#xff1a;Token 现在&#xff0c;随着人工智能的快速发展&#xff0c;特别是生成式人工智能的爆火&#xff0c;大家逐渐熟悉了一个概念&#xff0c;Token。我称之为字牌。在生成式人工智能的语境下&a…

OpenAI 联合创始人 Ilya Sutskever 的新初创公司致力于“安全超级智能”

OpenAI 前首席科学家伊利亚-苏茨克沃尔&#xff08;Ilya Sutskever&#xff09;在今年 5 月离开了他共同创立的人工智能研究公司后&#xff0c;透露了他的下一个重要项目。 相关阅读&#xff1a;GPT-4o通过整合文本、音频和视觉实现人性化的AI交互&#xff0c;OpenAI推出了其新…

大电流与小电流在检测原理上有区别吗

1 常用电流检测原理 1.1 分流器原理 被测量的电流在输入端电阻上Rshunt形成电压正比于测量电流&#xff0c;通过同相比例电路进行放大输出。 缺点&#xff1a; 输入电流减小时&#xff0c;需要更大的Rshunt&#xff1b;输入电阻Rshunt串入检测回路内将引起被测电流减小&a…

山西青年杂志山西青年杂志社山西青年编辑部2024年第10期目录

本刊专稿 共融共创、校企共建BIM创新创业中心的探索与实践 黄强;马福贵;贾晓敏;苏艳贞;魏艳卿; 1-3 财务管理课程专创融合教学改革与实践 宋衍程; 4-7 数字化赋能国际贸易实务课程建设研究 吴珍彩; 8-11《山西青年》投稿&#xff1a;cn7kantougao163.com 青年教育研…

GD32F303 低功耗模式要点

我们都知道&#xff0c;MCU有低功耗模式&#xff0c;比如GD32F303芯片&#xff0c;就有Sleep、Deepsleep和Standby三种模式。关于这三种模式的具体使用方法&#xff0c;小伙伴们可以参考《GD32F30x系列用户手册》。 今天我们来聊下几个低功耗模式要点。 1、进入低功耗模式后I…

perfect-scrollbar缩小浏览器窗口滚动条无线滚动的bug

https://github.com/mdbootstrap/perfect-scrollbar/issues/153

Sa-token基本使用教程(全网最详细!!!)

1.概述 1.1 Sa-Token介绍 功能简单示例 1.2 Sa-Token 功能一览 2. 使用 2.1 导入依赖 2.2 springBoot的简单集成 2.2.1 配置文件 2.2.2 controller 2.2.3 简单登录页面 2.3 功能详解 2.3.1 登录认证 2.3.1.1 登录与注销 NotLoginException 登录分析 先校验账号和…