首页 > 其他分享 >鸿蒙小车之多任务调度实验

鸿蒙小车之多任务调度实验

时间:2023-12-23 22:35:14浏览次数:34  
标签:优先级 attr 鸿蒙 小车 void 任务 任务调度 ID

说到鸿蒙我们都会想到华为mate60:遥遥领先!我们一直领先! 我们这个小车也是采用的是鸿蒙操作系统,学习鸿蒙小车,让你遥遥领先于你的同学。

@TOC

前言

本专栏将依次介绍鸿蒙小车的内核实验,硬件实验,wifi 实验。


鸿蒙小车之多任务调度实验_#include

一、什么是任务?为什么要有任务

任务 是操作系统(RTOS)中的基本组成单元,它们为嵌入式系统提供了并发处理、实时性、模块化和资源管理等重要功能。通过任务,操作系统(RTOS)可以更好地管理系统资源和满足各种应用程序需求。

传统的裸机只有一个任务,处理不了多个事件,一次只能处理一个事件。 而操作系统(RTOS)可以支持多任务管理,可以处理多个事件提高了资源的利用率和性能。

任务概念举例:

鸿蒙小车之多任务调度实验_优先级_02

以日常生活为例,比如这个母亲要同时做两件事: 喂饭:这是一个任务 回信息:这是另一个任务对比裸机和RTOS同时完成上面的任务:

鸿蒙小车之多任务调度实验_spark_03

裸机只有在完成其中一个任务后才能够去完成下一个任务,这样就会导致整体性能下降。

RTOS可以在不同任务之间进行切换,这样可以提高系统的响应能力和实时性,使得多个任务可以并发执行。

二、任务的状态

任务分别有四个状态:

  • 就绪态(Ready):任务准备运行
  • 运行态(Running):该任务正在执行。
  • 阻塞态(Blocked):该任务不在就绪队列中。还有任务被挂起、任务被延时、任务正在等待信号量、读写队列或者等待读写事件等,都会处于阻塞状态。
  • 退出态(Dead):该任务运行结束,等待系统回收资源。

任务的状态之间可以进行转换,每一个任务在某一时刻都有属于自己的状态。

任务状态转换图:

鸿蒙小车之多任务调度实验_优先级_04

任务状态切换说明:

就绪态→ 运行态 任务创建时进入就绪态,当进行任务切换时,最高优先级的任务会从就绪态切换到运行态。

运行态→ 阻塞态 正在运行的任务被挂起,延时,信号量等影响时,由运行态变为阻塞态。

三、任务优先级

优先级指的是任务执行顺序的概念。在鸿蒙操作系统中,任务有32个优先级(0~31)最高优先级为 0,最低优先级为 31。

优先级越高的任务越先执行。优先级高的可以打断优先级低的执行。

厨房着火:

鸿蒙小车之多任务调度实验_优先级_05

当面对厨房着火和吃饭时,先去灭火再回来吃饭,因为厨房着火的事情更加紧急,需要尽快处理。

四、任务创建函数

创建任务函数原型:

// 创建任务

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

各个参数:

osThreadFunc_t func :这是一个指向任务函数的指针,表示要在任务中执行的代码。 void * argument :这是一个指向传递给任务函数的参数的指针。

const osThreadAttr_t * attr :这是一个指向任务属性的指针,用于配置任务的各种属性。任务属性可以包括任务的优先级、堆栈大小、堆栈指针、任务名字等。这些属性可以根据应用程序的需求进行配置。

osThreadNew 函数的返回值是一个标识新创建任务的ID,这个ID可以用于管理和控制任务。

五、任务创建实验

修改app下的BUILD.gn文件.

static_library("Task") {//定义一个名为Task的静态库
	sources = [
	"Task.c"//指定静态库中包含的源文件
	]
include_dirs = [
		"//utils/native/lite/include",
		"//domains/iot/link/libbuild"
	]
}

任务创建代码:

//包含头文件,头文件中有需要使用到的函数
#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"

osThreadId_t Task1_ID; // 任务1 ID
osThreadId_t Task2_ID; // 任务2 ID

//任务1
void Task1 (void *argument)
{
	while(1)
	{
		printf("Task1\n");
		sleep(1);//释放CPU,延时1s
	}
}

//任务2
void Task2 (void *argument)
{
	while(1)
	{
		printf("Task2\n");
		sleep(1);//释放CPU,延时1s
	}
}

static void entry(void)
{
	osThreadAttr_t attr;
	attr.name = "Task1"; // 任务的名字
	
	attr.stack_size = 1024; // 栈空间大小 单位:字节
	attr.priority = osPriorityNormal; // 任务的优先级,数据越大,优先级越高
	Task1_ID = osThreadNew(Task1, NULL, &attr);
	attr.name = "Task2";// 任务的名字
	attr.priority = osPriorityNormal1; // 任务的优先级,数据越大,优先级越高
	Task2_ID = osThreadNew((osThreadFunc_t)Task2, NULL, &attr);
}

SYS_RUN(entry);//声明入口函数

将生成的镜像文件拷贝到共享文件夹当中:

cp out/hispark_pegasus/wifiiot_hispark_pegasus/Hi3861_wifiiot_app_allinone.bin
/mnt/hgfs/HarmonyOS/镜像/

总结

下一篇文章继续为大家介绍 鸿蒙小车的内核实验 ----- 软件定时器实验。

标签:优先级,attr,鸿蒙,小车,void,任务,任务调度,ID
From: https://blog.51cto.com/u_16159289/8946976

相关文章

  • 鸿蒙、ChatGPT 入选全球十大工程成就丨 RTE 开发者日报 Vol.111
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表......
  • 鸿蒙原生应用/元服务开发-Stage模型能力接口(九)上
    @ohos.app.ability.UIAbility(UIAbility)一、说明UIAbility是包含UI界面的应用组件,提供组件创建、销毁、前后台切换等生命周期回调,同时也具备组件协同的能力,组件协同主要提供如下常用功能。Caller,由startAbilityByCall接口返回,CallerAbility(调用者)可使用Caller与CalleeAbility(......
  • 极智一周 | AI 算力国产化、通义开源、Gemini、鸿蒙、蔚来 And so on
    欢迎关注我的公众号[极智视界],获取我的更多技术分享大家好,我是极智视界,带来本周的[极智一周],关键词:AI算力国产化、通义开源、Gemini、鸿蒙、蔚来Andsoon。极智视界本周热点文章回顾,(1)AI算力国产化系列本周续写解读国产AI算力系列,输出六章。璧仞芯片禁令焦点,摩尔线程显卡......
  • 使用 Taro 开发鸿蒙原生应用 —— 探秘适配鸿蒙 ArkTS 的工作原理
    背景在上一篇文章中,我们已经了解到华为即将发布的鸿蒙操作系统纯血版本——鸿蒙Next,以及各个互联网厂商开展鸿蒙应用开发的消息。其中,Taro作为一个重要的前端开发框架,也积极适配鸿蒙的新一代语言框架——ArkTS。本文将深入探讨Taro适配鸿蒙ArkTS框架的工作原理,接下来我们......
  • 鸿蒙开发之系统基础组件
    应用page的组成部分是组件组成的,系统提供了很多的组件Image/TextImage组件Image($r('app.media.logo')).width(78).height(509)使用string设置.width('78vp')//vpvm的像素单位使用定义资源json.width($r('app.float.logo_size'))在resources目录下......
  • 鸿蒙开发之容器组件
    容器组件类似于flex的布局,不过这里是固定Column是纵向Row是横向 当然,也提供了很多的flex相关的属性封装如何设置?第一种是Row(){Text($r(…))Text($r(…))}.justifyContent(FlexAlign.SpaceBetween)//在属性上设置.width('100%') 第二种是//......
  • 鸿蒙开发之初页面UIAbility
    UIAbility类似于一个整体的应用声明入口,比如小程序的app.js,比如安卓端的activity正常页面开发使用的是一个UIAbility即可,然后在一个UIAbility里面通过路由的形式进行跳转 关于路由导入importrouterfrom'@ohos.router'; 跳转router.pushUrl({url:'pag......
  • 鸿蒙开发之在mac上安装集成开发工具DevEco Studio
    在安装集成环境后,会拉取os的依赖文件(类似npm的包文件),安装完成后创建项目  目录结构:   我们所写的代码就在入口文件中编写具体文档:https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101682488597649338  ......
  • 鸿蒙开发之HTTP请求
    1. 申请网络权限在module.json文件中添加"module":{"reqPermissions":[{"name":"ohos.permission.INTERNET"}]} 2.发起//导入http模块importhttpfrom'@ohos.net.http';//创建http实例consthttpRequ......
  • STM32智能小车 0基础教学
    (文章目录)前言最近发现很多小伙伴都想自己制作一辆属于自己的智能小车,从今天开始我准备从选材料开始教大家如何制作一辆智能小车。一、必备器材选择及其作用1.主控制器STM32首先最重要的就是选择主控制器,因为我们需要通过STM32来控制各个模块协调工作。这里我们选择STM32RC......