前言
移植好内核后,开始实战内核。
链接
参考
- 野火
- 上面链接
笔录草稿
基本概念
- 任务是竞争系统资源的最小运行单元。任务可以使用或等待CPU、使用内存空间等系统资源,并独立于其它任务运行
- 任务与线程
- 在 LiteOS 中,一个任务可以表示一条线程。
- Huawei LiteOS的任务一共有 32 个优先级(0-31),最高优先级为0,最低优先级为31。
任务相关概念
-
任务状态
- 就绪 (Ready)
- 运行(Running)
- 运行(Running)
- 退出态(Dead)
-
任务ID
- 可通过 任务ID 获取 任务句柄
***任务句柄*** = (((LOS_TASK_CB *)g_pstTaskCBArray) + (TaskID))
- 可通过 任务ID 获取 任务句柄
-
任务控制块TCB
- TCB 包含了任务上下文栈指针(stack pointer)、任务状态、任务优先级、任务ID、任务名、任务栈大小等信息。TCB 可以反映出每个任务运行情况。(TCB 其实就是一个袜子)
-
任务栈
- 每一个任务都拥有一个独立的栈空间,称为任务栈。
-
任务上下文切换 (个人把上下文分开理解)
- ** Huawei LiteOS** 在任务由运行态转为其它状态时会将本任务的上文信息,保存在自己的任务栈里面,也称压栈或入栈;
- 当任务切换到运行态时,把保存到任务栈中的上文信息加载到CPU寄存器中,即可恢复该任务的运行,称为出栈。新的任务信息也就是下文。
- 以上流程就是 上文压栈 --> 下文出栈。
LiteOS 任务运作机制
- Huawei LiteOS 任务管理模块提供
- 任务创建
- 任务删除
- 任务延时
- 任务挂起
- 任务恢复
- 更改任务优先级
- 锁定任务调度
- 解锁任务调度
- 根据任务控制块查询任务ID
- 根据ID查询任务查询任务控制块信息功能。
- 任务创建时,如果 OS 的系统可用空间少于任务,则创建失败,反之亦然。
- 用户创建任务时,系统会将任务栈进行初始化,预置上下文。
- 任务入口函数 也放到了相应的位置,在任务第一次执行时便可执行 任务入口函数。
内核初始化
-
一般的 RTOS 启动流程:MCU进入 main 函数 --> 创建任务 --> 启动 RTOS。
- 当然,在启动的过程中可以插入一些操作,如板级初始化
bspInit();
等等
- 当然,在启动的过程中可以插入一些操作,如板级初始化
-
而 Huawei LiteOS 的启动流程则要多一步:MCU进入 main 函数 --> LiteOS内核初始化 --> 创建任务 --> 启动 RTOS。
- 在操作 LiteOS 必须先初始化其内核。
- 函数
LOS_KernelInit();
(带返回值)。
-
内核初始化主要工作
- 配置任务数量上限
- 内存起始地址
- 初始化动态内存池(如果内存溢出,则内核初始化失败)
- 接管中断处理(非接管中断跳过)
- 任务初始化
- 先创建一个空闲任务
- 任务监视初始化
- CPU利用率初始化
- IPC通信初始化:信号量、互斥量、消息队列等等。
- 软件定时器初始化
- 该函数内会创建一个队列 和 一个定时任务
- 后续会在软件定时器相关篇章分析源码
- 该函数内会创建一个队列 和 一个定时任务
创建任务
创建任务有两种方案
- 方案一:
- 先创建所有任务
- 再启动调度
- 方案二:
- 先创建一个创建任务
- 然后启动调度
- 在创建任务里面创建所有任务
- 然后删除创建任务
本章实操的是方案二。
任务相关函数
接口名 | 描述 |
---|---|
LOS_TaskCreateOnly | 创建任务,并使该任务进入suspend状态,并不调度 |
LOS_TaskCreate | 创建任务,并使该任务进入ready状态,并调度 |
LOS_TaskDelete | 删除指定的任务 |
LOS_TaskResume | 恢复挂起的任务 |
LOS_TaskSuspend | 挂起指定的任务 |
LOS_TaskDelay | 任务延时等待 |
LOS_TaskYield | 显式放权,调整指定优先级的任务调度顺序 |
LOS_TaskLock | 锁任务调度 |
LOS_TaskUnlock | 解锁任务调度 |
LOS_CurTaskPriSet | 设置当前任务的优先级 |
LOS_TaskPriSet | 设置指定任务的优先级 |
LOS_TaskPriGet | 获取指定任务的优先级 |
LOS_CurTaskIDGet | 获取当前任务的ID |
LOS_TaskInfoGet | 获取指定任务的信息 |
LOS_TaskStatusGet | 获取指定任务的状态 |
LOS_TaskNameGet | 获取指定任务的名称 |
LOS_TaskInfoMonitor | 监控所有任务,获取所有任务的信息 |
LOS_NextTaskIDGet | 获取即将被调度的任务的ID |
各函数使用可以看源码或者例程
任务开发流程
- 配置任务块
- 锁任务(