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

2024-03-31 1607阅读

温馨提示:这篇文章已超过369天没有更新,请注意相关的内容是否还可用!

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

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

文章目录

  • 前言
  • 一、什么是任务?为什么要有任务
  • 二、任务的状态
  • 三、任务优先级
  • 四、任务创建函数
  • 五、任务创建实验
  • 总结

    前言

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


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

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

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

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

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

    任务概念举例:

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

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

    喂饭:这是一个任务

    回信息:这是另一个任务

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

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

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

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

    二、任务的状态

    任务分别有四个状态:

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

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

      任务状态转换图:

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

      任务状态切换说明:

      就绪态→ 运行态

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

      运行态→ 阻塞态

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

      三、任务优先级

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

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

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

      厨房着火:

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

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

      四、任务创建函数

      创建任务函数原型:

      // 创建任务
      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 
      #include 
      #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/镜像/
      

      总结

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

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]