提交 52d0958c 编写于 作者: 鸿蒙内核源码分析's avatar 鸿蒙内核源码分析

http://weharmonyos.com/doxygen/index.html ,支持doxygen

    百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
    博客输出站点(国内):http://weharmonyos.com
    博客输出站点(国外):https://weharmony.github.io
    注解文件系统:https://gitee.com/weharmony/third_party_NuttX
    注解协议栈:https://gitee.com/weharmony/third_party_lwip
    注解编译子系统:https://gitee.com/weharmony/build_lite
上级 46e86676
...@@ -61,48 +61,51 @@ ...@@ -61,48 +61,51 @@
#ifdef LOSCFG_FS_VFS #ifdef LOSCFG_FS_VFS
#include "console.h" #include "console.h"
#endif #endif
/**@file los_swtmr.c /**
* @file los_exc.c
* @brief 软定时器主文件 * @brief 软定时器主文件
* @details * @details
* @attention 基本概念 \n * @attention @verbatim
异常接管是操作系统对运行期间发生的异常情况(芯片硬件异常)进行处理的一系列动作,\n\n 基本概念
例如打印异常发生时当前函数的调用栈信息、CPU现场信息、任务的堆栈情况等。\n 异常接管是操作系统对运行期间发生的异常情况(芯片硬件异常)进行处理的一系列动作,
例如打印异常发生时当前函数的调用栈信息、CPU现场信息、任务的堆栈情况等。
异常接管作为一种调测手段,可以在系统发生异常时给用户提供有用的异常信息,譬如异常类型、\n 异常接管作为一种调测手段,可以在系统发生异常时给用户提供有用的异常信息,譬如异常类型、
发生异常时的系统状态等,方便用户定位分析问题。\n 发生异常时的系统状态等,方便用户定位分析问题。
异常接管,在系统发生异常时的处理动作为:显示异常发生时正在运行的任务信息 \n 异常接管,在系统发生异常时的处理动作为:显示异常发生时正在运行的任务信息
(包括任务名、任务号、堆栈大小等),以及CPU现场等信息。 \n (包括任务名、任务号、堆栈大小等),以及CPU现场等信息。
运作机制 \n 运作机制
每个函数都有自己的栈空间,称为栈帧。调用函数时,会创建子函数的栈帧, \n 每个函数都有自己的栈空间,称为栈帧。调用函数时,会创建子函数的栈帧,
同时将函数入参、局部变量、寄存器入栈。栈帧从高地址向低地址生长。 \n 同时将函数入参、局部变量、寄存器入栈。栈帧从高地址向低地址生长。
以ARM32 CPU架构为例,每个栈帧中都会保存PC、LR、SP和FP寄存器的历史值。 \n 以ARM32 CPU架构为例,每个栈帧中都会保存PC、LR、SP和FP寄存器的历史值。
ARM处理器中的R13被用作SP \n ARM处理器中的R13被用作SP
堆栈分析 \n 堆栈分析
LR寄存器(Link Register),链接寄存器,指向函数的返回地址。 \n LR寄存器(Link Register),链接寄存器,指向函数的返回地址。
R11:可以用作通用寄存器,在开启特定编译选项时可以用作帧指针寄存器FP,用来实现栈回溯功能。 \n R11:可以用作通用寄存器,在开启特定编译选项时可以用作帧指针寄存器FP,用来实现栈回溯功能。
GNU编译器(gcc)默认将R11作为存储变量的通用寄存器,因而默认情况下无法使用FP的栈回溯功能。 \n GNU编译器(gcc)默认将R11作为存储变量的通用寄存器,因而默认情况下无法使用FP的栈回溯功能。
为支持调用栈解析功能,需要在编译参数中添加-fno-omit-frame-pointer选项,提示编译器将R11作为FP使用。 \n 为支持调用栈解析功能,需要在编译参数中添加-fno-omit-frame-pointer选项,提示编译器将R11作为FP使用。
FP寄存器(Frame Point),帧指针寄存器,指向当前函数的父函数的栈帧起始地址。利用该寄存器可以得到父函数的栈帧, \n FP寄存器(Frame Point),帧指针寄存器,指向当前函数的父函数的栈帧起始地址。利用该寄存器可以得到父函数的栈帧,
从栈帧中获取父函数的FP,就可以得到祖父函数的栈帧,以此类推,可以追溯程序调用栈,得到函数间的调用关系。 \n 从栈帧中获取父函数的FP,就可以得到祖父函数的栈帧,以此类推,可以追溯程序调用栈,得到函数间的调用关系。
当系统发生异常时,系统打印异常函数的栈帧中保存的寄存器内容,以及父函数、祖父函数的 \n 当系统发生异常时,系统打印异常函数的栈帧中保存的寄存器内容,以及父函数、祖父函数的
栈帧中的LR、FP寄存器内容,用户就可以据此追溯函数间的调用关系,定位异常原因。 \n 栈帧中的LR、FP寄存器内容,用户就可以据此追溯函数间的调用关系,定位异常原因。
异常接管对系统运行期间发生的芯片硬件异常进行处理,不同芯片的异常类型存在差异,具体异常类型可以查看芯片手册。 \n 异常接管对系统运行期间发生的芯片硬件异常进行处理,不同芯片的异常类型存在差异,具体异常类型可以查看芯片手册。
异常接管一般的定位步骤如下: \n 异常接管一般的定位步骤如下:
打开编译后生成的镜像反汇编(asm)文件。 \n 打开编译后生成的镜像反汇编(asm)文件。
搜索PC指针(指向当前正在执行的指令)在asm中的位置,找到发生异常的函数。 \n 搜索PC指针(指向当前正在执行的指令)在asm中的位置,找到发生异常的函数。
根据LR值查找异常函数的父函数。 \n 根据LR值查找异常函数的父函数。
重复步骤3,得到函数间的调用关系,找到异常原因。 \n 重复步骤3,得到函数间的调用关系,找到异常原因。
注意事项 \n 注意事项
要查看调用栈信息,必须添加编译选项宏-fno-omit-frame-pointer支持stack frame,否则编译时FP寄存器是关闭的。 \n 要查看调用栈信息,必须添加编译选项宏-fno-omit-frame-pointer支持stack frame,否则编译时FP寄存器是关闭的。
参考 \n 参考
http://weharmonyos.com/openharmony/zh-cn/device-dev/kernel/%E7%94%A8%E6%88%B7%E6%80%81%E5%BC%82%E5%B8%B8%E4%BF%A1%E6%81%AF%E8%AF%B4%E6%98%8E.html http://weharmonyos.com/openharmony/zh-cn/device-dev/kernel/%E7%94%A8%E6%88%B7%E6%80%81%E5%BC%82%E5%B8%B8%E4%BF%A1%E6%81%AF%E8%AF%B4%E6%98%8E.html
* @endverbatim
*/ */
#ifdef LOSCFG_BLACKBOX #ifdef LOSCFG_BLACKBOX
......
此差异已折叠。
...@@ -33,23 +33,25 @@ ...@@ -33,23 +33,25 @@
#include "los_printf.h" #include "los_printf.h"
#include "los_toolchain.h" //GCC 编译器的内置函数 #include "los_toolchain.h" //GCC 编译器的内置函数
/**
* @brief
* @verbatim
基本概念
位操作是指对二进制数的bit位进行操作。程序可以设置某一变量为状态字,状态字中的
每一bit位(标志位)可以具有自定义的含义。
/****************************************************************************** 使用场景
基本概念 系统提供标志位的置1和清0操作,可以改变标志位的内容,同时还提供获取状态字中标志位
位操作是指对二进制数的bit位进行操作。程序可以设置某一变量为状态字,状态字中的 为1的最高位和最低位的功能。用户也可以对系统的寄存器进行位操作。
每一bit位(标志位)可以具有自定义的含义。
使用场景 参考
系统提供标志位的置1和清0操作,可以改变标志位的内容,同时还提供获取状态字中标志位 https://www.geeksforgeeks.org/builtin-functions-gcc-compiler/
为1的最高位和最低位的功能。用户也可以对系统的寄存器进行位操作。 * @endverbatim
*/
参考
https://www.geeksforgeeks.org/builtin-functions-gcc-compiler/
******************************************************************************/
#define OS_BITMAP_MASK 0x1FU // #define OS_BITMAP_MASK 0x1FU //
#define OS_BITMAP_WORD_MASK ~0UL #define OS_BITMAP_WORD_MASK ~0UL
/* find first zero bit starting from LSB */ /*! find first zero bit starting from LSB */
STATIC INLINE UINT16 Ffz(UINTPTR x) STATIC INLINE UINT16 Ffz(UINTPTR x)
{//__builtin_ffsl: 返回右起第一个1的位置,函数来自 glibc {//__builtin_ffsl: 返回右起第一个1的位置,函数来自 glibc
return __builtin_ffsl(~x) - 1;//从LSB开始查找第一个零位 LSB(最低有效位) 对应 最高有效位(MSB) return __builtin_ffsl(~x) - 1;//从LSB开始查找第一个零位 LSB(最低有效位) 对应 最高有效位(MSB)
...@@ -72,12 +74,17 @@ VOID LOS_BitmapClr(UINT32 *bitmap, UINT16 pos) ...@@ -72,12 +74,17 @@ VOID LOS_BitmapClr(UINT32 *bitmap, UINT16 pos)
*bitmap &= ~(1U << (pos & OS_BITMAP_MASK));//在对应位上置0 *bitmap &= ~(1U << (pos & OS_BITMAP_MASK));//在对应位上置0
} }
/********************************************************
CLZ 用于计算操作数最高端0的个数,这条指令主要用于以下两个场合 /**
  1.计算操作数规范化(使其最高位为1)时需要左移的位数 * @brief 获取参数位图中最高位为1的索引位 例如: 00110110 返回 5
  2.确定一个优先级掩码中最高优先级 * @verbatim
********************************************************/ CLZ 用于计算操作数最高端0的个数,这条指令主要用于以下两个场合
//获取参数位图中最高位为1的索引位 例如: 00110110 返回 5   1.计算操作数规范化(使其最高位为1)时需要左移的位数
  2.确定一个优先级掩码中最高优先级
* @endverbatim
* @param bitmap
* @return UINT16
*/
UINT16 LOS_HighBitGet(UINT32 bitmap) UINT16 LOS_HighBitGet(UINT32 bitmap)
{ {
if (bitmap == 0) { if (bitmap == 0) {
......
...@@ -59,14 +59,15 @@ ...@@ -59,14 +59,15 @@
* @brief 进程模块主文件 * @brief 进程模块主文件
* @details 主要包括进程的创建 * @details 主要包括进程的创建
* @author openharmony * @author openharmony
**********************************************************************************
* @attention * @attention
* 并发(Concurrent):多个线程在单个核心运行,同一时间只能一个线程运行,内核不停切换线程, * @verbatim
* 看起来像同时运行,实际上是线程不停切换 并发(Concurrent):多个线程在单个核心运行,同一时间只能一个线程运行,内核不停切换线程,
* 并行(Parallel)每个线程分配给独立的CPU核心,线程同时运行 看起来像同时运行,实际上是线程不停切换
* 单核CPU多个进程或多个线程内能实现并发(微观上的串行,宏观上的并行) 并行(Parallel)每个线程分配给独立的CPU核心,线程同时运行
* 多核CPU线程间可以实现宏观和微观上的并行 单核CPU多个进程或多个线程内能实现并发(微观上的串行,宏观上的并行)
* LITE_OS_SEC_BSS 和 LITE_OS_SEC_DATA_INIT 是告诉编译器这些全局变量放在哪个数据段 多核CPU线程间可以实现宏观和微观上的并行
LITE_OS_SEC_BSS 和 LITE_OS_SEC_DATA_INIT 是告诉编译器这些全局变量放在哪个数据段
@endverbatim
* @par 注解日志: * @par 注解日志:
* <table> * <table>
* <tr><th>时间 <th>版本 <th>作者 <th>描述 * <tr><th>时间 <th>版本 <th>作者 <th>描述
......
...@@ -29,65 +29,68 @@ ...@@ -29,65 +29,68 @@
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
/**@file los_swtmr.c /*!
* @file los_swtmr.c
* @brief 软定时器主文件 * @brief 软定时器主文件
* @details * @details
* @attention 基本概念 \n * @attention @verbatim
软件定时器,是基于系统Tick时钟中断且由软件来模拟的定时器。当经过设定的Tick数后,会触发用户自定义的回调函数。\n 基本概念
硬件定时器受硬件的限制,数量上不足以满足用户的实际需求。因此为了满足用户需求,提供更多的定时器,\n 软件定时器,是基于系统Tick时钟中断且由软件来模拟的定时器。当经过设定的Tick数后,会触发用户自定义的回调函数。
软件定时器功能,支持如下特性:\n 硬件定时器受硬件的限制,数量上不足以满足用户的实际需求。因此为了满足用户需求,提供更多的定时器,
创建软件定时器。\n 软件定时器功能,支持如下特性:
启动软件定时器。\n 创建软件定时器。
停止软件定时器。\n 启动软件定时器。
删除软件定时器。\n 停止软件定时器。
获取软件定时器剩余Tick数。\n 删除软件定时器。
可配置支持的软件定时器个数。\n 获取软件定时器剩余Tick数。
可配置支持的软件定时器个数。
运作机制 \n 运作机制
软件定时器是系统资源,在模块初始化的时候已经分配了一块连续内存。\n 软件定时器是系统资源,在模块初始化的时候已经分配了一块连续内存。
软件定时器使用了系统的一个队列和一个任务资源,软件定时器的触发遵循队列规则,\n 软件定时器使用了系统的一个队列和一个任务资源,软件定时器的触发遵循队列规则,
先进先出。定时时间短的定时器总是比定时时间长的靠近队列头,满足优先触发的准则。\n 先进先出。定时时间短的定时器总是比定时时间长的靠近队列头,满足优先触发的准则。
软件定时器以Tick为基本计时单位,当创建并启动一个软件定时器时,Huawei LiteOS会根据 \n 软件定时器以Tick为基本计时单位,当创建并启动一个软件定时器时,Huawei LiteOS会根据
当前系统Tick时间及设置的定时时长确定该定时器的到期Tick时间,并将该定时器控制结构挂入计时全局链表。\n 当前系统Tick时间及设置的定时时长确定该定时器的到期Tick时间,并将该定时器控制结构挂入计时全局链表。
当Tick中断到来时,在Tick中断处理函数中扫描软件定时器的计时全局链表,检查是否有定时器超时,\n 当Tick中断到来时,在Tick中断处理函数中扫描软件定时器的计时全局链表,检查是否有定时器超时,
若有则将超时的定时器记录下来。Tick中断处理函数结束后,软件定时器任务(优先级为最高)\n 若有则将超时的定时器记录下来。Tick中断处理函数结束后,软件定时器任务(优先级为最高)
被唤醒,在该任务中调用已经记录下来的定时器的回调函数。\n 被唤醒,在该任务中调用已经记录下来的定时器的回调函数。
定时器状态 \n 定时器状态
OS_SWTMR_STATUS_UNUSED(定时器未使用)\n OS_SWTMR_STATUS_UNUSED(定时器未使用)
系统在定时器模块初始化时,会将系统中所有定时器资源初始化成该状态。\n 系统在定时器模块初始化时,会将系统中所有定时器资源初始化成该状态。
OS_SWTMR_STATUS_TICKING(定时器处于计数状态)\n OS_SWTMR_STATUS_TICKING(定时器处于计数状态)
在定时器创建后调用LOS_SwtmrStart接口启动,定时器将变成该状态,是定时器运行时的状态。\n 在定时器创建后调用LOS_SwtmrStart接口启动,定时器将变成该状态,是定时器运行时的状态。
OS_SWTMR_STATUS_CREATED(定时器创建后未启动,或已停止)\n OS_SWTMR_STATUS_CREATED(定时器创建后未启动,或已停止)
定时器创建后,不处于计数状态时,定时器将变成该状态。\n 定时器创建后,不处于计数状态时,定时器将变成该状态。
软件定时器提供了三类模式:\n 软件定时器提供了三类模式:
单次触发定时器,这类定时器在启动后只会触发一次定时器事件,然后定时器自动删除。\n 单次触发定时器,这类定时器在启动后只会触发一次定时器事件,然后定时器自动删除。
周期触发定时器,这类定时器会周期性的触发定时器事件,直到用户手动停止定时器,否则将永远持续执行下去。\n 周期触发定时器,这类定时器会周期性的触发定时器事件,直到用户手动停止定时器,否则将永远持续执行下去。
单次触发定时器,但这类定时器超时触发后不会自动删除,需要调用定时器删除接口删除定时器。\n 单次触发定时器,但这类定时器超时触发后不会自动删除,需要调用定时器删除接口删除定时器。
使用场景 \n 使用场景
创建一个单次触发的定时器,超时后执行用户自定义的回调函数。\n 创建一个单次触发的定时器,超时后执行用户自定义的回调函数。
创建一个周期性触发的定时器,超时后执行用户自定义的回调函数。\n 创建一个周期性触发的定时器,超时后执行用户自定义的回调函数。
软件定时器的典型开发流程 \n 软件定时器的典型开发流程
通过make menuconfig配置软件定时器 \n 通过make menuconfig配置软件定时器
创建定时器LOS_SwtmrCreate,设置定时器的定时时长、定时器模式、超时后的回调函数。\n 创建定时器LOS_SwtmrCreate,设置定时器的定时时长、定时器模式、超时后的回调函数。
启动定时器LOS_SwtmrStart。\n 启动定时器LOS_SwtmrStart。
获得软件定时器剩余Tick数LOS_SwtmrTimeGet。\n 获得软件定时器剩余Tick数LOS_SwtmrTimeGet。
停止定时器LOS_SwtmrStop。\n 停止定时器LOS_SwtmrStop。
删除定时器LOS_SwtmrDelete。\n 删除定时器LOS_SwtmrDelete。
注意事项 \n 注意事项
软件定时器的回调函数中不应执行过多操作,不建议使用可能引起任务挂起或者阻塞的接口或操作, \n 软件定时器的回调函数中不应执行过多操作,不建议使用可能引起任务挂起或者阻塞的接口或操作,
如果使用会导致软件定时器响应不及时,造成的影响无法确定。\n 如果使用会导致软件定时器响应不及时,造成的影响无法确定。
软件定时器使用了系统的一个队列和一个任务资源。软件定时器任务的优先级设定为0,且不允许修改 。\n 软件定时器使用了系统的一个队列和一个任务资源。软件定时器任务的优先级设定为0,且不允许修改 。
系统可配置的软件定时器个数是指:整个系统可使用的软件定时器总个数,并非用户可使用的软件定时器个数。\n 系统可配置的软件定时器个数是指:整个系统可使用的软件定时器总个数,并非用户可使用的软件定时器个数。
例如:系统多占用一个软件定时器,那么用户能使用的软件定时器资源就会减少一个。\n 例如:系统多占用一个软件定时器,那么用户能使用的软件定时器资源就会减少一个。
创建单次不自删除属性的定时器,用户需要自行调用定时器删除接口删除定时器,回收定时器资源,避免资源泄露。\n 创建单次不自删除属性的定时器,用户需要自行调用定时器删除接口删除定时器,回收定时器资源,避免资源泄露。
软件定时器的定时精度与系统Tick时钟的周期有关。\n 软件定时器的定时精度与系统Tick时钟的周期有关。
@endverbatim
*/ */
#include "los_swtmr_pri.h" #include "los_swtmr_pri.h"
......
...@@ -32,41 +32,43 @@ ...@@ -32,41 +32,43 @@
#include "los_sys_pri.h" #include "los_sys_pri.h"
#include "los_sched_pri.h" #include "los_sched_pri.h"
/**@file los_sys.c /*!
* @file los_sys.c
* @brief 系统时间转化 * @brief 系统时间转化
* @details * @details
* @attention * @attention @verbatim
基本概念 \n 基本概念
时间管理以系统时钟为基础,给应用程序提供所有和时间有关的服务。\n 时间管理以系统时钟为基础,给应用程序提供所有和时间有关的服务。
系统时钟是由定时器/计数器产生的输出脉冲触发中断产生的,一般定义为整数或长整数。\n 系统时钟是由定时器/计数器产生的输出脉冲触发中断产生的,一般定义为整数或长整数。
输出脉冲的周期叫做一个“时钟滴答”。系统时钟也称为时标或者Tick。\n 输出脉冲的周期叫做一个“时钟滴答”。系统时钟也称为时标或者Tick。
用户以秒、毫秒为单位计时,而操作系统以Tick为单位计时,当用户需要对系统进行操作时,\n 用户以秒、毫秒为单位计时,而操作系统以Tick为单位计时,当用户需要对系统进行操作时,
例如任务挂起、延时等,此时需要时间管理模块对Tick和秒/毫秒进行转换。\n 例如任务挂起、延时等,此时需要时间管理模块对Tick和秒/毫秒进行转换。
时间管理模块提供时间转换、统计、延迟功能\n 时间管理模块提供时间转换、统计、延迟功能
相关概念 \n 相关概念
Cycle \n Cycle
系统最小的计时单位。Cycle的时长由系统主时钟频率决定,系统主时钟频率就是每秒钟的Cycle数。\n 系统最小的计时单位。Cycle的时长由系统主时钟频率决定,系统主时钟频率就是每秒钟的Cycle数。
Tick \n Tick
Tick是操作系统的基本时间单位,由用户配置的每秒Tick数决定。\n Tick是操作系统的基本时间单位,由用户配置的每秒Tick数决定。
使用场景 \n 使用场景
用户需要了解当前系统运行的时间以及Tick与秒、毫秒之间的转换关系等。 \n 用户需要了解当前系统运行的时间以及Tick与秒、毫秒之间的转换关系等。
时间管理的典型开发流程 \n 时间管理的典型开发流程
根据实际需求,在板级配置适配时确认是否使能LOSCFG_BASE_CORE_TICK_HW_TIME宏选择外部定时器,\n 根据实际需求,在板级配置适配时确认是否使能LOSCFG_BASE_CORE_TICK_HW_TIME宏选择外部定时器,
并配置系统主时钟频率OS_SYS_CLOCK(单位Hz)。OS_SYS_CLOCK的默认值基于硬件平台配置。\n 并配置系统主时钟频率OS_SYS_CLOCK(单位Hz)。OS_SYS_CLOCK的默认值基于硬件平台配置。
通过make menuconfig配置LOSCFG_BASE_CORE_TICK_PER_SECOND。\n 通过make menuconfig配置LOSCFG_BASE_CORE_TICK_PER_SECOND。
注意事项 \n 注意事项
时间管理不是单独的功能模块,依赖于OS_SYS_CLOCK和LOSCFG_BASE_CORE_TICK_PER_SECOND两个配置选项。\n 时间管理不是单独的功能模块,依赖于OS_SYS_CLOCK和LOSCFG_BASE_CORE_TICK_PER_SECOND两个配置选项。
系统的Tick数在关中断的情况下不进行计数,故系统Tick数不能作为准确时间使用。\n 系统的Tick数在关中断的情况下不进行计数,故系统Tick数不能作为准确时间使用。
参考 \n 参考
https://gitee.com/LiteOS/LiteOS/blob/master/doc/Huawei_LiteOS_Kernel_Developer_Guide_zh.md#setup\n https://gitee.com/LiteOS/LiteOS/blob/master/doc/Huawei_LiteOS_Kernel_Developer_Guide_zh.md#setup
@endverbatim
*/ */
#define OS_MAX_VALUE 0xFFFFFFFFUL #define OS_MAX_VALUE 0xFFFFFFFFUL
......
...@@ -970,7 +970,16 @@ LITE_OS_SEC_TEXT VOID OsRunTaskToDelete(LosTaskCB *runTask) ...@@ -970,7 +970,16 @@ LITE_OS_SEC_TEXT VOID OsRunTaskToDelete(LosTaskCB *runTask)
OsSchedResched();//申请调度 OsSchedResched();//申请调度
return; return;
} }
/**
* @brief 获取参数位图中最高位为1的索引位 例如: 00110110 返回 5
* @verbatim
CLZ 用于计算操作数最高端0的个数,这条指令主要用于以下两个场合
  1.计算操作数规范化(使其最高位为1)时需要左移的位数
  2.确定一个优先级掩码中最高优先级
* @endverbatim
* @param bitmap
* @return UINT16
*/
/* /*
* Check if needs to do the delete operation on the running task. * Check if needs to do the delete operation on the running task.
* Return TRUE, if needs to do the deletion. * Return TRUE, if needs to do the deletion.
...@@ -980,14 +989,21 @@ LITE_OS_SEC_TEXT VOID OsRunTaskToDelete(LosTaskCB *runTask) ...@@ -980,14 +989,21 @@ LITE_OS_SEC_TEXT VOID OsRunTaskToDelete(LosTaskCB *runTask)
* 3. Do the deletion in hard-irq * 3. Do the deletion in hard-irq
* then LOS_TaskDelete will directly return with 'ret' value. * then LOS_TaskDelete will directly return with 'ret' value.
*/ */
/****************************************************************
检查是否需要对正在运行的任务执行删除操作,如果需要删除,则返回TRUE。 /**
如果满足以下情况,则返回FALSE: * @brief
1.如果启用了SMP,则跨CPU执行删除 * @verbatim
2.禁用抢占时执行删除 检查是否需要对正在运行的任务执行删除操作,如果需要删除,则返回TRUE。
3.在硬irq中删除 如果满足以下情况,则返回FALSE:
然后LOS_TaskDelete将直接返回ret值 1.如果启用了SMP,则跨CPU执行删除
****************************************************************/ 2.禁用抢占时执行删除
3.在硬irq中删除
然后LOS_TaskDelete将直接返回ret值
* @endverbatim
* @param taskCB
* @param ret
* @return STATIC
*/
STATIC BOOL OsRunTaskToDeleteCheckOnRun(LosTaskCB *taskCB, UINT32 *ret) STATIC BOOL OsRunTaskToDeleteCheckOnRun(LosTaskCB *taskCB, UINT32 *ret)
{ {
/* init default out return value */ /* init default out return value */
......
...@@ -39,8 +39,10 @@ ...@@ -39,8 +39,10 @@
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
#endif /* __cplusplus */ #endif /* __cplusplus */
/***************************************************** @note_pic /**
鸿蒙对消息队列图 * @brief @note_pic
* @verbatim
鸿蒙对消息队列图
|<-----消息内容区,有2个消息---->| |<-----消息内容区,有2个消息---->|
+------------+------------------------------------------------------------+ +------------+------------------------------------------------------------+
| | |---------------|---------------| | | | |---------------|---------------| |
...@@ -54,17 +56,18 @@ extern "C" { ...@@ -54,17 +56,18 @@ extern "C" {
| | | |
| | | |
+<-------------+ 队列长度,消息点个数, +------------->+ +<-------------+ 队列长度,消息点个数, +------------->+
* @endverbatim
*/
*****************************************************/
typedef enum { typedef enum {
OS_QUEUE_READ = 0, //读队列 OS_QUEUE_READ = 0, ///< 读队列
OS_QUEUE_WRITE = 1, //写队列 OS_QUEUE_WRITE = 1, ///< 写队列
OS_QUEUE_N_RW = 2 OS_QUEUE_N_RW = 2
} QueueReadWrite; } QueueReadWrite;
typedef enum { typedef enum {
OS_QUEUE_HEAD = 0, //队列头部标识 OS_QUEUE_HEAD = 0, ///< 队列头部标识
OS_QUEUE_TAIL = 1 //队列尾部标识 OS_QUEUE_TAIL = 1 ///< 队列尾部标识
} QueueHeadTail; } QueueHeadTail;
#define OS_QUEUE_OPERATE_TYPE(ReadOrWrite, HeadOrTail) (((UINT32)(HeadOrTail) << 1) | (ReadOrWrite)) #define OS_QUEUE_OPERATE_TYPE(ReadOrWrite, HeadOrTail) (((UINT32)(HeadOrTail) << 1) | (ReadOrWrite))
...@@ -80,6 +83,7 @@ typedef enum { ...@@ -80,6 +83,7 @@ typedef enum {
/** /**
* @ingroup los_queue * @ingroup los_queue
* Queue information block structure * Queue information block structure
* @attention 读写队列分离
*/ */
typedef struct { typedef struct {
UINT8 *queueHandle; /**< Pointer to a queue handle */ //指向队列句柄的指针 UINT8 *queueHandle; /**< Pointer to a queue handle */ //指向队列句柄的指针
...@@ -94,7 +98,7 @@ typedef struct { ...@@ -94,7 +98,7 @@ typedef struct {
LOS_DL_LIST readWriteList[OS_QUEUE_N_RW]; /**< the linked list to be read or written, 0:readlist, 1:writelist */ LOS_DL_LIST readWriteList[OS_QUEUE_N_RW]; /**< the linked list to be read or written, 0:readlist, 1:writelist */
//挂的都是等待读/写消息的任务链表,0表示读消息的链表,1表示写消息的任务链表 //挂的都是等待读/写消息的任务链表,0表示读消息的链表,1表示写消息的任务链表
LOS_DL_LIST memList; /**< Pointer to the memory linked list */ //@note_why 这里尚未搞明白是啥意思 ,是共享内存吗? LOS_DL_LIST memList; /**< Pointer to the memory linked list */ //@note_why 这里尚未搞明白是啥意思 ,是共享内存吗?
} LosQueueCB;//读写队列分离 } LosQueueCB;
/* queue state */ /* queue state */
/** /**
......
...@@ -65,16 +65,16 @@ __attribute__ ((section(".data"))) UINT32 g_uart_fputc_en = 1; ...@@ -65,16 +65,16 @@ __attribute__ ((section(".data"))) UINT32 g_uart_fputc_en = 1;
extern UINT32 g_uart_fputc_en; extern UINT32 g_uart_fputc_en;
STATIC UINT32 ConsoleSendTask(UINTPTR param); STATIC UINT32 ConsoleSendTask(UINTPTR param);
STATIC UINT8 g_taskConsoleIDArray[LOSCFG_BASE_CORE_TSK_LIMIT];//task 控制台ID池,同步task数量,理论上每个task都可以有一个自己的控制台 STATIC UINT8 g_taskConsoleIDArray[LOSCFG_BASE_CORE_TSK_LIMIT];///< task 控制台ID池,同步task数量,理论上每个task都可以有一个自己的控制台
STATIC SPIN_LOCK_INIT(g_consoleSpin);//初始化控制台自旋锁 STATIC SPIN_LOCK_INIT(g_consoleSpin);///< 初始化控制台自旋锁
#define SHELL_ENTRYID_INVALID 0xFFFFFFFF //默认值,SHELL_ENTRYID 一般为 任务ID #define SHELL_ENTRYID_INVALID 0xFFFFFFFF ///< 默认值,SHELL_ENTRYID 一般为 任务ID
#define SHELL_TASK_PRIORITY 9 //shell 的优先级为 9 #define SHELL_TASK_PRIORITY 9 ///< shell 的优先级为 9
#define CONSOLE_CIRBUF_EVENT 0x02U //控制台循环buffer事件 #define CONSOLE_CIRBUF_EVENT 0x02U ///< 控制台循环buffer事件
#define CONSOLE_SEND_TASK_EXIT 0x04U //控制台发送任务退出事件 #define CONSOLE_SEND_TASK_EXIT 0x04U ///< 控制台发送任务退出事件
#define CONSOLE_SEND_TASK_RUNNING 0x10U //控制台发送任务正在执行事件 #define CONSOLE_SEND_TASK_RUNNING 0x10U ///< 控制台发送任务正在执行事件
CONSOLE_CB *g_console[CONSOLE_NUM];//控制台全局变量,控制台是共用的, 默认为 2个 CONSOLE_CB *g_console[CONSOLE_NUM];///< 控制台全局变量,控制台是共用的, 默认为 2个
#define MIN(a, b) ((a) < (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b))
/* /*
...@@ -372,11 +372,11 @@ STATIC INLINE VOID UserEndOfRead(CONSOLE_CB *consoleCB, struct file *filep, ...@@ -372,11 +372,11 @@ STATIC INLINE VOID UserEndOfRead(CONSOLE_CB *consoleCB, struct file *filep,
} }
///根据VT终端标准 <ESC>[37m 为设置前景色 ///根据VT终端标准 <ESC>[37m 为设置前景色
enum { enum {
STAT_NOMAL_KEY, //普通按键 STAT_NOMAL_KEY, ///< 普通按键
STAT_ESC_KEY, //控制按键,只有 ESC 是 STAT_ESC_KEY, ///< 控制按键,只有 ESC 是
STAT_MULTI_KEY //多个按键,只有 [ 是 STAT_MULTI_KEY ///< 多个按键,只有 [ 是
}; };
//用户shell检查上下左右键 ///用户shell检查上下左右键
STATIC INT32 UserShellCheckUDRL(const CHAR ch, INT32 *lastTokenType) STATIC INT32 UserShellCheckUDRL(const CHAR ch, INT32 *lastTokenType)
{ {
INT32 ret = LOS_OK; INT32 ret = LOS_OK;
......
git add -A git add -A
git commit -m ' 为支持doxygen,改变注释表达方式. git commit -m ' http://weharmonyos.com/doxygen/index.html ,支持doxygen
百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码 百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
博客输出站点(国内):http://weharmonyos.com 博客输出站点(国内):http://weharmonyos.com
博客输出站点(国外):https://weharmony.github.io 博客输出站点(国外):https://weharmony.github.io
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册