说到鸿蒙我们都会想到华为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/镜像/
总结
下一篇文章继续为大家介绍 鸿蒙小车的内核实验 ----- 软件定时器实验。