鸿蒙嵌入式 LiteOS 任务管理【1】
第二章:鸿蒙嵌入式 LiteOS 任务管理本章节开始用Hi3861鸿蒙开发板举行实验
前言
在本章中,我们将深入探讨鸿蒙嵌入式 LiteOS 中的任务管理机制。通过示例代码,我们将相识怎样创建、管理和调度任务,以实现多任务处置处罚。关于LiteOS的介绍在前一章有讲解,可以往前看FreeRTOS 与 LiteOS 的区别
任务调度关系图
https://i-blog.csdnimg.cn/direct/b03a552b21e74e17a823a123a63ed854.png
任务状态转换的关系
https://i-blog.csdnimg.cn/direct/00e053aaf1c74533b1419be78210a28d.png
任务优先级调度表现图
本章代码的运行流程图
https://i-blog.csdnimg.cn/direct/552e3bddadf3454eb6f12fad49024163.png
任务管理流程
1. 干系头文件介绍
在使用 LiteOS 举行任务管理时,首先必要包罗一些必要的头文件:
#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
[*]<stdio.h>: 提供尺度输入输出功能。
[*]<unistd.h>: 提供 POSIX 尺度库的功能,如 sleep 函数。
[*]“ohos_init.h”: 鸿蒙利用系统的初始化头文件。
[*]“cmsis_os2.h”: CMSIS-RTOS API 的头文件,提供实时利用系统的接口。
2. 任务 ID 定义
在 LiteOS 中,每个任务都有一个唯一的标识符。我们可以通过以下方式定义任务 ID:
osThreadId_t Task1_ID; // 任务1 ID
osThreadId_t Task2_ID; // 任务2 ID
3. 常量定义
为了方便管理任务的栈大小和延时,我们定义了一些常量:
#define TASK_STACK_SIZE 1024
#define TASK1_DELAY_TIME 1 // s
#define TASK2_DELAY_TIME 5 // s
4. 任务函数实现
接下来,我们定义两个任务函数 Task1 和 Task2。
4.1 任务1
任务 1 的实现如下:
void Task1(void)
{
while (1)
{
printf("Task 1 小麦好帅\r\n");
sleep(TASK1_DELAY_TIME);
}
}
该任务会循环输出 “Task 1 小麦好帅”,并在每次循环后延时 1 秒
4.2 任务2
void Task2(void)
{
while (1) {
printf("Task 2, 开始挂起任务1\r\n");
osThreadSuspend(Task1_ID); // 挂起任务1
sleep(TASK2_DELAY_TIME); // 延时5秒钟
printf("Task 2, 开始恢复任务1\r\n");
osThreadResume(Task1_ID); // 恢复任务1
sleep(TASK2_DELAY_TIME); // 延时5秒钟
}
}
任务 2 会循环挂起和规复任务 1,并在每次利用后延时 5 秒。
5. 任务属性配置
在创建任务之前,我们必要配置任务的属性。以下是任务属性的定义:
osThreadAttr_t options;
options.name = "Task1"; // 任务的名字
options.attr_bits = 0; // 属性位
options.cb_mem = NULL; // 堆空间地址
options.cb_size = 0; // 堆空间大小
options.stack_mem = NULL; // 栈空间地址
options.stack_size = TASK_STACK_SIZE;// 栈空间大小 单位:字节
options.priority = osPriorityNormal;// 任务的优先级
6. 任务创建
使用 osThreadNew 函数创建任务:
Task1_ID = osThreadNew((osThreadFunc_t)Task1, NULL, &options); // 创建任务1
if (Task1_ID != NULL) {
printf("ID = %d, Create Task1_ID is OK!\n", Task1_ID);
}
同样的方式用于创建任务 2
7. 实验步调
更改BUILD.gn
https://i-blog.csdnimg.cn/direct/e7ccc86bfd944034860380bbaefd2e57.png
把本章节要编译的文件注释
build项目:
https://i-blog.csdnimg.cn/direct/b73b7acf2e1d4342a90fe9f273e9611b.png#pic_center
选择烧录文件:
https://i-blog.csdnimg.cn/direct/09486edb620441e6a9fe1516b46112ac.png#pic_center
8. 实验结果
https://i-blog.csdnimg.cn/direct/bc721cb918924266a136afaf3724bccb.png#pic_center
任务 2 会循环挂起和规复任务 1,并在每次利用后延时 5 秒。
9.全部代码
#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
osThreadId_t Task1_ID; //任务1 IDosThreadId_t Task2_ID; //任务2 ID#define TASK_STACK_SIZE 1024
#define TASK1_DELAY_TIME 1 // s
#define TASK2_DELAY_TIME 5 // s
void Task1(void)
{
while (1)
{
printf("Task 1 小麦好帅\r\n");
sleep(TASK1_DELAY_TIME);
}
}
void Task2(void){ uint8_t num = 0; while (1) { printf("Task 2, 开始挂起任务1\r\n"); osThreadSuspend(Task1_ID); // 挂起任务1 sleep(TASK2_DELAY_TIME); // 延时5秒钟 printf("Task 2, 开始规复任务1\r\n"); osThreadResume(Task1_ID); // 规复任务1 sleep(TASK2_DELAY_TIME); // 延时5秒钟 }}static void template_demo(void){ printf("LiteOS任务管理\r\n"); osThreadAttr_t options; options.name = "Task1"; // 任务的名字 options.attr_bits = 0; // 属性位 options.cb_mem = NULL; // 堆空间地址 options.cb_size = 0; // 堆空间大小 options.stack_mem = NULL; // 栈空间地址 options.stack_size = TASK_STACK_SIZE;// 栈空间大小 单位:字节 options.priority = osPriorityNormal;// 任务的优先级 Task1_ID = osThreadNew((osThreadFunc_t)Task1, NULL, &options); // 创建任务1 if (Task1_ID != NULL) { printf("ID = %d, Create Task1_ID is OK!\n", Task1_ID); } options.name = "Task2"; options.priority = osPriorityNormal1; Task2_ID = osThreadNew((osThreadFunc_t)Task2, NULL, &options); // 创建任务2 if (Task2_ID != NULL) { printf("ID = %d, Create Task2_ID is OK!\n", Task2_ID); }}SYS_RUN(template_demo); 总结
本章介绍了鸿蒙嵌入式 LiteOS 中的任务管理机制,包括任务的创建、挂起、规复和属性配置等。通过这些知识点,读者可以明白 LiteOS 中的任务调度机制,并能够有用地使用这些 API 来实现多任务处置处罚,本章节参考了普中的鸿蒙教程!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]