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

说到鸿蒙我们都会想到华为mate60:遥遥领先!我们一直领先!

我们这个小车也是采用的是鸿蒙操作系统,学习鸿蒙小车,让你遥遥领先于你的同学。

文章目录

前言

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


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

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

传统的裸机只有一个任务,处理不了多个事件,一次只能处理一个事件。

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

任务概念举例:

以日常生活为例,比如这个母亲要同时做两件事:

喂饭:这是一个任务

回信息:这是另一个任务

对比裸机和RTOS同时完成上面的任务:

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

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

二、任务的状态

任务分别有四个状态:

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

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

任务状态转换图:

任务状态切换说明:

就绪态→ 运行态

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

运行态→ 阻塞态

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

三、任务优先级

优先级指的是任务执行顺序的概念。

在鸿蒙操作系统中,任务有32个优先级(0~31)最高优先级为 0,最低优先级为 31。

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

厨房着火:

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

四、任务创建函数

创建任务函数原型:

c 复制代码
// 创建任务

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文件.

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

任务创建代码:

c 复制代码
//包含头文件,头文件中有需要使用到的函数
#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);//声明入口函数

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

c 复制代码
cp out/hispark_pegasus/wifiiot_hispark_pegasus/Hi3861_wifiiot_app_allinone.bin
/mnt/hgfs/HarmonyOS/镜像/

总结

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

相关推荐
勤奋的凯尔森同学4 小时前
webmin配置终端显示样式,模仿UbuntuDesktop终端
linux·运维·服务器·ubuntu·webmin
丁卯4045 小时前
Go语言中使用viper绑定结构体和yaml文件信息时,标签的使用
服务器·后端·golang
chengooooooo5 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
人间打气筒(Ada)6 小时前
MySQL主从架构
服务器·数据库·mysql
楼台的春风7 小时前
【MCU驱动开发概述】
c语言·驱动开发·单片机·嵌入式硬件·mcu·自动驾驶·嵌入式
落笔画忧愁e7 小时前
FastGPT快速将消息发送至飞书
服务器·数据库·飞书
小冷爱学习!7 小时前
华为动态路由-OSPF-完全末梢区域
服务器·网络·华为
2501_904447748 小时前
华为发力中端,上半年nova14下半年nova15,大力普及原生鸿蒙
华为·智能手机·django·scikit-learn·pygame
落幕8 小时前
C语言-进程
linux·运维·服务器
MarkHD8 小时前
第十八天 WebView深度优化指南
华为·harmonyos