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