第二章:鸿蒙嵌入式 LiteOS 任务管理
本章节开始用Hi3861鸿蒙开发板举行实验
前言
在本章中,我们将深入探讨鸿蒙嵌入式 LiteOS 中的任务管理机制。通过示例代码,我们将相识怎样创建、管理和调度任务,以实现多任务处置处罚。关于LiteOS的介绍在前一章有讲解,可以往前看FreeRTOS 与 LiteOS 的区别
任务调度关系图
任务状态转换的关系
任务优先级调度表现图
本章代码的运行流程图
任务管理流程
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
把本章节要编译的文件注释
build项目:
选择烧录文件:
8. 实验结果
任务 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企服之家,中国第一个企服评测及商务社交产业平台。 |