diff --git a/doc/SKIMREADING.md b/doc/SKIMREADING.md new file mode 100644 index 00000000..f53598c6 --- /dev/null +++ b/doc/SKIMREADING.md @@ -0,0 +1,60 @@ +# 以下主要是关于kernel/base/core部分代码的阅读 + +![Alt text](image.png) + +根据这个项目的README文件介绍,kernel部分的代码是有关内核实现的。而其中base文件下的内容主要是有关基础内核部分的内容。 + +## 一、 los_bitmap.c + +基本概念 +位操作是指对二进制数的bit位进行操作。程序可以设置某一变量为状态字状态中的每一bit位(标志位)可以具有自定义的含义。 + +使用场景 +系统提供标志位的置1和清0操作,可以改变标志位的内容,同时还提供状态字中标志位 +为1的最高位和最低位的功能。用户也可以对系统的寄存器进行位操作。 +## 二、 los_process.c + +基本概念 这段代码主要是用于处理进程的,包括子进程父进程等。 + +## 三、 los_smp.c + +这段代码主要用于处理代码初始化 + +## 四、 los_sys.c + +基本概念 +软件定时器,是基于系统Tick时钟中断且由软件来模拟的定时器。当经过设定的Tick数后,会触发用户自定义的回调函数。 +硬件定时器受硬件的限制,数量上不足以满足用户的实际需求。因此为了满足用户需求,提供更多的定时器, +软件定时器功能,支持如下特性: +创建软件定时器。 +启动软件定时器。 +停止软件定时器。 +删除软件定时器。 +获取软件定时器剩余Tick数。 +可配置支持的软件定时器个数。 + +运作机制 +软件定时器是系统资源,在模块初始化的时候已经分配了一块连续内存。 +软件定时器使用了系统的一个队列和一个任务资源,软件定时器的触发遵循队列则, +先进先出。定时时间短的定时器总是比定时时间长的靠近队列头,满足优先触发准则。 +软件定时器以Tick为基本计时单位,当创建并启动一个软件定时器时,HuaweiLiteOS会根据 +当前系统Tick时间及设置的定时时长确定该定时器的到期Tick时间,并将该定器控制结构挂入计时全局链表。 +当Tick中断到来时,在Tick中断处理函数中扫描软件定时器的计时全局链表,查是否有定时器超时, +若有则将超时的定时器记录下来。Tick中断处理函数结束后,软件定时器任务(先级为最高) +被唤醒,在该任务中调用已经记录下来的定时器的回调函数。 + +## 五、 los_task.c + + 基本概念 +从系统角度看,任务是竞争系统资源的最小运行单元。任务可以使用或等待CPU、 + 使用内存空间等系统资源,并独立于其它任务运行。 +任务模块可以给用户提供多个任务,实现任务间的切换,帮助用户管理业务程序流程。具有如下特性: +支持多任务。 + 一个任务表示一个线程。 + 抢占式调度机制,高优先级的任务可打断低优先级任务,低优先级任务必须在高优先级任务阻塞或结束后才能得到调度。 + 相同优先级任务支持时间片轮转调度方式。 + 共有32个优先级[0-31],最高优先级为0,最低优先级为31。 + +## 六、 los_tick.c + +系统时钟,是绝大部分部件工作的时钟源,也是其他所有外设的时钟的来源 diff --git a/doc/image.png b/doc/image.png new file mode 100644 index 00000000..f6dffa10 Binary files /dev/null and b/doc/image.png differ diff --git a/src/kernel_liteos_a-OpenHarmony-v3.1.7-Release/kernel/base/core/los_bitmap.c b/src/kernel_liteos_a-OpenHarmony-v3.1.7-Release/kernel/base/core/los_bitmap.c index 4e8b8600..3846f82d 100644 --- a/src/kernel_liteos_a-OpenHarmony-v3.1.7-Release/kernel/base/core/los_bitmap.c +++ b/src/kernel_liteos_a-OpenHarmony-v3.1.7-Release/kernel/base/core/los_bitmap.c @@ -38,9 +38,11 @@ #define OS_BITMAP_WORD_MASK ~0UL /* find first zero bit starting from LSB */ + STATIC INLINE UINT16 Ffz(UINTPTR x) { return __builtin_ffsl(~x) - 1; + // 返回第一个零位的下标 } VOID LOS_BitmapSet(UINT32 *bitmap, UINT16 pos)