From e248053a2c2db03d9dd5a895f5f2175e27464000 Mon Sep 17 00:00:00 2001 From: pqk2c5h8v <3232796758@qq.com> Date: Sat, 2 Dec 2023 22:30:25 +0800 Subject: [PATCH 01/21] ADD file via upload --- run.md | 308 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 308 insertions(+) create mode 100644 run.md diff --git a/run.md b/run.md new file mode 100644 index 0000000..58bba27 --- /dev/null +++ b/run.md @@ -0,0 +1,308 @@ +# LiteOS + +# 一、环境安装 + +### 1. 安装docker环境 + +[docker加载镜像下载] + +链接: https://pan.baidu.com/s/1GVossI98riHL2xEzo7HmMQ?pwd=we75 提取码: we75 + +```console +$ cd docker_package +$ sudo dpkg -i containerd.io_1.5.11-1_amd64.deb +$ sudo dpkg -i docker-ce-cli_20.10.14_3-0_ubuntu-focal_amd64.deb +$ sudo dpkg -i docker-ce_20.10.14_3-0_ubuntu-focal_amd64.deb +``` + +docker加载liteos-env镜像 + +```console +$ cd docker_images +$ sudo docker load -i openharmony-v31.tar +``` + +### 2. 下载源代码 + +[LiteOS v3.1](https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fharmonyos%2Fos%2F3.1-Release%2Fcode-v3.1-Release.tar.gz) + +### 3. 将用户添加到docker用户组 + +```console +$ sudo groupadd docker +$ sudo gpasswd -a $USER docker +$ newgrp docker +$ ./run_docker.sh +``` + +### 4.编译liteos-a内核和应用 + +编译 hb set 使用上下方向键盘选择"qemu_small_system_demo" +hb build编译 + +```console +root@62deba27a240:/home/openharmony# hb set +root@62deba27a240:/home/openharmony# hb build -f +``` + +运行 + +```console +root@62deba27a240:/home/openharmony# ./qemu-run -f +``` + +等待内核在qemu下加载完成,回车,进入OHOS shell +如果无法进入,请检查out目录下是否存在smallmmc.img,不存在请复制smallmmc.img到out目录下 +并重新编译执行 + + +```console +root@62deba27a240:/home/openharmony# ./qemu-run -f +Redo making flash.img... + +Start making flash.img... +1+0 records in +1+0 records out +67108864 bytes (67 MB, 64 MiB) copied, 0.498911 s, 135 MB/s +2191+1 records in +2191+1 records out +1122100 bytes (1.1 MB, 1.1 MiB) copied, 0.0123126 s, 91.1 MB/s +0+1 records in +0+1 records out +89 bytes copied, 0.000333672 s, 267 kB/s +9818+1 records in +9818+1 records out +5027048 bytes (5.0 MB, 4.8 MiB) copied, 0.0291576 s, 172 MB/s +63+1 records in +63+1 records out +32492 bytes (32 kB, 32 KiB) copied, 0.000204982 s, 159 MB/s +Success making flash.img... + +Enter to start qemu[y/n]:Waiting VNC connection on: 5920 ...(Ctrl-C exit) + +******************Welcome****************** + +Processor : Cortex-A7 +Run Mode : UP +GIC Rev : GICv2 +build time : Nov 15 2022 11:40:20 +Kernel : Huawei LiteOS 2.0.0.37/debug + +******************************************* + +main core booting up... +cpu 0 entering scheduler +mem dev init ... +DevMmzRegister... +Date:Nov 15 2022. +Time:11:40:19. +net init ... +[ERR]virtio-mmio ID=1 device not found +[ERR]add virtio-mmio net device failed + +************************************************************ +DeviceManagerStart start ... +[CfiFlashInit]CFI flash init start ... +[CfiFlashInit]CFI flash init end ... +[CfiFlashInit]CFI flash init start ... +DeviceManagerStart end ... +OsMountRootfs start ... +OsMountRootfs end ... +virtual_serial_init start ... +virtual_serial_init end ... +system_console_init start ... +system_console_init end ... +OsUserInitProcess start ... +OsUserInitProcess end ... +[ERR]Failed to find block driver /dev/mmcblk0 +[ERR]Failed to find block driver /dev/mmcblk1 +hilog ringbuffer full, drop 19 line(s) log +hilog ringbuffer full, drop 7 line(s) log +hilog ringbuffer full, drop 2 line(s) log +Set log level : 3 +Default log level: 3 +[ERR]Unsupported API tcgetpgrp +01-01 00:00:00.081 2 4 D 02500/devmgr_service: DevmgrServiceUpdateStatus host:storage_host 2 device:HDF_PLATFORM_CFI_0 0 status:1 +............... +01-01 00:00:26.001 7 29 I 01800/Samgr: Goto next boot step return code:-9 +01-01 00:00:26.002 7 14 I 00000/(null): [appspawn] HOS_SystemInit is called! +01-01 00:00:26.003 7 14 I 00000/(null): [appspawn] main, entering wait. +``` + +回车之后进入OHOS shell + +```console +OHOS:/$ cd bin +OHOS:/bin$ +``` + +测试结束 + +Ctrl-A + x 退出Qemu模拟环境 + + + +# 二、命令行调试liteOS + +### 1、安装`gdb-multiarch`工具包(docker 容器中安装): + +```shell +$ apt install gdb-multiarch +``` + +### 2、修改`debug.config`文件 + +```shell +$ cd ./vendor/ohemu/qemu_small_system_demo/kernel_configs +$ vim debug.config +``` + +将 `LOSCFG_CC_STACKPROTECTOR_ALL=y` 修改为: + +```shell +# LOSCFG_CC_STACKPROTECTOR_ALL is not set +LOSCFG_COMPILE_DEBUG=y +``` + +### 3、重新编译项目 + +保存并退出,在OHOS根目录重新编译: + +```shell +$ hb build -f +``` + +### 4、debug LiteOS + +在一个窗口中输入命令: + +```shell +$ ./qemu-run -g +``` + +在另一个窗口中输入命令: + +```shell +$ docker exec -it ohos /bin/bash +$ gdb-multiarch out/arm_virt/qemu_small_system_demo/OHOS_Image +(gdb) target remote localhost:1234 +(gdb) b main +Breakpoint 1 at 0x4005110c: file ../../../kernel/liteos_a/kernel/common/main.c, line 36. +(gdb) c +Continuing. + +Breakpoint 1, main () at ../../../kernel/liteos_a/kernel/common/main.c:36 +36 { +(gdb) l +31 +32 #include "los_config.h" +33 #include "los_sched_pri.h" +34 +35 LITE_OS_SEC_TEXT_INIT INT32 main(VOID) +36 { +37 UINT32 ret = OsMain(); +38 if (ret != LOS_OK) { +39 return (INT32)LOS_NOK; +40 } +(gdb) q +``` + +* gdb 调试常用代码 + + 1、 b (break) :设置断点 + + 2、 r (run): 运行程序 + + 3、 bt (backtrace): 显示程序栈 + + 4、 Print : 打印变量 + + 5、 c (continue): 继续运行程序,直到下一个断点停止 + + 6、 n (next) : 单步运行程序,不进入函数 + + 7、 l (list) : 查看当前代码(显示当前后10行) + + 8、 edit (+function): 查看函数代码 + + 9、 S (step) : 进入函数执行代码 + + 10、 Q(Quit):退出gdb + + 11、 Info b : 查看断点信息 + + + +# 三、VSCode调试liteOS + +### 1、安装VScode + +```shel +$ sudo apt install code +``` + +### 2、安装VScode 插件 + +![截图 2023-06-02 13-03-44](fig/截图 2023-06-02 13-03-44.png) + +### 3、连接docker + +选择CONTAINERS目录下openharmony:v3.1...,右键选择附加VScode + +![截图 2023-06-02 13-07-32](fig/截图 2023-06-02 13-07-32.png) + +### 4、给docker安装VScode插件 + +* 注意插件一定要安装在docker容器中 + +![截图 2023-06-02 13-14-19](fig/截图 2023-06-02 13-14-19.png) + +### 5、配置launch.json文件 + +```json +{ + "version": "0.2.0", + "configurations": [ + { + "name": "debug liteOS", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/out/arm_virt/qemu_small_system_demo/OHOS_Image", + "args": [], + "stopAtEntry": true, + "cwd": "${workspaceFolder}", + "miDebuggerServerAddress": "localhost:1234", + "miDebuggerPath": "/usr/bin/gdb-multiarch", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "setupCommands": [ + { + "description": "pretty printing", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ], + "logging": { + "engineLogging": true, + "programOutput": true, + }, + } + ] +} +``` + +### 6、新建终端 + +运行 + +```shell +./qemu-run -g +``` + +### 7、vscode debug + +点击debug + + + From c80b6709928abb388c2612b9724ff99f80010b20 Mon Sep 17 00:00:00 2001 From: pqk2c5h8v <3232796758@qq.com> Date: Sun, 3 Dec 2023 20:12:10 +0800 Subject: [PATCH 02/21] Delete 'run.md' --- run.md | 308 --------------------------------------------------------- 1 file changed, 308 deletions(-) delete mode 100644 run.md diff --git a/run.md b/run.md deleted file mode 100644 index 58bba27..0000000 --- a/run.md +++ /dev/null @@ -1,308 +0,0 @@ -# LiteOS - -# 一、环境安装 - -### 1. 安装docker环境 - -[docker加载镜像下载] - -链接: https://pan.baidu.com/s/1GVossI98riHL2xEzo7HmMQ?pwd=we75 提取码: we75 - -```console -$ cd docker_package -$ sudo dpkg -i containerd.io_1.5.11-1_amd64.deb -$ sudo dpkg -i docker-ce-cli_20.10.14_3-0_ubuntu-focal_amd64.deb -$ sudo dpkg -i docker-ce_20.10.14_3-0_ubuntu-focal_amd64.deb -``` - -docker加载liteos-env镜像 - -```console -$ cd docker_images -$ sudo docker load -i openharmony-v31.tar -``` - -### 2. 下载源代码 - -[LiteOS v3.1](https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fharmonyos%2Fos%2F3.1-Release%2Fcode-v3.1-Release.tar.gz) - -### 3. 将用户添加到docker用户组 - -```console -$ sudo groupadd docker -$ sudo gpasswd -a $USER docker -$ newgrp docker -$ ./run_docker.sh -``` - -### 4.编译liteos-a内核和应用 - -编译 hb set 使用上下方向键盘选择"qemu_small_system_demo" -hb build编译 - -```console -root@62deba27a240:/home/openharmony# hb set -root@62deba27a240:/home/openharmony# hb build -f -``` - -运行 - -```console -root@62deba27a240:/home/openharmony# ./qemu-run -f -``` - -等待内核在qemu下加载完成,回车,进入OHOS shell -如果无法进入,请检查out目录下是否存在smallmmc.img,不存在请复制smallmmc.img到out目录下 -并重新编译执行 - - -```console -root@62deba27a240:/home/openharmony# ./qemu-run -f -Redo making flash.img... - -Start making flash.img... -1+0 records in -1+0 records out -67108864 bytes (67 MB, 64 MiB) copied, 0.498911 s, 135 MB/s -2191+1 records in -2191+1 records out -1122100 bytes (1.1 MB, 1.1 MiB) copied, 0.0123126 s, 91.1 MB/s -0+1 records in -0+1 records out -89 bytes copied, 0.000333672 s, 267 kB/s -9818+1 records in -9818+1 records out -5027048 bytes (5.0 MB, 4.8 MiB) copied, 0.0291576 s, 172 MB/s -63+1 records in -63+1 records out -32492 bytes (32 kB, 32 KiB) copied, 0.000204982 s, 159 MB/s -Success making flash.img... - -Enter to start qemu[y/n]:Waiting VNC connection on: 5920 ...(Ctrl-C exit) - -******************Welcome****************** - -Processor : Cortex-A7 -Run Mode : UP -GIC Rev : GICv2 -build time : Nov 15 2022 11:40:20 -Kernel : Huawei LiteOS 2.0.0.37/debug - -******************************************* - -main core booting up... -cpu 0 entering scheduler -mem dev init ... -DevMmzRegister... -Date:Nov 15 2022. -Time:11:40:19. -net init ... -[ERR]virtio-mmio ID=1 device not found -[ERR]add virtio-mmio net device failed - -************************************************************ -DeviceManagerStart start ... -[CfiFlashInit]CFI flash init start ... -[CfiFlashInit]CFI flash init end ... -[CfiFlashInit]CFI flash init start ... -DeviceManagerStart end ... -OsMountRootfs start ... -OsMountRootfs end ... -virtual_serial_init start ... -virtual_serial_init end ... -system_console_init start ... -system_console_init end ... -OsUserInitProcess start ... -OsUserInitProcess end ... -[ERR]Failed to find block driver /dev/mmcblk0 -[ERR]Failed to find block driver /dev/mmcblk1 -hilog ringbuffer full, drop 19 line(s) log -hilog ringbuffer full, drop 7 line(s) log -hilog ringbuffer full, drop 2 line(s) log -Set log level : 3 -Default log level: 3 -[ERR]Unsupported API tcgetpgrp -01-01 00:00:00.081 2 4 D 02500/devmgr_service: DevmgrServiceUpdateStatus host:storage_host 2 device:HDF_PLATFORM_CFI_0 0 status:1 -............... -01-01 00:00:26.001 7 29 I 01800/Samgr: Goto next boot step return code:-9 -01-01 00:00:26.002 7 14 I 00000/(null): [appspawn] HOS_SystemInit is called! -01-01 00:00:26.003 7 14 I 00000/(null): [appspawn] main, entering wait. -``` - -回车之后进入OHOS shell - -```console -OHOS:/$ cd bin -OHOS:/bin$ -``` - -测试结束 - -Ctrl-A + x 退出Qemu模拟环境 - - - -# 二、命令行调试liteOS - -### 1、安装`gdb-multiarch`工具包(docker 容器中安装): - -```shell -$ apt install gdb-multiarch -``` - -### 2、修改`debug.config`文件 - -```shell -$ cd ./vendor/ohemu/qemu_small_system_demo/kernel_configs -$ vim debug.config -``` - -将 `LOSCFG_CC_STACKPROTECTOR_ALL=y` 修改为: - -```shell -# LOSCFG_CC_STACKPROTECTOR_ALL is not set -LOSCFG_COMPILE_DEBUG=y -``` - -### 3、重新编译项目 - -保存并退出,在OHOS根目录重新编译: - -```shell -$ hb build -f -``` - -### 4、debug LiteOS - -在一个窗口中输入命令: - -```shell -$ ./qemu-run -g -``` - -在另一个窗口中输入命令: - -```shell -$ docker exec -it ohos /bin/bash -$ gdb-multiarch out/arm_virt/qemu_small_system_demo/OHOS_Image -(gdb) target remote localhost:1234 -(gdb) b main -Breakpoint 1 at 0x4005110c: file ../../../kernel/liteos_a/kernel/common/main.c, line 36. -(gdb) c -Continuing. - -Breakpoint 1, main () at ../../../kernel/liteos_a/kernel/common/main.c:36 -36 { -(gdb) l -31 -32 #include "los_config.h" -33 #include "los_sched_pri.h" -34 -35 LITE_OS_SEC_TEXT_INIT INT32 main(VOID) -36 { -37 UINT32 ret = OsMain(); -38 if (ret != LOS_OK) { -39 return (INT32)LOS_NOK; -40 } -(gdb) q -``` - -* gdb 调试常用代码 - - 1、 b (break) :设置断点 - - 2、 r (run): 运行程序 - - 3、 bt (backtrace): 显示程序栈 - - 4、 Print : 打印变量 - - 5、 c (continue): 继续运行程序,直到下一个断点停止 - - 6、 n (next) : 单步运行程序,不进入函数 - - 7、 l (list) : 查看当前代码(显示当前后10行) - - 8、 edit (+function): 查看函数代码 - - 9、 S (step) : 进入函数执行代码 - - 10、 Q(Quit):退出gdb - - 11、 Info b : 查看断点信息 - - - -# 三、VSCode调试liteOS - -### 1、安装VScode - -```shel -$ sudo apt install code -``` - -### 2、安装VScode 插件 - -![截图 2023-06-02 13-03-44](fig/截图 2023-06-02 13-03-44.png) - -### 3、连接docker - -选择CONTAINERS目录下openharmony:v3.1...,右键选择附加VScode - -![截图 2023-06-02 13-07-32](fig/截图 2023-06-02 13-07-32.png) - -### 4、给docker安装VScode插件 - -* 注意插件一定要安装在docker容器中 - -![截图 2023-06-02 13-14-19](fig/截图 2023-06-02 13-14-19.png) - -### 5、配置launch.json文件 - -```json -{ - "version": "0.2.0", - "configurations": [ - { - "name": "debug liteOS", - "type": "cppdbg", - "request": "launch", - "program": "${workspaceFolder}/out/arm_virt/qemu_small_system_demo/OHOS_Image", - "args": [], - "stopAtEntry": true, - "cwd": "${workspaceFolder}", - "miDebuggerServerAddress": "localhost:1234", - "miDebuggerPath": "/usr/bin/gdb-multiarch", - "environment": [], - "externalConsole": false, - "MIMode": "gdb", - "setupCommands": [ - { - "description": "pretty printing", - "text": "-enable-pretty-printing", - "ignoreFailures": true - } - ], - "logging": { - "engineLogging": true, - "programOutput": true, - }, - } - ] -} -``` - -### 6、新建终端 - -运行 - -```shell -./qemu-run -g -``` - -### 7、vscode debug - -点击debug - - - From 6d96fe364cbed182f5b33fca2ef20a8aac495c63 Mon Sep 17 00:00:00 2001 From: pqk2c5h8v <3232796758@qq.com> Date: Sun, 3 Dec 2023 20:25:25 +0800 Subject: [PATCH 03/21] ADD file via upload --- 实验步骤.docx | Bin 0 -> 98574 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 实验步骤.docx diff --git a/实验步骤.docx b/实验步骤.docx new file mode 100644 index 0000000000000000000000000000000000000000..5c5062534716d349a996915921a9146ae1f4beb4 GIT binary patch literal 98574 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%0A{SJ(tAyW!Drzj*rHni=vJ%!P3)z8 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Μ%*(M;)K?4mjNxpmxgX-sYT2i@l2)d@++&T6{ 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 Date: Mon, 4 Dec 2023 17:05:02 +0800 Subject: [PATCH 04/21] ADD file via upload --- los_sys.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 los_sys.c diff --git a/los_sys.c b/los_sys.c new file mode 100644 index 0000000..4235560 --- /dev/null +++ b/los_sys.c @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved. + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its contributors may be used + * to endorse or promote products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +/* +LOS_TickCountGet()ȡǰϵͳͨOsGetCurrSchedTimeCycle()ȡǰʱڣÿĵõ + +LOS_CyclePerTickGet()ȡÿĵͨϵͳʱƵʳÿõÿĵ + +LOS_MS2Tick()תΪĺÿٳÿõ + +LOS_Tick2MS()תΪ롣Ľÿٳÿõ + +OsNS2Tick()תΪȼÿĵȻ󽫸ÿĵ1ٳÿĵõֵΪֵ +*/ + +#include "los_sys_pri.h" +#include "los_sched_pri.h" + + // ֵ +#define OS_MAX_VALUE 0xFFFFFFFFUL + +// ȡǰϵͳ +LITE_OS_SEC_TEXT_MINOR UINT64 LOS_TickCountGet(VOID) +{ + // ڲȡǰʱڲÿĵõ + return OsGetCurrSchedTimeCycle() / OS_CYCLE_PER_TICK; +} + +// ȡÿĵ +LITE_OS_SEC_TEXT_MINOR UINT32 LOS_CyclePerTickGet(VOID) +{ + // ϵͳʱƵʳÿõÿĵ + return g_sysClock / LOSCFG_BASE_CORE_TICK_PER_SECOND; +} + +// תΪ +LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MS2Tick(UINT32 millisec) +{ + // ֱֵӷֵ + if (millisec == OS_MAX_VALUE) { + return OS_MAX_VALUE; + } + + // ÿٳÿõ + return ((UINT64)millisec * LOSCFG_BASE_CORE_TICK_PER_SECOND) / OS_SYS_MS_PER_SECOND; +} + +// תΪ +LITE_OS_SEC_TEXT_MINOR UINT32 LOS_Tick2MS(UINT32 tick) +{ + // ÿٳÿõ + return ((UINT64)tick * OS_SYS_MS_PER_SECOND) / LOSCFG_BASE_CORE_TICK_PER_SECOND; +} + +// תΪ +LITE_OS_SEC_TEXT_MINOR UINT32 OsNS2Tick(UINT64 nanoseconds) +{ + // ÿĵ + const UINT32 nsPerTick = OS_SYS_NS_PER_SECOND / LOSCFG_BASE_CORE_TICK_PER_SECOND; + + // ÿĵ1ٳÿĵõ + UINT64 ticks = (nanoseconds + nsPerTick - 1) / nsPerTick; + + // ֵΪֵ + if (ticks > OS_MAX_VALUE) { + ticks = OS_MAX_VALUE; + } + + // תΪ32λ + return (UINT32)ticks; +} + + + + From 762f964222bb916ddac1da1ba413e041ab8ce53c Mon Sep 17 00:00:00 2001 From: weitong <494475907@qq.com> Date: Mon, 4 Dec 2023 17:38:46 +0800 Subject: [PATCH 05/21] 12.04 --- core/los_sys.c | 34 +++++++++++++++++++++++++++++++++- core/los_tick.c | 29 +++++++++++++++++++++++++++-- 2 files changed, 60 insertions(+), 3 deletions(-) diff --git a/core/los_sys.c b/core/los_sys.c index 8a9d373..4d9b586 100644 --- a/core/los_sys.c +++ b/core/los_sys.c @@ -29,44 +29,76 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + + /* + LOS_TickCountGet()ȡǰϵͳͨOsGetCurrSchedTimeCycle()ȡǰʱڣÿĵõ + + LOS_CyclePerTickGet()ȡÿĵͨϵͳʱƵʳÿõÿĵ + + LOS_MS2Tick()תΪĺÿٳÿõ + + LOS_Tick2MS()תΪ롣Ľÿٳÿõ + + OsNS2Tick()תΪȼÿĵȻ󽫸ÿĵ1ٳÿĵõֵΪֵ + */ + #include "los_sys_pri.h" #include "los_sched_pri.h" - + // ֵ #define OS_MAX_VALUE 0xFFFFFFFFUL +// ȡǰϵͳ LITE_OS_SEC_TEXT_MINOR UINT64 LOS_TickCountGet(VOID) { + // ڲȡǰʱڲÿĵõ return OsGetCurrSchedTimeCycle() / OS_CYCLE_PER_TICK; } +// ȡÿĵ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_CyclePerTickGet(VOID) { + // ϵͳʱƵʳÿõÿĵ return g_sysClock / LOSCFG_BASE_CORE_TICK_PER_SECOND; } +// תΪ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MS2Tick(UINT32 millisec) { + // ֱֵӷֵ if (millisec == OS_MAX_VALUE) { return OS_MAX_VALUE; } + // ÿٳÿõ return ((UINT64)millisec * LOSCFG_BASE_CORE_TICK_PER_SECOND) / OS_SYS_MS_PER_SECOND; } +// תΪ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_Tick2MS(UINT32 tick) { + // ÿٳÿõ return ((UINT64)tick * OS_SYS_MS_PER_SECOND) / LOSCFG_BASE_CORE_TICK_PER_SECOND; } +// תΪ LITE_OS_SEC_TEXT_MINOR UINT32 OsNS2Tick(UINT64 nanoseconds) { + // ÿĵ const UINT32 nsPerTick = OS_SYS_NS_PER_SECOND / LOSCFG_BASE_CORE_TICK_PER_SECOND; + // ÿĵ1ٳÿĵõ UINT64 ticks = (nanoseconds + nsPerTick - 1) / nsPerTick; + + // ֵΪֵ if (ticks > OS_MAX_VALUE) { ticks = OS_MAX_VALUE; } + + // תΪ32λ return (UINT32)ticks; } + + + diff --git a/core/los_tick.c b/core/los_tick.c index b5c2794..7544c0b 100644 --- a/core/los_tick.c +++ b/core/los_tick.c @@ -29,6 +29,22 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + + + /* + + g_sysClockϵͳʱƵʣڼ¼ϵͳʱƵʡ + + g_tickPerSecondÿڼ¼ÿӷĽ + + g_cycle2NsScaleѭڵűڽתΪ롣 + + g_tickSpinģڱģķʡ + + OsTickHandler()жϴصIJںڲܻһЩضƽ̨IJԼ¼ݡ⶯̬VDSOʱֵȡȻOsSchedTick()ĽIJ + */ + + #include "los_tick_pri.h" #include "los_swtmr_pri.h" #include "los_sched_pri.h" @@ -36,17 +52,22 @@ #include "los_vdso.h" #endif - + // ϵͳʱƵ LITE_OS_SEC_DATA_INIT UINT32 g_sysClock; + +// ÿ LITE_OS_SEC_DATA_INIT UINT32 g_tickPerSecond; + +// ѭڵű LITE_OS_SEC_BSS DOUBLE g_cycle2NsScale; -/* spinlock for task module */ +// ģ LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_tickSpin); /* * Description : Tick interruption handler */ + // жϴ LITE_OS_SEC_TEXT VOID OsTickHandler(VOID) { #ifdef LOSCFG_SCHED_TICK_DEBUG @@ -61,6 +82,10 @@ LITE_OS_SEC_TEXT VOID OsTickHandler(VOID) HalClockIrqClear(); /* diff from every platform */ #endif + // ĽĴ OsSchedTick(); } + + + From 677a5c86d2a77fc0148eaeee00b1bf4289c7392b Mon Sep 17 00:00:00 2001 From: weitong <494475907@qq.com> Date: Mon, 4 Dec 2023 18:25:22 +0800 Subject: [PATCH 06/21] 12.04 --- los_sys.c | 104 ------------------------------------------------------ 1 file changed, 104 deletions(-) delete mode 100644 los_sys.c diff --git a/los_sys.c b/los_sys.c deleted file mode 100644 index 4235560..0000000 --- a/los_sys.c +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved. - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - -/* -LOS_TickCountGet()ȡǰϵͳͨOsGetCurrSchedTimeCycle()ȡǰʱڣÿĵõ - -LOS_CyclePerTickGet()ȡÿĵͨϵͳʱƵʳÿõÿĵ - -LOS_MS2Tick()תΪĺÿٳÿõ - -LOS_Tick2MS()תΪ롣Ľÿٳÿõ - -OsNS2Tick()תΪȼÿĵȻ󽫸ÿĵ1ٳÿĵõֵΪֵ -*/ - -#include "los_sys_pri.h" -#include "los_sched_pri.h" - - // ֵ -#define OS_MAX_VALUE 0xFFFFFFFFUL - -// ȡǰϵͳ -LITE_OS_SEC_TEXT_MINOR UINT64 LOS_TickCountGet(VOID) -{ - // ڲȡǰʱڲÿĵõ - return OsGetCurrSchedTimeCycle() / OS_CYCLE_PER_TICK; -} - -// ȡÿĵ -LITE_OS_SEC_TEXT_MINOR UINT32 LOS_CyclePerTickGet(VOID) -{ - // ϵͳʱƵʳÿõÿĵ - return g_sysClock / LOSCFG_BASE_CORE_TICK_PER_SECOND; -} - -// תΪ -LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MS2Tick(UINT32 millisec) -{ - // ֱֵӷֵ - if (millisec == OS_MAX_VALUE) { - return OS_MAX_VALUE; - } - - // ÿٳÿõ - return ((UINT64)millisec * LOSCFG_BASE_CORE_TICK_PER_SECOND) / OS_SYS_MS_PER_SECOND; -} - -// תΪ -LITE_OS_SEC_TEXT_MINOR UINT32 LOS_Tick2MS(UINT32 tick) -{ - // ÿٳÿõ - return ((UINT64)tick * OS_SYS_MS_PER_SECOND) / LOSCFG_BASE_CORE_TICK_PER_SECOND; -} - -// תΪ -LITE_OS_SEC_TEXT_MINOR UINT32 OsNS2Tick(UINT64 nanoseconds) -{ - // ÿĵ - const UINT32 nsPerTick = OS_SYS_NS_PER_SECOND / LOSCFG_BASE_CORE_TICK_PER_SECOND; - - // ÿĵ1ٳÿĵõ - UINT64 ticks = (nanoseconds + nsPerTick - 1) / nsPerTick; - - // ֵΪֵ - if (ticks > OS_MAX_VALUE) { - ticks = OS_MAX_VALUE; - } - - // תΪ32λ - return (UINT32)ticks; -} - - - - From 529fcf81465d45ad3d99a5f53caeb900c48b94bf Mon Sep 17 00:00:00 2001 From: zengqi <173384268@qq.com> Date: Mon, 4 Dec 2023 19:00:28 +0800 Subject: [PATCH 07/21] zengqi --- sched/sched_sq/los_sched.c | 972 +++++++++++++++++++------------------ 1 file changed, 509 insertions(+), 463 deletions(-) diff --git a/sched/sched_sq/los_sched.c b/sched/sched_sq/los_sched.c index dab0291..ed3f2ea 100644 --- a/sched/sched_sq/los_sched.c +++ b/sched/sched_sq/los_sched.c @@ -48,43 +48,46 @@ #include "los_stat_pri.h" #endif -#define OS_32BIT_MAX 0xFFFFFFFFUL -#define OS_SCHED_FIFO_TIMEOUT 0x7FFFFFFF -#define OS_PRIORITY_QUEUE_NUM 32 -#define PRIQUEUE_PRIOR0_BIT 0x80000000U -#define OS_SCHED_TIME_SLICES_MIN ((5000 * OS_SYS_NS_PER_US) / OS_NS_PER_CYCLE) /* 5ms */ -#define OS_SCHED_TIME_SLICES_MAX ((LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT * OS_SYS_NS_PER_US) / OS_NS_PER_CYCLE) -#define OS_SCHED_TIME_SLICES_DIFF (OS_SCHED_TIME_SLICES_MAX - OS_SCHED_TIME_SLICES_MIN) -#define OS_SCHED_READY_MAX 30 -#define OS_TIME_SLICE_MIN (INT32)((50 * OS_SYS_NS_PER_US) / OS_NS_PER_CYCLE) /* 50us */ - +#define OS_32BIT_MAX 0xFFFFFFFFUL //定义32位操作系统的最大值 +#define OS_SCHED_FIFO_TIMEOUT 0x7FFFFFFF //定义FIFO调度器的超时值 +#define OS_PRIORITY_QUEUE_NUM 32 //定义优先级队列的数量 +#define PRIQUEUE_PRIOR0_BIT 0x80000000U //定义优先级队列中优先级0的最高位 +#define OS_SCHED_TIME_SLICES_MIN ((5000 * OS_SYS_NS_PER_US) / OS_NS_PER_CYCLE) /* 定义调度器的最小时间片(以纳秒为单位)5ms */ +#define OS_SCHED_TIME_SLICES_MAX ((LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT * OS_SYS_NS_PER_US) / OS_NS_PER_CYCLE) //定义调度器的最大时间片(以纳秒为单位) +#define OS_SCHED_TIME_SLICES_DIFF (OS_SCHED_TIME_SLICES_MAX - OS_SCHED_TIME_SLICES_MIN) //定义调度器最大时间片和最小时间片之间的差值 +#define OS_SCHED_READY_MAX 30 //定义调度器的最大就绪任务数 +#define OS_TIME_SLICE_MIN (INT32)((50 * OS_SYS_NS_PER_US) / OS_NS_PER_CYCLE) /*定义最小时间片(以INT32类型表示,单位为50微秒) 50us */ + +//定义调度器队列结构体SchedQueue typedef struct { - LOS_DL_LIST priQueueList[OS_PRIORITY_QUEUE_NUM]; - UINT32 readyTasks[OS_PRIORITY_QUEUE_NUM]; - UINT32 queueBitmap; + LOS_DL_LIST priQueueList[OS_PRIORITY_QUEUE_NUM]; // 优先级队列列表 + UINT32 readyTasks[OS_PRIORITY_QUEUE_NUM]; // 就绪任务数 + UINT32 queueBitmap; // 队列位图 } SchedQueue; - +//定义调度器结构体Sched typedef struct { - SchedQueue queueList[OS_PRIORITY_QUEUE_NUM]; - UINT32 queueBitmap; - SchedScan taskScan; - SchedScan swtmrScan; + SchedQueue queueList[OS_PRIORITY_QUEUE_NUM]; // 优先级队列列表 + UINT32 queueBitmap; // 队列位图 + SchedScan taskScan; // 任务扫描 + SchedScan swtmrScan; // 软件定时器扫描 } Sched; -STATIC Sched *g_sched = NULL; -STATIC UINT64 g_schedTickMaxResponseTime; -UINT64 g_sysSchedStartTime = OS_64BIT_MAX; +STATIC Sched *g_sched = NULL; //定义全局调度器变量g_sched +STATIC UINT64 g_schedTickMaxResponseTime; //定义调度器tick的最大响应时间 +UINT64 g_sysSchedStartTime = OS_64BIT_MAX; //定义系统调度器的起始时间 #ifdef LOSCFG_SCHED_TICK_DEBUG -#define OS_SCHED_DEBUG_DATA_NUM 1000 +#define OS_SCHED_DEBUG_DATA_NUM 1000 //定义调度器tick调试数据数量的常量 +//定义调度器tick调试数据结构体SchedTickDebug typedef struct { - UINT32 tickResporeTime[OS_SCHED_DEBUG_DATA_NUM]; - UINT32 index; - UINT32 setTickCount; - UINT64 oldResporeTime; + UINT32 tickResporeTime[OS_SCHED_DEBUG_DATA_NUM]; // tick响应时间数组 + UINT32 index; // 当前数据索引 + UINT32 setTickCount; // 设置的tick计数 + UINT64 oldResporeTime; // 上一次的响应时间 } SchedTickDebug; -STATIC SchedTickDebug *g_schedTickDebug = NULL; +STATIC SchedTickDebug *g_schedTickDebug = NULL; //定义全局调度器tick调试数据变量g_schedTickDebug +//初始化调度器tick调试数据 STATIC UINT32 OsSchedDebugInit(VOID) { UINT32 size = sizeof(SchedTickDebug) * LOSCFG_KERNEL_CORE_NUM; @@ -96,7 +99,7 @@ STATIC UINT32 OsSchedDebugInit(VOID) (VOID)memset_s(g_schedTickDebug, size, 0, size); return LOS_OK; } - +//记录调度器tick调试数据 VOID OsSchedDebugRecordData(VOID) { SchedTickDebug *schedDebug = &g_schedTickDebug[ArchCurrCpuid()]; @@ -107,265 +110,308 @@ VOID OsSchedDebugRecordData(VOID) schedDebug->index++; } } - +//获取调度器tick调试数据 SchedTickDebug *OsSchedDebugGet(VOID) { return g_schedTickDebug; } - +// 显示调度器 tick 响应时间的 Shell 命令函数 UINT32 OsShellShowTickRespo(VOID) { - UINT32 intSave; - UINT16 cpu; - UINT64 allTime; + UINT32 intSave; // 保存中断状态的变量 + UINT16 cpu; // CPU 编号 + UINT64 allTime; // 所有时间的总和 + // 计算存储调度器调试信息的内存大小 UINT32 tickSize = sizeof(SchedTickDebug) * LOSCFG_KERNEL_CORE_NUM; + + // 在系统内存池中分配存储调度器调试信息的内存 SchedTickDebug *schedDebug = (SchedTickDebug *)LOS_MemAlloc(m_aucSysMem1, tickSize); if (schedDebug == NULL) { return LOS_NOK; } + // 创建一个数组来保存每个 CPU 上的任务和软件定时器的排序链表节点数 UINT32 sortLinkNum[LOSCFG_KERNEL_CORE_NUM]; + + // 禁止调度器调度 SCHEDULER_LOCK(intSave); + + // 将调度器调试信息拷贝到 schedDebug 中 (VOID)memcpy_s((CHAR *)schedDebug, tickSize, (CHAR *)OsSchedDebugGet(), tickSize); + + // 将调度器调试信息清零 (VOID)memset_s((CHAR *)OsSchedDebugGet(), tickSize, 0, tickSize); + + // 计算每个 CPU 上的任务和软件定时器的排序链表节点数 for (cpu = 0; cpu < LOSCFG_KERNEL_CORE_NUM; cpu++) { sortLinkNum[cpu] = OsPercpuGetByID(cpu)->taskSortLink.nodeNum + OsPercpuGetByID(cpu)->swtmrSortLink.nodeNum; } + + // 允许调度器调度 SCHEDULER_UNLOCK(intSave); + // 遍历每个 CPU 上的调度器调试信息 for (cpu = 0; cpu < LOSCFG_KERNEL_CORE_NUM; cpu++) { - SchedTickDebug *schedData = &schedDebug[cpu]; + SchedTickDebug *schedData = &schedDebug[cpu]; // 获取当前 CPU 的调度器调试信息 + + // 打印当前 CPU 的调度器调试信息 PRINTK("cpu : %u sched data num : %u set time count : %u SortMax : %u\n", cpu, schedData->index, schedData->setTickCount, sortLinkNum[cpu]); - UINT32 *data = schedData->tickResporeTime; - allTime = 0; + + UINT32 *data = schedData->tickResporeTime; // 获取当前 CPU 的 tick 响应时间数据 + + allTime = 0; // 重置总时间 + + // 遍历 tick 响应时间数据 for (UINT32 i = 1; i < schedData->index; i++) { - allTime += data[i]; - UINT32 timeUs = (data[i] * OS_NS_PER_CYCLE) / OS_SYS_NS_PER_US; - PRINTK(" %u(%u)", timeUs, timeUs / OS_US_PER_TICK); - if ((i != 0) && ((i % 5) == 0)) { /* A row of 5 data */ - PRINTK("\n"); + allTime += data[i]; // 计算总时间 + UINT32 timeUs = (data[i] * OS_NS_PER_CYCLE) / OS_SYS_NS_PER_US; // 将时间转换为微秒 + PRINTK(" %u(%u)", timeUs, timeUs / OS_US_PER_TICK); // 打印时间 + if ((i != 0) && ((i % 5) == 0)) { /* A row of 5 data每行显示5个数据 */ + PRINTK("\n"); // 换行 } } - allTime = (allTime * OS_NS_PER_CYCLE) / OS_SYS_NS_PER_US; - PRINTK("\nTick Indicates the average response period: %llu(us)\n", allTime / (schedData->index - 1)); + allTime = (allTime * OS_NS_PER_CYCLE) / OS_SYS_NS_PER_US; // 将总时间转换为微秒 + PRINTK("\nTick Indicates the average response period: %llu(us)\n", allTime / (schedData->index - 1)); //平均响应周期 } + // 释放内存 (VOID)LOS_MemFree(m_aucSysMem1, schedDebug); + return LOS_OK; } #else - +//显示调度器tick响应时间的Shell命令函数 UINT32 OsShellShowTickRespo(VOID) { return LOS_NOK; } #endif - +//定义调度器调试开关 #ifdef LOSCFG_SCHED_DEBUG +// 显示调度器调度参数的 Shell 命令函数 UINT32 OsShellShowSchedParam(VOID) { - UINT64 averRunTime; - UINT64 averTimeSlice; - UINT64 averSchedWait; - UINT64 averPendTime; - UINT32 intSave; - UINT32 size = g_taskMaxNum * sizeof(LosTaskCB); - LosTaskCB *taskCBArray = LOS_MemAlloc(m_aucSysMem1, size); + UINT64 averRunTime; // 平均运行时间 + UINT64 averTimeSlice; // 平均时间片 + UINT64 averSchedWait; // 平均等待调度时间 + UINT64 averPendTime; // 平均挂起时间 + UINT32 intSave; // 保存中断状态的变量 + UINT32 size = g_taskMaxNum * sizeof(LosTaskCB); // 计算任务控制块数组的大小 + LosTaskCB *taskCBArray = LOS_MemAlloc(m_aucSysMem1, size); // 在系统内存池中分配任务控制块数组的内存 if (taskCBArray == NULL) { return LOS_NOK; } - SCHEDULER_LOCK(intSave); + SCHEDULER_LOCK(intSave); // 禁止调度器调度 + + // 将全局的任务控制块数组拷贝到局部数组中 (VOID)memcpy_s(taskCBArray, size, g_taskCBArray, size); - SCHEDULER_UNLOCK(intSave); + + SCHEDULER_UNLOCK(intSave); // 允许调度器调度 + + // 打印表头 PRINTK(" Tid AverRunTime(us) SwitchCount AverTimeSlice(us) TimeSliceCount AverReadyWait(us) " "AverPendTime(us) TaskName \n"); + + // 遍历任务控制块数组 for (UINT32 tid = 0; tid < g_taskMaxNum; tid++) { - LosTaskCB *taskCB = taskCBArray + tid; + LosTaskCB *taskCB = taskCBArray + tid; // 获取当前任务控制块 + + // 如果任务控制块未使用,则跳过 if (OsTaskIsUnused(taskCB)) { continue; } - averRunTime = 0; - averTimeSlice = 0; - averPendTime = 0; - averSchedWait = 0; + averRunTime = 0; // 平均运行时间初始化为0 + averTimeSlice = 0; // 平均时间片初始化为0 + averPendTime = 0; // 平均挂起时间初始化为0 + averSchedWait = 0; // 平均等待调度时间初始化为0 + // 计算平均运行时间 if (taskCB->schedStat.switchCount >= 1) { - averRunTime = taskCB->schedStat.runTime / taskCB->schedStat.switchCount; - averRunTime = (averRunTime * OS_NS_PER_CYCLE) / OS_SYS_NS_PER_US; + averRunTime = taskCB->schedStat.runTime / taskCB->schedStat.switchCount; // 平均运行时间 = 运行时间 / 切换次数 + averRunTime = (averRunTime * OS_NS_PER_CYCLE) / OS_SYS_NS_PER_US; // 将平均运行时间转换为微秒 } + // 计算平均时间片 if (taskCB->schedStat.timeSliceCount > 1) { - averTimeSlice = taskCB->schedStat.timeSliceTime / (taskCB->schedStat.timeSliceCount - 1); - averTimeSlice = (averTimeSlice * OS_NS_PER_CYCLE) / OS_SYS_NS_PER_US; + averTimeSlice = taskCB->schedStat.timeSliceTime / (taskCB->schedStat.timeSliceCount - 1); // 平均时间片 = 时间片总数 / (时间片个数 - 1) + averTimeSlice = (averTimeSlice * OS_NS_PER_CYCLE) / OS_SYS_NS_PER_US; // 将平均时间片转换为微秒 } + // 计算平均挂起时间 if (taskCB->schedStat.pendCount > 1) { - averPendTime = taskCB->schedStat.pendTime / taskCB->schedStat.pendCount; - averPendTime = (averPendTime * OS_NS_PER_CYCLE) / OS_SYS_NS_PER_US; + averPendTime = taskCB->schedStat.pendTime / taskCB->schedStat.pendCount; // 平均挂起时间 = 挂起时间 / 挂起次数 + averPendTime = (averPendTime * OS_NS_PER_CYCLE) / OS_SYS_NS_PER_US; // 将平均挂起时间转换为微秒 } + // 计算平均等待调度时间 if (taskCB->schedStat.waitSchedCount > 0) { - averSchedWait = taskCB->schedStat.waitSchedTime / taskCB->schedStat.waitSchedCount; - averSchedWait = (averSchedWait * OS_NS_PER_CYCLE) / OS_SYS_NS_PER_US; + averSchedWait = taskCB->schedStat.waitSchedTime / taskCB->schedStat.waitSchedCount; // 平均等待调度时间 = 等待调度时间 / 等待调度次数 + averSchedWait = (averSchedWait * OS_NS_PER_CYCLE) / OS_SYS_NS_PER_US; // 将平均等待调度时间转换为微秒 } + // 打印任务的调度参数信息 PRINTK("%5u%19llu%15llu%19llu%18llu%19llu%18llu %-32s\n", taskCB->taskID, averRunTime, taskCB->schedStat.switchCount, averTimeSlice, taskCB->schedStat.timeSliceCount - 1, averSchedWait, averPendTime, taskCB->taskName); } - (VOID)LOS_MemFree(m_aucSysMem1, taskCBArray); + (VOID)LOS_MemFree(m_aucSysMem1, taskCBArray); // 释放内存 return LOS_OK; } #else + UINT32 OsShellShowSchedParam(VOID) { - return LOS_NOK; + return LOS_NOK; // 返回错误码,表示未实现该函数 } #endif +// 设置调度器的 tick 定时器类型 UINT32 OsSchedSetTickTimerType(UINT32 timerType) { switch (timerType) { - case 32: /* 32 bit timer */ - g_schedTickMaxResponseTime = OS_32BIT_MAX; + case 32: /* 32 位定时器 */ + g_schedTickMaxResponseTime = OS_32BIT_MAX; // 设置最大的 tick 响应时间为 32 位定时器的最大值 break; - case 64: /* 64 bit timer */ - g_schedTickMaxResponseTime = OS_64BIT_MAX; + case 64: /* 64 位定时器 */ + g_schedTickMaxResponseTime = OS_64BIT_MAX; // 设置最大的 tick 响应时间为 64 位定时器的最大值 break; default: PRINT_ERR("Unsupported Tick Timer type, The system only supports 32 and 64 bit tick timers\n"); - return LOS_NOK; + return LOS_NOK; // 返回错误码,表示不支持该类型的定时器 } - return LOS_OK; + return LOS_OK; // 返回成功码 } +// 设置调度器的启动时间 STATIC VOID OsSchedSetStartTime(UINT64 currCycle) { if (g_sysSchedStartTime == OS_64BIT_MAX) { - g_sysSchedStartTime = currCycle; + g_sysSchedStartTime = currCycle; // 如果系统的调度启动时间未设置,则设置为当前的时钟周期数 } } +// 更新时间片 STATIC INLINE VOID OsTimeSliceUpdate(LosTaskCB *taskCB, UINT64 currTime) { - LOS_ASSERT(currTime >= taskCB->startTime); + LOS_ASSERT(currTime >= taskCB->startTime); // 断言当前时间大于等于任务的启动时间 - INT32 incTime = (currTime - taskCB->startTime - taskCB->irqUsedTime); + INT32 incTime = (currTime - taskCB->startTime - taskCB->irqUsedTime); // 计算增加的时间 - LOS_ASSERT(incTime >= 0); + LOS_ASSERT(incTime >= 0); // 断言增加的时间大于等于0 if (taskCB->policy == LOS_SCHED_RR) { - taskCB->timeSlice -= incTime; + taskCB->timeSlice -= incTime; // 更新时间片剩余时间 #ifdef LOSCFG_SCHED_DEBUG - taskCB->schedStat.timeSliceRealTime += incTime; + taskCB->schedStat.timeSliceRealTime += incTime; // 更新调度统计信息中的实际时间片使用时间 #endif } - taskCB->irqUsedTime = 0; - taskCB->startTime = currTime; + taskCB->irqUsedTime = 0; // 清零中断使用的时间 + taskCB->startTime = currTime; // 更新任务的启动时间 #ifdef LOSCFG_SCHED_DEBUG - taskCB->schedStat.allRuntime += incTime; + taskCB->schedStat.allRuntime += incTime; // 更新调度统计信息中的总运行时间 #endif } +// 重新加载 tick 定时器 STATIC INLINE VOID OsSchedTickReload(Percpu *currCpu, UINT64 nextResponseTime, UINT32 responseID, BOOL isTimeSlice) { UINT64 currTime, nextExpireTime; UINT32 usedTime; - currTime = OsGetCurrSchedTimeCycle(); + currTime = OsGetCurrSchedTimeCycle(); // 获取当前的调度时间 if (currCpu->tickStartTime != 0) { - usedTime = currTime - currCpu->tickStartTime; - currCpu->tickStartTime = 0; + usedTime = currTime - currCpu->tickStartTime; // 计算 tick 定时器已经使用的时间 + currCpu->tickStartTime = 0; // 清零 tick 定时器的启动时间 } else { usedTime = 0; } if ((nextResponseTime > usedTime) && ((nextResponseTime - usedTime) > OS_TICK_RESPONSE_PRECISION)) { - nextResponseTime -= usedTime; + nextResponseTime -= usedTime; // 减去已经使用的时间,得到下一次 tick 定时器的响应时间 } else { - nextResponseTime = OS_TICK_RESPONSE_PRECISION; + nextResponseTime = OS_TICK_RESPONSE_PRECISION; // 如果计算出的响应时间小于精度要求,设置为精度要求 } - nextExpireTime = currTime + nextResponseTime; + nextExpireTime = currTime + nextResponseTime; // 计算下一次 tick 定时器的到期时间 if (nextExpireTime >= currCpu->responseTime) { - return; + return; // 如果下一次到期时间大于等于当前的响应时间,直接返回 } if (isTimeSlice) { - /* The expiration time of the current system is the thread's slice expiration time */ - currCpu->responseID = responseID; + /* 当前系统的到期时间是线程的时间片到期时间 */ + currCpu->responseID = responseID; // 设置当前 CPU 的响应 ID } else { - currCpu->responseID = OS_INVALID_VALUE; + currCpu->responseID = OS_INVALID_VALUE; // 设置当前 CPU 的响应 ID 为无效值 } - currCpu->responseTime = nextExpireTime; - HalClockTickTimerReload(nextResponseTime); + currCpu->responseTime = nextExpireTime; // 更新当前 CPU 的响应时间 + HalClockTickTimerReload(nextResponseTime); // 重新加载 tick 定时器 #ifdef LOSCFG_SCHED_TICK_DEBUG SchedTickDebug *schedDebug = &g_schedTickDebug[ArchCurrCpuid()]; if (schedDebug->index < OS_SCHED_DEBUG_DATA_NUM) { - schedDebug->setTickCount++; + schedDebug->setTickCount++; // 更新调度 tick 调试信息中的设置 tick 数量 } #endif } + STATIC INLINE VOID OsSchedSetNextExpireTime(UINT64 startTime, UINT32 responseID, UINT64 taskEndTime, UINT32 oldResponseID) { - UINT64 nextExpireTime = OsGetNextExpireTime(startTime); - Percpu *currCpu = OsPercpuGet(); + UINT64 nextExpireTime = OsGetNextExpireTime(startTime); // 获取下一次到期时间 + Percpu *currCpu = OsPercpuGet(); // 获取当前 CPU 的数据结构指针 UINT64 nextResponseTime; BOOL isTimeSlice = FALSE; - currCpu->schedFlag &= ~INT_PEND_TICK; + currCpu->schedFlag &= ~INT_PEND_TICK; // 清除调度标志位中的中断挂起标志 + if (currCpu->responseID == oldResponseID) { - /* This time has expired, and the next time the theory has expired is infinite */ + /* 此次已经到期,下一次理论上到期的时间为无穷大 */ currCpu->responseTime = OS_SCHED_MAX_RESPONSE_TIME; } - /* The current thread's time slice has been consumed, but the current system lock task cannot - * trigger the schedule to release the CPU - */ + /* 当前线程的时间片已经消耗完,但当前系统锁定任务无法触发调度以释放 CPU */ if ((nextExpireTime > taskEndTime) && ((nextExpireTime - taskEndTime) > OS_SCHED_MINI_PERIOD)) { nextExpireTime = taskEndTime; - isTimeSlice = TRUE; + isTimeSlice = TRUE; // 设置时间片到期标志 } if ((currCpu->responseTime > nextExpireTime) && ((currCpu->responseTime - nextExpireTime) >= OS_TICK_RESPONSE_PRECISION)) { - nextResponseTime = nextExpireTime - startTime; + nextResponseTime = nextExpireTime - startTime; // 计算下一次响应时间 if (nextResponseTime > g_schedTickMaxResponseTime) { - nextResponseTime = g_schedTickMaxResponseTime; + nextResponseTime = g_schedTickMaxResponseTime; // 如果下一次响应时间超过最大响应时间,设置为最大响应时间 } } else { - /* There is no point earlier than the current expiration date */ - currCpu->tickStartTime = 0; + /* 没有比当前到期时间更早的点 */ + currCpu->tickStartTime = 0; // 清零 tick 定时器的启动时间 return; } - OsSchedTickReload(currCpu, nextResponseTime, responseID, isTimeSlice); + OsSchedTickReload(currCpu, nextResponseTime, responseID, isTimeSlice); // 重新加载 tick 定时器 } VOID OsSchedUpdateExpireTime(UINT64 startTime) { UINT64 endTime; - Percpu *cpu = OsPercpuGet(); - LosTaskCB *runTask = OsCurrTaskGet(); + Percpu *cpu = OsPercpuGet(); // 获取当前 CPU 的数据结构指针 + LosTaskCB *runTask = OsCurrTaskGet(); // 获取当前运行的任务的控制块指针 if (!OS_SCHEDULER_ACTIVE || OS_INT_ACTIVE) { - cpu->schedFlag |= INT_PEND_TICK; + cpu->schedFlag |= INT_PEND_TICK; // 如果调度器不活跃或者中断活跃,设置调度标志位中的中断挂起标志 return; } @@ -373,435 +419,423 @@ VOID OsSchedUpdateExpireTime(UINT64 startTime) LOS_SpinLock(&g_taskSpin); INT32 timeSlice = (runTask->timeSlice <= OS_TIME_SLICE_MIN) ? runTask->initTimeSlice : runTask->timeSlice; LOS_SpinUnlock(&g_taskSpin); - endTime = startTime + timeSlice; + endTime = startTime + timeSlice; // 计算任务的结束时间 } else { - endTime = OS_SCHED_MAX_RESPONSE_TIME - OS_TICK_RESPONSE_PRECISION; + endTime = OS_SCHED_MAX_RESPONSE_TIME - OS_TICK_RESPONSE_PRECISION; // 如果不是轮转调度策略,设置结束时间为最大响应时间减去精度要求 } - OsSchedSetNextExpireTime(startTime, runTask->taskID, endTime, runTask->taskID); + OsSchedSetNextExpireTime(startTime, runTask->taskID, endTime, runTask->taskID); // 设置下一次到期时间 } STATIC INLINE UINT32 OsSchedCalculateTimeSlice(UINT16 proPriority, UINT16 priority) { UINT32 ratTime, readTasks; - SchedQueue *queueList = &g_sched->queueList[proPriority]; - readTasks = queueList->readyTasks[priority]; + SchedQueue *queueList = &g_sched->queueList[proPriority]; // 获取指定优先级的调度队列 + readTasks = queueList->readyTasks[priority]; // 获取指定优先级的就绪任务数量 if (readTasks > OS_SCHED_READY_MAX) { - return OS_SCHED_TIME_SLICES_MIN; + return OS_SCHED_TIME_SLICES_MIN; // 如果就绪任务数量超过最大限制,返回最小时间片 } - ratTime = ((OS_SCHED_READY_MAX - readTasks) * OS_SCHED_TIME_SLICES_DIFF) / OS_SCHED_READY_MAX; - return (ratTime + OS_SCHED_TIME_SLICES_MIN); + ratTime = ((OS_SCHED_READY_MAX - readTasks) * OS_SCHED_TIME_SLICES_DIFF) / OS_SCHED_READY_MAX; // 计算时间片 + return (ratTime + OS_SCHED_TIME_SLICES_MIN); // 返回计算出的时间片 } - STATIC INLINE VOID OsSchedPriQueueEnHead(UINT32 proPriority, LOS_DL_LIST *priqueueItem, UINT32 priority) { - SchedQueue *queueList = &g_sched->queueList[proPriority]; - LOS_DL_LIST *priQueueList = &queueList->priQueueList[0]; - UINT32 *bitMap = &queueList->queueBitmap; + SchedQueue *queueList = &g_sched->queueList[proPriority]; // 获取指定优先级的调度队列 + LOS_DL_LIST *priQueueList = &queueList->priQueueList[0]; // 获取指定优先级的优先级队列 + UINT32 *bitMap = &queueList->queueBitmap; // 获取位图 /* - * Task control blocks are inited as zero. And when task is deleted, - * and at the same time would be deleted from priority queue or - * other lists, task pend node will restored as zero. + * 任务控制块被初始化为零。当任务被删除时, + * 同时从优先级队列或其他列表中删除,任务挂起节点将被恢复为零。 */ - LOS_ASSERT(priqueueItem->pstNext == NULL); + LOS_ASSERT(priqueueItem->pstNext == NULL); // 断言优先级队列项的下一个节点为空 if (*bitMap == 0) { - g_sched->queueBitmap |= PRIQUEUE_PRIOR0_BIT >> proPriority; + g_sched->queueBitmap |= PRIQUEUE_PRIOR0_BIT >> proPriority; // 如果位图为零,设置全局位图中对应的位 } if (LOS_ListEmpty(&priQueueList[priority])) { - *bitMap |= PRIQUEUE_PRIOR0_BIT >> priority; + *bitMap |= PRIQUEUE_PRIOR0_BIT >> priority; // 如果指定优先级的优先级队列为空,设置位图中对应的位 } - LOS_ListHeadInsert(&priQueueList[priority], priqueueItem); - queueList->readyTasks[priority]++; + LOS_ListHeadInsert(&priQueueList[priority], priqueueItem); // 将优先级队列项插入到指定优先级的队列头部 + queueList->readyTasks[priority]++; // 增加指定优先级的就绪任务数量 } STATIC INLINE VOID OsSchedPriQueueEnTail(UINT32 proPriority, LOS_DL_LIST *priqueueItem, UINT32 priority) { - SchedQueue *queueList = &g_sched->queueList[proPriority]; - LOS_DL_LIST *priQueueList = &queueList->priQueueList[0]; - UINT32 *bitMap = &queueList->queueBitmap; + SchedQueue *queueList = &g_sched->queueList[proPriority]; // 获取指定优先级的调度队列 + LOS_DL_LIST *priQueueList = &queueList->priQueueList[0]; // 获取指定优先级的优先级队列 + UINT32 *bitMap = &queueList->queueBitmap; // 获取位图 /* - * Task control blocks are inited as zero. And when task is deleted, - * and at the same time would be deleted from priority queue or - * other lists, task pend node will restored as zero. + * 任务控制块被初始化为零。当任务被删除时, + * 同时从优先级队列或其他列表中删除,任务挂起节点将被恢复为零。 */ - LOS_ASSERT(priqueueItem->pstNext == NULL); + LOS_ASSERT(priqueueItem->pstNext == NULL); // 断言优先级队列项的下一个节点为空 if (*bitMap == 0) { - g_sched->queueBitmap |= PRIQUEUE_PRIOR0_BIT >> proPriority; + g_sched->queueBitmap |= PRIQUEUE_PRIOR0_BIT >> proPriority; // 如果位图为零,设置全局位图中对应的位 } if (LOS_ListEmpty(&priQueueList[priority])) { - *bitMap |= PRIQUEUE_PRIOR0_BIT >> priority; + *bitMap |= PRIQUEUE_PRIOR0_BIT >> priority; // 如果指定优先级的优先级队列为空,设置位图中对应的位 } - LOS_ListTailInsert(&priQueueList[priority], priqueueItem); - queueList->readyTasks[priority]++; + LOS_ListTailInsert(&priQueueList[priority], priqueueItem); // 将优先级队列项插入到指定优先级的队列尾部 + queueList->readyTasks[priority]++; // 增加指定优先级的就绪任务数量 } STATIC INLINE VOID OsSchedPriQueueDelete(UINT32 proPriority, LOS_DL_LIST *priqueueItem, UINT32 priority) { - SchedQueue *queueList = &g_sched->queueList[proPriority]; - LOS_DL_LIST *priQueueList = &queueList->priQueueList[0]; - UINT32 *bitMap = &queueList->queueBitmap; + SchedQueue *queueList = &g_sched->queueList[proPriority]; // 获取指定优先级的调度队列 + LOS_DL_LIST *priQueueList = &queueList->priQueueList[0]; // 获取指定优先级的优先级队列 + UINT32 *bitMap = &queueList->queueBitmap; // 获取位图 - LOS_ListDelete(priqueueItem); - queueList->readyTasks[priority]--; + LOS_ListDelete(priqueueItem); // 从优先级队列中删除优先级队列项 + queueList->readyTasks[priority]--; // 减少指定优先级的就绪任务数量 if (LOS_ListEmpty(&priQueueList[priority])) { - *bitMap &= ~(PRIQUEUE_PRIOR0_BIT >> priority); + *bitMap &= ~(PRIQUEUE_PRIOR0_BIT >> priority); // 如果指定优先级的优先级队列为空,清除位图中对应的位 } if (*bitMap == 0) { - g_sched->queueBitmap &= ~(PRIQUEUE_PRIOR0_BIT >> proPriority); + g_sched->queueBitmap &= ~(PRIQUEUE_PRIOR0_BIT >> proPriority); // 如果位图为零,清除全局位图中对应的位 } } - STATIC INLINE VOID OsSchedWakePendTimeTask(UINT64 currTime, LosTaskCB *taskCB, BOOL *needSchedule) { #ifndef LOSCFG_SCHED_DEBUG (VOID)currTime; #endif - LOS_SpinLock(&g_taskSpin); - UINT16 tempStatus = taskCB->taskStatus; + LOS_SpinLock(&g_taskSpin); // 获取全局任务自旋锁 + UINT16 tempStatus = taskCB->taskStatus; // 获取任务的状态 if (tempStatus & (OS_TASK_STATUS_PENDING | OS_TASK_STATUS_DELAY)) { - taskCB->taskStatus &= ~(OS_TASK_STATUS_PENDING | OS_TASK_STATUS_PEND_TIME | OS_TASK_STATUS_DELAY); + taskCB->taskStatus &= ~(OS_TASK_STATUS_PENDING | OS_TASK_STATUS_PEND_TIME | OS_TASK_STATUS_DELAY); // 清除任务的挂起状态和延时状态 if (tempStatus & OS_TASK_STATUS_PENDING) { #ifdef LOSCFG_KERNEL_LITEIPC - taskCB->ipcStatus &= ~IPC_THREAD_STATUS_PEND; + taskCB->ipcStatus &= ~IPC_THREAD_STATUS_PEND; // 清除任务的轻量级 IPC 挂起状态 #endif - taskCB->taskStatus |= OS_TASK_STATUS_TIMEOUT; - LOS_ListDelete(&taskCB->pendList); - taskCB->taskMux = NULL; - OsTaskWakeClearPendMask(taskCB); + taskCB->taskStatus |= OS_TASK_STATUS_TIMEOUT; // 设置任务的超时状态 + LOS_ListDelete(&taskCB->pendList); // 从挂起任务列表中删除任务 + taskCB->taskMux = NULL; // 清除任务的互斥信号量 + OsTaskWakeClearPendMask(taskCB); // 清除任务的挂起掩码 } if (!(tempStatus & OS_TASK_STATUS_SUSPENDED)) { #ifdef LOSCFG_SCHED_DEBUG - taskCB->schedStat.pendTime += currTime - taskCB->startTime; - taskCB->schedStat.pendCount++; + taskCB->schedStat.pendTime += currTime - taskCB->startTime; // 更新任务的挂起时间统计 + taskCB->schedStat.pendCount++; // 增加任务的挂起次数统计 #endif - OsSchedTaskEnQueue(taskCB); - *needSchedule = TRUE; + OsSchedTaskEnQueue(taskCB); // 将任务加入调度队列 + *needSchedule = TRUE; // 设置需要进行调度 } } - LOS_SpinUnlock(&g_taskSpin); + LOS_SpinUnlock(&g_taskSpin); // 释放全局任务自旋锁 } STATIC INLINE BOOL OsSchedScanTimerList(VOID) { - Percpu *cpu = OsPercpuGet(); - BOOL needSchedule = FALSE; - SortLinkAttribute *taskSortLink = &OsPercpuGet()->taskSortLink; - LOS_DL_LIST *listObject = &taskSortLink->sortLink; + Percpu *cpu = OsPercpuGet(); // 获取当前 CPU 的 Per-CPU 变量 + BOOL needSchedule = FALSE; // 标记是否需要进行调度 + SortLinkAttribute *taskSortLink = &OsPercpuGet()->taskSortLink; // 获取当前 CPU 的任务排序链表属性 + LOS_DL_LIST *listObject = &taskSortLink->sortLink; // 获取当前 CPU 的任务排序链表 /* - * When task is pended with timeout, the task block is on the timeout sortlink - * (per cpu) and ipc(mutex,sem and etc.)'s block at the same time, it can be waken - * up by either timeout or corresponding ipc it's waiting. + * 当任务被挂起并设置了超时时,任务块会同时存在于超时排序链表 + * (每个 CPU 都有一个) 和相应的 IPC(互斥信号量、信号量等)的链表中, + * 它可以通过超时或等待的 IPC 被唤醒。 * - * Now synchronize sortlink preocedure is used, therefore the whole task scan needs - * to be protected, preventing another core from doing sortlink deletion at same time. + * 现在使用同步的排序链表过程,因此整个任务扫描需要保护, + * 防止另一个核心同时进行排序链表的删除操作。 */ - LOS_SpinLock(&cpu->taskSortLinkSpin); + LOS_SpinLock(&cpu->taskSortLinkSpin); // 获取当前 CPU 的任务排序链表自旋锁 if (LOS_ListEmpty(listObject)) { LOS_SpinUnlock(&cpu->taskSortLinkSpin); return needSchedule; } - SortLinkList *sortList = LOS_DL_LIST_ENTRY(listObject->pstNext, SortLinkList, sortLinkNode); - UINT64 currTime = OsGetCurrSchedTimeCycle(); + SortLinkList *sortList = LOS_DL_LIST_ENTRY(listObject->pstNext, SortLinkList, sortLinkNode); // 获取排序链表的第一个任务节点 + UINT64 currTime = OsGetCurrSchedTimeCycle(); // 获取当前调度时间 while (sortList->responseTime <= currTime) { - LosTaskCB *taskCB = LOS_DL_LIST_ENTRY(sortList, LosTaskCB, sortList); - OsDeleteNodeSortLink(taskSortLink, &taskCB->sortList); - LOS_SpinUnlock(&cpu->taskSortLinkSpin); + LosTaskCB *taskCB = LOS_DL_LIST_ENTRY(sortList, LosTaskCB, sortList); // 获取任务控制块 + OsDeleteNodeSortLink(taskSortLink, &taskCB->sortList); // 从排序链表中删除任务节点 + LOS_SpinUnlock(&cpu->taskSortLinkSpin); // 释放当前 CPU 的任务排序链表自旋锁 - OsSchedWakePendTimeTask(currTime, taskCB, &needSchedule); + OsSchedWakePendTimeTask(currTime, taskCB, &needSchedule); // 唤醒被挂起的超时任务 - LOS_SpinLock(&cpu->taskSortLinkSpin); + LOS_SpinLock(&cpu->taskSortLinkSpin); // 获取当前 CPU 的任务排序链表自旋锁 if (LOS_ListEmpty(listObject)) { break; } - sortList = LOS_DL_LIST_ENTRY(listObject->pstNext, SortLinkList, sortLinkNode); + sortList = LOS_DL_LIST_ENTRY(listObject->pstNext, SortLinkList, sortLinkNode); // 获取排序链表的下一个任务节点 } - LOS_SpinUnlock(&cpu->taskSortLinkSpin); + LOS_SpinUnlock(&cpu->taskSortLinkSpin); // 释放当前 CPU 的任务排序链表自旋锁 - return needSchedule; + return needSchedule; // 返回是否需要进行调度 } - STATIC INLINE VOID OsSchedEnTaskQueue(LosTaskCB *taskCB, LosProcessCB *processCB) { - LOS_ASSERT(!(taskCB->taskStatus & OS_TASK_STATUS_READY)); + LOS_ASSERT(!(taskCB->taskStatus & OS_TASK_STATUS_READY)); // 断言任务不处于就绪状态 switch (taskCB->policy) { case LOS_SCHED_RR: { - if (taskCB->timeSlice > OS_TIME_SLICE_MIN) { - OsSchedPriQueueEnHead(processCB->priority, &taskCB->pendList, taskCB->priority); + if (taskCB->timeSlice > OS_TIME_SLICE_MIN) { // 如果时间片大于最小时间片 + OsSchedPriQueueEnHead(processCB->priority, &taskCB->pendList, taskCB->priority); // 将任务加入就绪队列的头部 } else { - taskCB->initTimeSlice = OsSchedCalculateTimeSlice(processCB->priority, taskCB->priority); - taskCB->timeSlice = taskCB->initTimeSlice; - OsSchedPriQueueEnTail(processCB->priority, &taskCB->pendList, taskCB->priority); + taskCB->initTimeSlice = OsSchedCalculateTimeSlice(processCB->priority, taskCB->priority); // 计算任务的初始时间片 + taskCB->timeSlice = taskCB->initTimeSlice; // 设置任务的时间片 + OsSchedPriQueueEnTail(processCB->priority, &taskCB->pendList, taskCB->priority); // 将任务加入就绪队列的尾部 #ifdef LOSCFG_SCHED_DEBUG - taskCB->schedStat.timeSliceTime = taskCB->schedStat.timeSliceRealTime; - taskCB->schedStat.timeSliceCount++; + taskCB->schedStat.timeSliceTime = taskCB->schedStat.timeSliceRealTime; // 更新任务的时间片统计 + taskCB->schedStat.timeSliceCount++; // 增加任务的时间片计数 #endif } break; } case LOS_SCHED_FIFO: { - /* The time slice of FIFO is always greater than 0 unless the yield is called */ - if ((taskCB->timeSlice > OS_TIME_SLICE_MIN) && (taskCB->taskStatus & OS_TASK_STATUS_RUNNING)) { - OsSchedPriQueueEnHead(processCB->priority, &taskCB->pendList, taskCB->priority); + /* FIFO 调度策略的时间片总是大于 0,除非调用了 yield */ + if ((taskCB->timeSlice > OS_TIME_SLICE_MIN) && (taskCB->taskStatus & OS_TASK_STATUS_RUNNING)) { // 如果时间片大于最小时间片且任务正在运行 + OsSchedPriQueueEnHead(processCB->priority, &taskCB->pendList, taskCB->priority); // 将任务加入就绪队列的头部 } else { - taskCB->initTimeSlice = OS_SCHED_FIFO_TIMEOUT; - taskCB->timeSlice = taskCB->initTimeSlice; - OsSchedPriQueueEnTail(processCB->priority, &taskCB->pendList, taskCB->priority); + taskCB->initTimeSlice = OS_SCHED_FIFO_TIMEOUT; // 设置任务的初始时间片为 FIFO 超时时间 + taskCB->timeSlice = taskCB->initTimeSlice; // 设置任务的时间片 + OsSchedPriQueueEnTail(processCB->priority, &taskCB->pendList, taskCB->priority); // 将任务加入就绪队列的尾部 } break; } case LOS_SCHED_IDLE: #ifdef LOSCFG_SCHED_DEBUG - taskCB->schedStat.timeSliceCount = 1; + taskCB->schedStat.timeSliceCount = 1; // 设置任务的时间片计数为 1 #endif break; default: - LOS_ASSERT(0); + LOS_ASSERT(0); // 断言不会执行到这里 break; } - taskCB->taskStatus &= ~OS_TASK_STATUS_BLOCKED; - taskCB->taskStatus |= OS_TASK_STATUS_READY; + taskCB->taskStatus &= ~OS_TASK_STATUS_BLOCKED; // 清除任务的阻塞状态 + taskCB->taskStatus |= OS_TASK_STATUS_READY; // 设置任务的就绪状态 - processCB->processStatus &= ~(OS_PROCESS_STATUS_INIT | OS_PROCESS_STATUS_PENDING); - processCB->processStatus |= OS_PROCESS_STATUS_READY; - processCB->readyTaskNum++; + processCB->processStatus &= ~(OS_PROCESS_STATUS_INIT | OS_PROCESS_STATUS_PENDING); // 清除进程的初始化和挂起状态 + processCB->processStatus |= OS_PROCESS_STATUS_READY; // 设置进程的就绪状态 + processCB->readyTaskNum++; // 增加进程的就绪任务数 } STATIC INLINE VOID OsSchedDeTaskQueue(LosTaskCB *taskCB, LosProcessCB *processCB) { - if (taskCB->policy != LOS_SCHED_IDLE) { - OsSchedPriQueueDelete(processCB->priority, &taskCB->pendList, taskCB->priority); + if (taskCB->policy != LOS_SCHED_IDLE) { // 如果任务的调度策略不是 IDLE + OsSchedPriQueueDelete(processCB->priority, &taskCB->pendList, taskCB->priority); // 从就绪队列中删除任务 } - taskCB->taskStatus &= ~OS_TASK_STATUS_READY; + taskCB->taskStatus &= ~OS_TASK_STATUS_READY; // 清除任务的就绪状态 - processCB->readyTaskNum--; + processCB->readyTaskNum--; // 减少进程的就绪任务数 if (processCB->readyTaskNum == 0) { - processCB->processStatus &= ~OS_PROCESS_STATUS_READY; + processCB->processStatus &= ~OS_PROCESS_STATUS_READY; // 如果进程的就绪任务数为 0,则清除进程的就绪状态 } } VOID OsSchedTaskDeQueue(LosTaskCB *taskCB) { - LosProcessCB *processCB = OS_PCB_FROM_PID(taskCB->processID); + LosProcessCB *processCB = OS_PCB_FROM_PID(taskCB->processID); // 获取任务所属进程的控制块 - if (taskCB->taskStatus & OS_TASK_STATUS_READY) { - OsSchedDeTaskQueue(taskCB, processCB); + if (taskCB->taskStatus & OS_TASK_STATUS_READY) { // 如果任务处于就绪状态 + OsSchedDeTaskQueue(taskCB, processCB); // 从就绪队列中删除任务 } - if (processCB->processStatus & OS_PROCESS_STATUS_READY) { + if (processCB->processStatus & OS_PROCESS_STATUS_READY) { // 如果进程处于就绪状态 return; } - /* If the current process has only the current thread running, - * the process becomes blocked after the thread leaves the scheduling queue + /* 如果当前进程只有当前线程在运行, + * 那么线程离开调度队列后进程将变为阻塞状态 */ if (OS_PROCESS_GET_RUNTASK_COUNT(processCB->processStatus) == 1) { - processCB->processStatus |= OS_PROCESS_STATUS_PENDING; + processCB->processStatus |= OS_PROCESS_STATUS_PENDING; // 设置进程的挂起状态 } } VOID OsSchedTaskEnQueue(LosTaskCB *taskCB) { - LosProcessCB *processCB = OS_PCB_FROM_PID(taskCB->processID); + LosProcessCB *processCB = OS_PCB_FROM_PID(taskCB->processID); // 获取任务所属进程的控制块 #ifdef LOSCFG_SCHED_DEBUG - if (!(taskCB->taskStatus & OS_TASK_STATUS_RUNNING)) { - taskCB->startTime = OsGetCurrSchedTimeCycle(); + if (!(taskCB->taskStatus & OS_TASK_STATUS_RUNNING)) { // 如果任务不是正在运行状态 + taskCB->startTime = OsGetCurrSchedTimeCycle(); // 记录任务的启动时间 } #endif - OsSchedEnTaskQueue(taskCB, processCB); + OsSchedEnTaskQueue(taskCB, processCB); // 将任务加入就绪队列 } VOID OsSchedTaskExit(LosTaskCB *taskCB) { - LosProcessCB *processCB = OS_PCB_FROM_PID(taskCB->processID); + LosProcessCB *processCB = OS_PCB_FROM_PID(taskCB->processID); // 获取任务所属进程的控制块 - if (taskCB->taskStatus & OS_TASK_STATUS_READY) { - OsSchedTaskDeQueue(taskCB); - processCB->processStatus &= ~OS_PROCESS_STATUS_PENDING; - } else if (taskCB->taskStatus & OS_TASK_STATUS_PENDING) { - LOS_ListDelete(&taskCB->pendList); - taskCB->taskStatus &= ~OS_TASK_STATUS_PENDING; + if (taskCB->taskStatus & OS_TASK_STATUS_READY) { // 如果任务处于就绪状态 + OsSchedTaskDeQueue(taskCB); // 从就绪队列中删除任务 + processCB->processStatus &= ~OS_PROCESS_STATUS_PENDING; // 清除进程的挂起状态 + } else if (taskCB->taskStatus & OS_TASK_STATUS_PENDING) { // 如果任务处于挂起状态 + LOS_ListDelete(&taskCB->pendList); // 从挂起队列中删除任务 + taskCB->taskStatus &= ~OS_TASK_STATUS_PENDING; // 清除任务的挂起状态 } - if (taskCB->taskStatus & (OS_TASK_STATUS_DELAY | OS_TASK_STATUS_PEND_TIME)) { - OsDeleteSortLink(&taskCB->sortList, OS_SORT_LINK_TASK); - taskCB->taskStatus &= ~(OS_TASK_STATUS_DELAY | OS_TASK_STATUS_PEND_TIME); + if (taskCB->taskStatus & (OS_TASK_STATUS_DELAY | OS_TASK_STATUS_PEND_TIME)) { // 如果任务处于延时或等待定时状态 + OsDeleteSortLink(&taskCB->sortList, OS_SORT_LINK_TASK); // 从排序链表中删除任务 + taskCB->taskStatus &= ~(OS_TASK_STATUS_DELAY | OS_TASK_STATUS_PEND_TIME); // 清除任务的延时和等待定时状态 } } VOID OsSchedYield(VOID) { - LosTaskCB *runTask = OsCurrTaskGet(); + LosTaskCB *runTask = OsCurrTaskGet(); // 获取当前运行的任务 - runTask->timeSlice = 0; + runTask->timeSlice = 0; // 将任务的时间片设置为 0 - runTask->startTime = OsGetCurrSchedTimeCycle(); - OsSchedTaskEnQueue(runTask); - OsSchedResched(); + runTask->startTime = OsGetCurrSchedTimeCycle(); // 记录任务的启动时间 + OsSchedTaskEnQueue(runTask); // 将任务加入就绪队列 + OsSchedResched(); // 进行调度 } VOID OsSchedDelay(LosTaskCB *runTask, UINT32 tick) { - OsSchedTaskDeQueue(runTask); - runTask->taskStatus |= OS_TASK_STATUS_DELAY; - runTask->waitTimes = tick; + OsSchedTaskDeQueue(runTask); // 从就绪队列中删除任务 + runTask->taskStatus |= OS_TASK_STATUS_DELAY; // 设置任务的延时状态 + runTask->waitTimes = tick; // 设置任务的等待时间 - OsSchedResched(); + OsSchedResched(); // 进行调度 } UINT32 OsSchedTaskWait(LOS_DL_LIST *list, UINT32 ticks, BOOL needSched) { - LosTaskCB *runTask = OsCurrTaskGet(); - OsSchedTaskDeQueue(runTask); + LosTaskCB *runTask = OsCurrTaskGet(); // 获取当前运行的任务 + OsSchedTaskDeQueue(runTask); // 从就绪队列中删除任务 - runTask->taskStatus |= OS_TASK_STATUS_PENDING; - LOS_ListTailInsert(list, &runTask->pendList); + runTask->taskStatus |= OS_TASK_STATUS_PENDING; // 设置任务的挂起状态 + LOS_ListTailInsert(list, &runTask->pendList); // 将任务插入挂起队列的尾部 - if (ticks != LOS_WAIT_FOREVER) { - runTask->taskStatus |= OS_TASK_STATUS_PEND_TIME; - runTask->waitTimes = ticks; + if (ticks != LOS_WAIT_FOREVER) { // 如果等待时间不是永远 + runTask->taskStatus |= OS_TASK_STATUS_PEND_TIME; // 设置任务的等待定时状态 + runTask->waitTimes = ticks; // 设置任务的等待时间 } - if (needSched == TRUE) { - OsSchedResched(); - if (runTask->taskStatus & OS_TASK_STATUS_TIMEOUT) { - runTask->taskStatus &= ~OS_TASK_STATUS_TIMEOUT; - return LOS_ERRNO_TSK_TIMEOUT; + if (needSched == TRUE) { // 如果需要进行调度 + OsSchedResched(); // 进行调度 + if (runTask->taskStatus & OS_TASK_STATUS_TIMEOUT) { // 如果任务超时 + runTask->taskStatus &= ~OS_TASK_STATUS_TIMEOUT; // 清除任务的超时状态 + return LOS_ERRNO_TSK_TIMEOUT; // 返回超时错误 } } - return LOS_OK; + return LOS_OK; // 返回成功 } VOID OsSchedTaskWake(LosTaskCB *resumedTask) { - LOS_ListDelete(&resumedTask->pendList); - resumedTask->taskStatus &= ~OS_TASK_STATUS_PENDING; + LOS_ListDelete(&resumedTask->pendList); // 从挂起队列中删除任务 + resumedTask->taskStatus &= ~OS_TASK_STATUS_PENDING; // 清除任务的挂起状态 - if (resumedTask->taskStatus & OS_TASK_STATUS_PEND_TIME) { - OsDeleteSortLink(&resumedTask->sortList, OS_SORT_LINK_TASK); - resumedTask->taskStatus &= ~OS_TASK_STATUS_PEND_TIME; + if (resumedTask->taskStatus & OS_TASK_STATUS_PEND_TIME) { // 如果任务处于等待定时状态 + OsDeleteSortLink(&resumedTask->sortList, OS_SORT_LINK_TASK); // 从排序链表中删除任务 + resumedTask->taskStatus &= ~OS_TASK_STATUS_PEND_TIME; // 清除任务的等待定时状态 } - if (!(resumedTask->taskStatus & OS_TASK_STATUS_SUSPENDED)) { + if (!(resumedTask->taskStatus & OS_TASK_STATUS_SUSPENDED)) { // 如果任务没有被挂起 #ifdef LOSCFG_SCHED_DEBUG - resumedTask->schedStat.pendTime += OsGetCurrSchedTimeCycle() - resumedTask->startTime; - resumedTask->schedStat.pendCount++; -#endif - OsSchedTaskEnQueue(resumedTask); - } -} - + resumedTask->schedStat.pendTime += OsGetCurrSchedTimeCycle() - resumedTask-> BOOL OsSchedModifyTaskSchedParam(LosTaskCB *taskCB, UINT16 policy, UINT16 priority) { - if (taskCB->policy != policy) { - taskCB->policy = policy; - taskCB->timeSlice = 0; + if (taskCB->policy != policy) { // 如果任务的调度策略与传入的策略不同 + taskCB->policy = policy; // 更新任务的调度策略 + taskCB->timeSlice = 0; // 将任务的时间片设置为 0 } - if (taskCB->taskStatus & OS_TASK_STATUS_READY) { - OsSchedTaskDeQueue(taskCB); - taskCB->priority = priority; - OsSchedTaskEnQueue(taskCB); - return TRUE; + if (taskCB->taskStatus & OS_TASK_STATUS_READY) { // 如果任务处于就绪状态 + OsSchedTaskDeQueue(taskCB); // 从就绪队列中删除任务 + taskCB->priority = priority; // 更新任务的优先级 + OsSchedTaskEnQueue(taskCB); // 将任务加入就绪队列 + return TRUE; // 返回需要进行调度 } - taskCB->priority = priority; - OsHookCall(LOS_HOOK_TYPE_TASK_PRIMODIFY, taskCB, taskCB->priority); - if (taskCB->taskStatus & OS_TASK_STATUS_INIT) { - OsSchedTaskEnQueue(taskCB); - return TRUE; + taskCB->priority = priority; // 更新任务的优先级 + OsHookCall(LOS_HOOK_TYPE_TASK_PRIMODIFY, taskCB, taskCB->priority); // 调用任务优先级修改的钩子函数 + if (taskCB->taskStatus & OS_TASK_STATUS_INIT) { // 如果任务处于初始化状态 + OsSchedTaskEnQueue(taskCB); // 将任务加入就绪队列 + return TRUE; // 返回需要进行调度 } - if (taskCB->taskStatus & OS_TASK_STATUS_RUNNING) { - return TRUE; + if (taskCB->taskStatus & OS_TASK_STATUS_RUNNING) { // 如果任务处于运行状态 + return TRUE; // 返回需要进行调度 } - return FALSE; + return FALSE; // 返回不需要进行调度 } BOOL OsSchedModifyProcessSchedParam(LosProcessCB *processCB, UINT16 policy, UINT16 priority) { LosTaskCB *taskCB = NULL; BOOL needSched = FALSE; - (VOID)policy; + (VOID)policy; // 忽略传入的调度策略 - if (processCB->processStatus & OS_PROCESS_STATUS_READY) { + if (processCB->processStatus & OS_PROCESS_STATUS_READY) { // 如果进程处于就绪状态 LOS_DL_LIST_FOR_EACH_ENTRY(taskCB, &processCB->threadSiblingList, LosTaskCB, threadList) { - if (taskCB->taskStatus & OS_TASK_STATUS_READY) { - OsSchedPriQueueDelete(processCB->priority, &taskCB->pendList, taskCB->priority); - OsSchedPriQueueEnTail(priority, &taskCB->pendList, taskCB->priority); - needSched = TRUE; + if (taskCB->taskStatus & OS_TASK_STATUS_READY) { // 如果任务处于就绪状态 + OsSchedPriQueueDelete(processCB->priority, &taskCB->pendList, taskCB->priority); // 从优先级队列中删除任务 + OsSchedPriQueueEnTail(priority, &taskCB->pendList, taskCB->priority); // 将任务按照新的优先级插入到优先级队列中 + needSched = TRUE; // 需要进行调度 } } } - processCB->priority = priority; - if (processCB->processStatus & OS_PROCESS_STATUS_RUNNING) { - needSched = TRUE; + processCB->priority = priority; // 更新进程的优先级 + if (processCB->processStatus & OS_PROCESS_STATUS_RUNNING) { // 如果进程处于运行状态 + needSched = TRUE; // 需要进行调度 } - return needSched; + return needSched; // 返回是否需要进行调度 } VOID OsSchedTick(VOID) { - Sched *sched = g_sched; - Percpu *currCpu = OsPercpuGet(); - BOOL needSched = FALSE; - LosTaskCB *runTask = OsCurrTaskGet(); - - currCpu->tickStartTime = runTask->irqStartTime; - if (currCpu->responseID == OS_INVALID_VALUE) { - if (sched->swtmrScan != NULL) { - (VOID)sched->swtmrScan(); + Sched *sched = g_sched; // 获取全局调度器结构体指针 + Percpu *currCpu = OsPercpuGet(); // 获取当前 CPU 的私有数据结构指针 + BOOL needSched = FALSE; // 是否需要进行调度 + LosTaskCB *runTask = OsCurrTaskGet(); // 获取当前运行的任务 + + currCpu->tickStartTime = runTask->irqStartTime; // 记录当前时钟中断的开始时间 + if (currCpu->responseID == OS_INVALID_VALUE) { // 如果当前 CPU 的响应 ID 无效 + if (sched->swtmrScan != NULL) { // 如果软件定时器扫描函数不为空 + (VOID)sched->swtmrScan(); // 执行软件定时器扫描函数 } - needSched = sched->taskScan(); + needSched = sched->taskScan(); // 执行任务扫描函数,判断是否需要进行调度 - if (needSched) { - LOS_MpSchedule(OS_MP_CPU_ALL); - currCpu->schedFlag |= INT_PEND_RESCH; + if (needSched) { // 如果需要进行调度 + LOS_MpSchedule(OS_MP_CPU_ALL); // 进行多核调度 + currCpu->schedFlag |= INT_PEND_RESCH; // 设置调度标志位 } } - currCpu->schedFlag |= INT_PEND_TICK; - currCpu->responseTime = OS_SCHED_MAX_RESPONSE_TIME; + currCpu->schedFlag |= INT_PEND_TICK; // 设置时钟中断调度标志位 + currCpu->responseTime = OS_SCHED_MAX_RESPONSE_TIME; // 设置响应时间的上限 } VOID OsSchedSetIdleTaskSchedParam(LosTaskCB *idleTask) { - idleTask->policy = LOS_SCHED_IDLE; - idleTask->initTimeSlice = OS_SCHED_FIFO_TIMEOUT; - idleTask->timeSlice = idleTask->initTimeSlice; - OsSchedTaskEnQueue(idleTask); + idleTask->policy = LOS_SCHED_IDLE; // 设置空闲任务的调度策略为 LOS_SCHED_IDLE + idleTask->initTimeSlice = OS_SCHED_FIFO_TIMEOUT; // 设置空闲任务的初始时间片 + idleTask->timeSlice = idleTask->initTimeSlice; // 设置空闲任务的时间片 + OsSchedTaskEnQueue(idleTask); // 将空闲任务加入就绪队列 } - UINT32 OsSchedSwtmrScanRegister(SchedScan func) { - if (func == NULL) { - return LOS_NOK; + if (func == NULL) { // 如果传入的函数指针为空 + return LOS_NOK; // 返回失败 } - g_sched->swtmrScan = func; - return LOS_OK; + g_sched->swtmrScan = func; // 注册软件定时器扫描函数 + return LOS_OK; // 返回成功 } UINT32 OsSchedInit(VOID) @@ -809,143 +843,140 @@ UINT32 OsSchedInit(VOID) UINT16 index, pri; UINT32 ret; - g_sched = (Sched *)LOS_MemAlloc(m_aucSysMem0, sizeof(Sched)); - if (g_sched == NULL) { - return LOS_ERRNO_TSK_NO_MEMORY; + g_sched = (Sched *)LOS_MemAlloc(m_aucSysMem0, sizeof(Sched)); // 分配内存给全局调度器结构体指针 + if (g_sched == NULL) { // 如果内存分配失败 + return LOS_ERRNO_TSK_NO_MEMORY; // 返回内存不足错误 } - (VOID)memset_s(g_sched, sizeof(Sched), 0, sizeof(Sched)); + (VOID)memset_s(g_sched, sizeof(Sched), 0, sizeof(Sched)); // 将全局调度器结构体清零 - for (index = 0; index < OS_PRIORITY_QUEUE_NUM; index++) { + for (index = 0; index < OS_PRIORITY_QUEUE_NUM; index++) { // 遍历优先级队列 SchedQueue *queueList = &g_sched->queueList[index]; LOS_DL_LIST *priList = &queueList->priQueueList[0]; - for (pri = 0; pri < OS_PRIORITY_QUEUE_NUM; pri++) { - LOS_ListInit(&priList[pri]); + for (pri = 0; pri < OS_PRIORITY_QUEUE_NUM; pri++) { // 遍历每个优先级队列的优先级 + LOS_ListInit(&priList[pri]); // 初始化优先级队列 } } - for (index = 0; index < LOSCFG_KERNEL_CORE_NUM; index++) { - Percpu *cpu = OsPercpuGetByID(index); - ret = OsSortLinkInit(&cpu->taskSortLink); - if (ret != LOS_OK) { - return LOS_ERRNO_TSK_NO_MEMORY; + for (index = 0; index < LOSCFG_KERNEL_CORE_NUM; index++) { // 遍历每个 CPU 的私有数据结构 + Percpu *cpu = OsPercpuGetByID(index); // 获取当前 CPU 的私有数据结构指针 + ret = OsSortLinkInit(&cpu->taskSortLink); // 初始化任务排序链表 + if (ret != LOS_OK) { // 如果初始化失败 + return LOS_ERRNO_TSK_NO_MEMORY; // 返回内存不足错误 } - cpu->responseTime = OS_SCHED_MAX_RESPONSE_TIME; - LOS_SpinInit(&cpu->taskSortLinkSpin); - LOS_SpinInit(&cpu->swtmrSortLinkSpin); + cpu->responseTime = OS_SCHED_MAX_RESPONSE_TIME; // 设置响应时间的上限 + LOS_SpinInit(&cpu->taskSortLinkSpin); // 初始化任务排序链表的自旋锁 + LOS_SpinInit(&cpu->swtmrSortLinkSpin); // 初始化软件定时器排序链表的自旋锁 } - g_sched->taskScan = OsSchedScanTimerList; + g_sched->taskScan = OsSchedScanTimerList; // 设置任务扫描函数为默认的定时器扫描函数 #ifdef LOSCFG_SCHED_TICK_DEBUG - ret = OsSchedDebugInit(); - if (ret != LOS_OK) { - return ret; + ret = OsSchedDebugInit(); // 初始化调度器的调试功能 + if (ret != LOS_OK) { // 如果初始化失败 + return ret; // 返回错误码 } #endif - return LOS_OK; + return LOS_OK; // 返回成功 } - STATIC LosTaskCB *OsGetTopTask(VOID) { UINT32 priority, processPriority; UINT32 bitmap; LosTaskCB *newTask = NULL; - UINT32 processBitmap = g_sched->queueBitmap; + UINT32 processBitmap = g_sched->queueBitmap; // 获取全局调度器的进程位图 #ifdef LOSCFG_KERNEL_SMP - UINT32 cpuid = ArchCurrCpuid(); + UINT32 cpuid = ArchCurrCpuid(); // 获取当前 CPU 的 ID #endif - while (processBitmap) { - processPriority = CLZ(processBitmap); - SchedQueue *queueList = &g_sched->queueList[processPriority]; - bitmap = queueList->queueBitmap; - while (bitmap) { - priority = CLZ(bitmap); - LOS_DL_LIST_FOR_EACH_ENTRY(newTask, &queueList->priQueueList[priority], LosTaskCB, pendList) { + while (processBitmap) { // 遍历进程位图 + processPriority = CLZ(processBitmap); // 获取最高优先级的进程 + SchedQueue *queueList = &g_sched->queueList[processPriority]; // 获取对应优先级的队列 + bitmap = queueList->queueBitmap; // 获取优先级队列的位图 + while (bitmap) { // 遍历优先级队列的位图 + priority = CLZ(bitmap); // 获取最高优先级的任务 + LOS_DL_LIST_FOR_EACH_ENTRY(newTask, &queueList->priQueueList[priority], LosTaskCB, pendList) { #ifdef LOSCFG_KERNEL_SMP - if (newTask->cpuAffiMask & (1U << cpuid)) { + if (newTask->cpuAffiMask & (1U << cpuid)) { // 如果任务可以在当前 CPU 上运行 #endif - goto FIND_TASK; + goto FIND_TASK; // 跳转到找到任务的位置 #ifdef LOSCFG_KERNEL_SMP - } -#endif } - bitmap &= ~(1U << (OS_PRIORITY_QUEUE_NUM - priority - 1)); +#endif + } + bitmap &= ~(1U << (OS_PRIORITY_QUEUE_NUM - priority - 1)); // 清除已经遍历过的位 } - processBitmap &= ~(1U << (OS_PRIORITY_QUEUE_NUM - processPriority - 1)); + processBitmap &= ~(1U << (OS_PRIORITY_QUEUE_NUM - processPriority - 1)); // 清除已经遍历过的位 } - newTask = OS_TCB_FROM_TID(OsPercpuGet()->idleTaskID); + newTask = OS_TCB_FROM_TID(OsPercpuGet()->idleTaskID); // 如果没有找到任务,则返回空闲任务 FIND_TASK: - OsSchedDeTaskQueue(newTask, OS_PCB_FROM_PID(newTask->processID)); - return newTask; + OsSchedDeTaskQueue(newTask, OS_PCB_FROM_PID(newTask->processID)); // 从任务队列中删除任务 + return newTask; // 返回找到的任务 } - VOID OsSchedStart(VOID) { - UINT32 cpuid = ArchCurrCpuid(); + UINT32 cpuid = ArchCurrCpuid(); // 获取当前 CPU 的 ID UINT32 intSave; - SCHEDULER_LOCK(intSave); + SCHEDULER_LOCK(intSave); // 锁住调度器 - if (cpuid == 0) { - OsTickStart(); + if (cpuid == 0) { // 如果是第一个 CPU + OsTickStart(); // 启动系统时钟中断 } - LosTaskCB *newTask = OsGetTopTask(); - LosProcessCB *newProcess = OS_PCB_FROM_PID(newTask->processID); + LosTaskCB *newTask = OsGetTopTask(); // 获取要运行的任务 + LosProcessCB *newProcess = OS_PCB_FROM_PID(newTask->processID); // 获取任务所属的进程 - newTask->taskStatus |= OS_TASK_STATUS_RUNNING; - newProcess->processStatus |= OS_PROCESS_STATUS_RUNNING; - newProcess->processStatus = OS_PROCESS_RUNTASK_COUNT_ADD(newProcess->processStatus); + newTask->taskStatus |= OS_TASK_STATUS_RUNNING; // 设置任务状态为运行中 + newProcess->processStatus |= OS_PROCESS_STATUS_RUNNING; // 设置进程状态为运行中 + newProcess->processStatus = OS_PROCESS_RUNTASK_COUNT_ADD(newProcess->processStatus); // 增加进程的运行任务计数 - OsSchedSetStartTime(HalClockGetCycles()); - newTask->startTime = OsGetCurrSchedTimeCycle(); + OsSchedSetStartTime(HalClockGetCycles()); // 设置调度器的起始时间 + newTask->startTime = OsGetCurrSchedTimeCycle(); // 设置任务的起始时间 #ifdef LOSCFG_KERNEL_SMP /* * attention: current cpu needs to be set, in case first task deletion * may fail because this flag mismatch with the real current cpu. */ - newTask->currCpu = cpuid; + newTask->currCpu = cpuid; // 设置任务所在的 CPU #endif - OsCurrTaskSet((VOID *)newTask); + OsCurrTaskSet((VOID *)newTask); // 设置当前任务 /* System start schedule */ - OS_SCHEDULER_SET(cpuid); + OS_SCHEDULER_SET(cpuid); // 设置调度器标志,表示系统已经开始调度 - OsPercpuGet()->responseID = OS_INVALID; - OsSchedSetNextExpireTime(newTask->startTime, newTask->taskID, newTask->startTime + newTask->timeSlice, OS_INVALID); + OsPercpuGet()->responseID = OS_INVALID; // 初始化响应 ID + OsSchedSetNextExpireTime(newTask->startTime, newTask->taskID, newTask->startTime + newTask->timeSlice, OS_INVALID); // 设置下一个任务的到期时间 - PRINTK("cpu %d entering scheduler\n", cpuid); - OsTaskContextLoad(newTask); + PRINTK("cpu %d entering scheduler\n", cpuid); // 打印进入调度器的消息 + OsTaskContextLoad(newTask); // 加载任务上下文并开始执行任务 } #ifdef LOSCFG_KERNEL_SMP VOID OsSchedToUserReleaseLock(VOID) { /* The scheduling lock needs to be released before returning to user mode */ - LOCKDEP_CHECK_OUT(&g_taskSpin); - ArchSpinUnlock(&g_taskSpin.rawLock); + LOCKDEP_CHECK_OUT(&g_taskSpin); // 检查任务自旋锁是否正确释放 + ArchSpinUnlock(&g_taskSpin.rawLock); // 解锁任务自旋锁 - OsPercpuGet()->taskLockCnt--; + OsPercpuGet()->taskLockCnt--; // 减少任务锁计数 } #endif - #ifdef LOSCFG_BASE_CORE_TSK_MONITOR STATIC VOID OsTaskStackCheck(LosTaskCB *runTask, LosTaskCB *newTask) { - if (!OS_STACK_MAGIC_CHECK(runTask->topOfStack)) { - LOS_Panic("CURRENT task ID: %s:%d stack overflow!\n", runTask->taskName, runTask->taskID); + if (!OS_STACK_MAGIC_CHECK(runTask->topOfStack)) { // 检查当前运行任务的栈是否溢出 + LOS_Panic("CURRENT task ID: %s:%d stack overflow!\n", runTask->taskName, runTask->taskID); // 如果溢出,触发异常并打印错误信息 } if (((UINTPTR)(newTask->stackPointer) <= newTask->topOfStack) || - ((UINTPTR)(newTask->stackPointer) > (newTask->topOfStack + newTask->stackSize))) { + ((UINTPTR)(newTask->stackPointer) > (newTask->topOfStack + newTask->stackSize))) { // 检查新任务的栈指针是否合法 LOS_Panic("HIGHEST task ID: %s:%u SP error! StackPointer: %p TopOfStack: %p\n", - newTask->taskName, newTask->taskID, newTask->stackPointer, newTask->topOfStack); + newTask->taskName, newTask->taskID, newTask->stackPointer, newTask->topOfStack); // 如果不合法,触发异常并打印错误信息 } } #endif @@ -953,178 +984,190 @@ STATIC VOID OsTaskStackCheck(LosTaskCB *runTask, LosTaskCB *newTask) STATIC INLINE VOID OsSchedSwitchCheck(LosTaskCB *runTask, LosTaskCB *newTask) { #ifdef LOSCFG_BASE_CORE_TSK_MONITOR - OsTaskStackCheck(runTask, newTask); + OsTaskStackCheck(runTask, newTask); // 检查任务栈的合法性 #endif /* LOSCFG_BASE_CORE_TSK_MONITOR */ - OsHookCall(LOS_HOOK_TYPE_TASK_SWITCHEDIN, newTask, runTask); + OsHookCall(LOS_HOOK_TYPE_TASK_SWITCHEDIN, newTask, runTask); // 调用任务切换回调函数 } STATIC INLINE VOID OsSchedSwitchProcess(LosProcessCB *runProcess, LosProcessCB *newProcess) { - runProcess->processStatus = OS_PROCESS_RUNTASK_COUNT_DEC(runProcess->processStatus); - newProcess->processStatus = OS_PROCESS_RUNTASK_COUNT_ADD(newProcess->processStatus); + runProcess->processStatus = OS_PROCESS_RUNTASK_COUNT_DEC(runProcess->processStatus); // 减少当前进程的运行任务计数 + newProcess->processStatus = OS_PROCESS_RUNTASK_COUNT_ADD(newProcess->processStatus); // 增加新进程的运行任务计数 - LOS_ASSERT(!(OS_PROCESS_GET_RUNTASK_COUNT(newProcess->processStatus) > LOSCFG_KERNEL_CORE_NUM)); - if (OS_PROCESS_GET_RUNTASK_COUNT(runProcess->processStatus) == 0) { - runProcess->processStatus &= ~OS_PROCESS_STATUS_RUNNING; + LOS_ASSERT(!(OS_PROCESS_GET_RUNTASK_COUNT(newProcess->processStatus) > LOSCFG_KERNEL_CORE_NUM)); // 断言新进程的运行任务计数不超过 CPU 核心数 + if (OS_PROCESS_GET_RUNTASK_COUNT(runProcess->processStatus) == 0) { // 如果当前进程的运行任务计数为 0 + runProcess->processStatus &= ~OS_PROCESS_STATUS_RUNNING; // 清除当前进程的运行状态标志 } - LOS_ASSERT(!(newProcess->processStatus & OS_PROCESS_STATUS_PENDING)); - newProcess->processStatus |= OS_PROCESS_STATUS_RUNNING; + LOS_ASSERT(!(newProcess->processStatus & OS_PROCESS_STATUS_PENDING)); // 断言新进程的状态不是挂起状态 + newProcess->processStatus |= OS_PROCESS_STATUS_RUNNING; // 设置新进程的运行状态标志 #ifdef LOSCFG_KERNEL_VM - if (OsProcessIsUserMode(newProcess)) { - LOS_ArchMmuContextSwitch(&newProcess->vmSpace->archMmu); + if (OsProcessIsUserMode(newProcess)) { // 如果新进程是用户态进程 + LOS_ArchMmuContextSwitch(&newProcess->vmSpace->archMmu); // 切换内存管理单元上下文 } #endif - OsCurrProcessSet(newProcess); + OsCurrProcessSet(newProcess); // 设置当前进程为新进程 } - STATIC VOID OsSchedTaskSwicth(LosTaskCB *runTask, LosTaskCB *newTask) { UINT64 endTime; - OsSchedSwitchCheck(runTask, newTask); + OsSchedSwitchCheck(runTask, newTask); // 检查任务切换的相关条件 - runTask->taskStatus &= ~OS_TASK_STATUS_RUNNING; - newTask->taskStatus |= OS_TASK_STATUS_RUNNING; + runTask->taskStatus &= ~OS_TASK_STATUS_RUNNING; // 清除当前任务的运行状态标志 + newTask->taskStatus |= OS_TASK_STATUS_RUNNING; // 设置新任务的运行状态标志 #ifdef LOSCFG_KERNEL_SMP /* mask new running task's owner processor */ - runTask->currCpu = OS_TASK_INVALID_CPUID; - newTask->currCpu = ArchCurrCpuid(); + runTask->currCpu = OS_TASK_INVALID_CPUID; // 设置当前任务的 CPU ID 为无效值 + newTask->currCpu = ArchCurrCpuid(); // 设置新任务的 CPU ID 为当前 CPU 的 ID #endif - OsCurrTaskSet((VOID *)newTask); - LosProcessCB *newProcess = OS_PCB_FROM_PID(newTask->processID); - LosProcessCB *runProcess = OS_PCB_FROM_PID(runTask->processID); - if (runProcess != newProcess) { - OsSchedSwitchProcess(runProcess, newProcess); + OsCurrTaskSet((VOID *)newTask); // 设置当前任务为新任务 + LosProcessCB *newProcess = OS_PCB_FROM_PID(newTask->processID); // 获取新任务所属的进程 + LosProcessCB *runProcess = OS_PCB_FROM_PID(runTask->processID); // 获取当前任务所属的进程 + if (runProcess != newProcess) { // 如果当前任务和新任务所属的进程不同 + OsSchedSwitchProcess(runProcess, newProcess); // 进行进程切换 } - if (OsProcessIsUserMode(newProcess)) { - OsCurrUserTaskSet(newTask->userArea); + if (OsProcessIsUserMode(newProcess)) { // 如果新进程是用户态进程 + OsCurrUserTaskSet(newTask->userArea); // 设置当前用户态任务为新任务的用户态区域 } #ifdef LOSCFG_KERNEL_CPUP - OsCpupCycleEndStart(runTask->taskID, newTask->taskID); + OsCpupCycleEndStart(runTask->taskID, newTask->taskID); // 记录当前任务和新任务的 CPU 周期计数 #endif #ifdef LOSCFG_SCHED_DEBUG - UINT64 waitStartTime = newTask->startTime; + UINT64 waitStartTime = newTask->startTime; // 保存等待调度的起始时间 #endif if (runTask->taskStatus & OS_TASK_STATUS_READY) { /* When a thread enters the ready queue, its slice of time is updated */ - newTask->startTime = runTask->startTime; + newTask->startTime = runTask->startTime; // 如果当前任务是就绪状态,则将新任务的起始时间设置为当前任务的起始时间 } else { /* The currently running task is blocked */ - newTask->startTime = OsGetCurrSchedTimeCycle(); + newTask->startTime = OsGetCurrSchedTimeCycle(); // 如果当前任务是阻塞状态,则将新任务的起始时间设置为当前调度时间 /* The task is in a blocking state and needs to update its time slice before pend */ - OsTimeSliceUpdate(runTask, newTask->startTime); + OsTimeSliceUpdate(runTask, newTask->startTime); // 更新当前任务的时间片 if (runTask->taskStatus & (OS_TASK_STATUS_PEND_TIME | OS_TASK_STATUS_DELAY)) { - OsAdd2SortLink(&runTask->sortList, runTask->startTime, runTask->waitTimes, OS_SORT_LINK_TASK); + OsAdd2SortLink(&runTask->sortList, runTask->startTime, runTask->waitTimes, OS_SORT_LINK_TASK); // 将当前任务添加到排序链表中 } } if (newTask->policy == LOS_SCHED_RR) { - endTime = newTask->startTime + newTask->timeSlice; + endTime = newTask->startTime + newTask->timeSlice; // 如果新任务是轮转调度策略,则计算新任务的结束时间 } else { - endTime = OS_SCHED_MAX_RESPONSE_TIME - OS_TICK_RESPONSE_PRECISION; + endTime = OS_SCHED_MAX_RESPONSE_TIME - OS_TICK_RESPONSE_PRECISION; // 如果新任务不是轮转调度策略,则设置新任务的结束时间为最大响应时间 } - OsSchedSetNextExpireTime(newTask->startTime, newTask->taskID, endTime, runTask->taskID); + OsSchedSetNextExpireTime(newTask->startTime, newTask->taskID, endTime, runTask->taskID); // 设置下一个任务的到期时间 #ifdef LOSCFG_SCHED_DEBUG - newTask->schedStat.waitSchedTime += newTask->startTime - waitStartTime; - newTask->schedStat.waitSchedCount++; - runTask->schedStat.runTime = runTask->schedStat.allRuntime; - runTask->schedStat.switchCount++; + newTask->schedStat.waitSchedTime += newTask->startTime - waitStartTime; // 更新新任务的等待调度时间 + newTask->schedStat.waitSchedCount++; // 增加新任务的等待调度次数 + runTask->schedStat.runTime = runTask->schedStat.allRuntime; // 更新当前任务的运行时间 + runTask->schedStat.switchCount++; // 增加当前任务的切换次数 #endif /* do the task context switch */ - OsTaskSchedule(newTask, runTask); + OsTaskSchedule(newTask, runTask); // 进行任务上下文切换 } +//在切换任务之前,它首先调用OsSchedSwitchCheck函数来检查任务切换的相关条件。然后,它更新当前任务和新任务的运行状态标志,并进行一些其他操作,如设置当前任务、进行进程切换、设置用户态任务等。接下来,它根据任务的状态更新新任务的起始时间,并设置下一个任务的到期时间。最后,它调用OsTaskSchedule函数进行任务上下文切换。 VOID OsSchedIrqEndCheckNeedSched(VOID) { - Percpu *percpu = OsPercpuGet(); - LosTaskCB *runTask = OsCurrTaskGet(); + Percpu *percpu = OsPercpuGet(); // 获取当前 CPU 的数据结构指针 + LosTaskCB *runTask = OsCurrTaskGet(); // 获取当前运行的任务 - OsTimeSliceUpdate(runTask, OsGetCurrSchedTimeCycle()); - if (runTask->timeSlice <= OS_TIME_SLICE_MIN) { - percpu->schedFlag |= INT_PEND_RESCH; + OsTimeSliceUpdate(runTask, OsGetCurrSchedTimeCycle()); // 更新当前任务的时间片 + if (runTask->timeSlice <= OS_TIME_SLICE_MIN) { // 如果当前任务的时间片小于等于最小时间片 + percpu->schedFlag |= INT_PEND_RESCH; // 设置调度标志,表示需要进行任务切换 } - if (OsPreemptable() && (percpu->schedFlag & INT_PEND_RESCH)) { - percpu->schedFlag &= ~INT_PEND_RESCH; + if (OsPreemptable() && (percpu->schedFlag & INT_PEND_RESCH)) { // 如果可以抢占且需要进行任务切换 + percpu->schedFlag &= ~INT_PEND_RESCH; // 清除调度标志 - LOS_SpinLock(&g_taskSpin); + LOS_SpinLock(&g_taskSpin); // 获取任务自旋锁 - OsSchedTaskEnQueue(runTask); + OsSchedTaskEnQueue(runTask); // 将当前任务加入就绪队列 - LosTaskCB *newTask = OsGetTopTask(); - if (runTask != newTask) { - OsSchedTaskSwicth(runTask, newTask); - LOS_SpinUnlock(&g_taskSpin); + LosTaskCB *newTask = OsGetTopTask(); // 获取优先级最高的任务 + if (runTask != newTask) { // 如果当前任务不是优先级最高的任务 + OsSchedTaskSwicth(runTask, newTask); // 进行任务切换 + LOS_SpinUnlock(&g_taskSpin); // 释放任务自旋锁 return; } - LOS_SpinUnlock(&g_taskSpin); + LOS_SpinUnlock(&g_taskSpin); // 释放任务自旋锁 } - if (percpu->schedFlag & INT_PEND_TICK) { - OsSchedUpdateExpireTime(runTask->startTime); + if (percpu->schedFlag & INT_PEND_TICK) { // 如果有时钟中断挂起 + OsSchedUpdateExpireTime(runTask->startTime); // 更新任务的到期时间 } } VOID OsSchedResched(VOID) { - LOS_ASSERT(LOS_SpinHeld(&g_taskSpin)); + LOS_ASSERT(LOS_SpinHeld(&g_taskSpin)); // 断言任务自旋锁已持有 #ifdef LOSCFG_KERNEL_SMP - LOS_ASSERT(OsPercpuGet()->taskLockCnt == 1); + LOS_ASSERT(OsPercpuGet()->taskLockCnt == 1); // 断言任务锁计数为1 #else - LOS_ASSERT(OsPercpuGet()->taskLockCnt == 0); + LOS_ASSERT(OsPercpuGet()->taskLockCnt == 0); // 断言任务锁计数为0 #endif - OsPercpuGet()->schedFlag &= ~INT_PEND_RESCH; - LosTaskCB *runTask = OsCurrTaskGet(); - LosTaskCB *newTask = OsGetTopTask(); - if (runTask == newTask) { + OsPercpuGet()->schedFlag &= ~INT_PEND_RESCH; // 清除调度标志 + LosTaskCB *runTask = OsCurrTaskGet(); // 获取当前运行的任务 + LosTaskCB *newTask = OsGetTopTask(); // 获取优先级最高的任务 + if (runTask == newTask) { // 如果当前任务就是优先级最高的任务 return; } - OsSchedTaskSwicth(runTask, newTask); + OsSchedTaskSwicth(runTask, newTask); // 进行任务切换 } +/*这段代码实现了在中断结束时检查是否需要进行任务切换的函数OsSchedIrqEndCheckNeedSched, +以及在调度器需要重新调度时执行任务切换的函数OsSchedResched。 + +OsSchedIrqEndCheckNeedSched函数首先更新当前任务的时间片,并检查当前任务的时间片是否小于 +等于最小时间片。如果是,则设置调度标志,表示需要进行任务切换。然后,它检查是否可以抢占且 +调度标志已被设置。如果满足条件,则获取任务自旋锁,并将当前任务加入就绪队列。接下来,它获 +取优先级最高的任务,如果当前任务不是优先级最高的任务,则进行任务切换,并释放任务自旋锁。 +最后,如果有时钟中断挂起,它更新任务的到期时间。 + +OsSchedResched函数首先断言任务自旋锁已持有,并根据配置选项判断任务锁计数是否为1(SMP) +或者为0(非SMP)。然后,它清除调度标志,并获取当前运行的任务和优先级最高的任务。如果当前 +任务就是优先级最高的任务,则直接返回。否则,它进行任务切换。*/ VOID LOS_Schedule(VOID) { UINT32 intSave; - LosTaskCB *runTask = OsCurrTaskGet(); + LosTaskCB *runTask = OsCurrTaskGet(); // 获取当前运行的任务 - if (OS_INT_ACTIVE) { - OsPercpuGet()->schedFlag |= INT_PEND_RESCH; + if (OS_INT_ACTIVE) { // 如果处于中断上下文 + OsPercpuGet()->schedFlag |= INT_PEND_RESCH; // 设置调度标志,表示需要进行任务切换 return; } - if (!OsPreemptable()) { + if (!OsPreemptable()) { // 如果不允许抢占 return; } /* * trigger schedule in task will also do the slice check - * if neccessary, it will give up the timeslice more in time. - * otherwhise, there's no other side effects. + * if necessary, it will give up the timeslice more in time. + * otherwise, there's no other side effects. */ - SCHEDULER_LOCK(intSave); + SCHEDULER_LOCK(intSave); // 获取调度器锁,禁止调度器抢占 - OsTimeSliceUpdate(runTask, OsGetCurrSchedTimeCycle()); + OsTimeSliceUpdate(runTask, OsGetCurrSchedTimeCycle()); // 更新当前任务的时间片 /* add run task back to ready queue */ - OsSchedTaskEnQueue(runTask); + OsSchedTaskEnQueue(runTask); // 将当前任务加入就绪队列 /* reschedule to new thread */ - OsSchedResched(); + OsSchedResched(); // 进行任务切换 - SCHEDULER_UNLOCK(intSave); + SCHEDULER_UNLOCK(intSave); // 释放调度器锁 } STATIC INLINE LOS_DL_LIST *OsSchedLockPendFindPosSub(const LosTaskCB *runTask, const LOS_DL_LIST *lockList) @@ -1151,20 +1194,23 @@ LOS_DL_LIST *OsSchedLockPendFindPos(const LosTaskCB *runTask, LOS_DL_LIST *lockL { LOS_DL_LIST *node = NULL; - if (LOS_ListEmpty(lockList)) { + if (LOS_ListEmpty(lockList)) { // 如果锁的等待队列为空 node = lockList; } else { LosTaskCB *pendedTask1 = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(lockList)); LosTaskCB *pendedTask2 = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_LAST(lockList)); - if (pendedTask1->priority > runTask->priority) { + if (pendedTask1->priority > runTask->priority) { // 如果最高优先级的等待任务的优先级高于当前任务的优先级 node = lockList->pstNext; - } else if (pendedTask2->priority <= runTask->priority) { + } else if (pendedTask2->priority <= runTask->priority) { // 如果最低优先级的等待任务的优先级小于等于当前任务的优先级 node = lockList; } else { - node = OsSchedLockPendFindPosSub(runTask, lockList); + node = OsSchedLockPendFindPosSub(runTask, lockList); // 在等待队列中查找当前任务应该插入的位置 } } return node; } - +/*LOS_Schedule函数用于触发调度器进行任务切换。在函数中,首先判断是否处于中断上下文中, +如果是,则设置调度标志,表示需要进行任务切换,然后返回。接下来,判断当前任务是否可被抢占, +如果不可抢占,则直接返回。然后,获取调度器锁,并更新当前任务的时间片。接着,将当前任务加入就绪队列, +并调用OsSchedResched函数进行任务*/ \ No newline at end of file From eb9a4bef9785840aa5dd87640aeb0c7d01d8c956 Mon Sep 17 00:00:00 2001 From: weitong <494475907@qq.com> Date: Mon, 4 Dec 2023 20:01:27 +0800 Subject: [PATCH 08/21] weitong --- core/los_task.c | 688 +++++++++++++++++++++++++----------------------- 1 file changed, 356 insertions(+), 332 deletions(-) diff --git a/core/los_task.c b/core/los_task.c index 67b7ab6..e33ccac 100644 --- a/core/los_task.c +++ b/core/los_task.c @@ -66,34 +66,38 @@ #error "task maxnum cannot be zero" #endif /* LOSCFG_BASE_CORE_TSK_LIMIT <= 0 */ -LITE_OS_SEC_BSS LosTaskCB *g_taskCBArray; -LITE_OS_SEC_BSS LOS_DL_LIST g_losFreeTask; -LITE_OS_SEC_BSS LOS_DL_LIST g_taskRecycleList; -LITE_OS_SEC_BSS UINT32 g_taskMaxNum; -LITE_OS_SEC_BSS UINT32 g_taskScheduled; /* one bit for each cores */ -LITE_OS_SEC_BSS EVENT_CB_S g_resourceEvent; -/* spinlock for task module, only available on SMP mode */ -LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_taskSpin); - + // ȫֱ +LITE_OS_SEC_BSS LosTaskCB* g_taskCBArray; // ƿ +LITE_OS_SEC_BSS LOS_DL_LIST g_losFreeTask; // б +LITE_OS_SEC_BSS LOS_DL_LIST g_taskRecycleList; // б +LITE_OS_SEC_BSS UINT32 g_taskMaxNum; // +LITE_OS_SEC_BSS UINT32 g_taskScheduled; // ȱ־ÿһλ +LITE_OS_SEC_BSS EVENT_CB_S g_resourceEvent; // Դ¼ƿ +LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_taskSpin); // ģ + +// ú STATIC VOID OsConsoleIDSetHook(UINT32 param1, - UINT32 param2) __attribute__((weakref("OsSetConsoleID"))); + UINT32 param2) __attribute__((weakref("OsSetConsoleID"))); +// 궨 #define OS_CHECK_TASK_BLOCK (OS_TASK_STATUS_DELAY | \ OS_TASK_STATUS_PENDING | \ OS_TASK_STATUS_SUSPENDED) -/* temp task blocks for booting procedure */ +// ʱ LITE_OS_SEC_BSS STATIC LosTaskCB g_mainTask[LOSCFG_KERNEL_CORE_NUM]; -LosTaskCB *OsGetMainTask() +// ȡƿ +LosTaskCB* OsGetMainTask() { - return (LosTaskCB *)(g_mainTask + ArchCurrCpuid()); + return (LosTaskCB*)(g_mainTask + ArchCurrCpuid()); } +// ijʼ״̬ VOID OsSetMainTask() { UINT32 i; - CHAR *name = "osMain"; + CHAR* name = "osMain"; for (i = 0; i < LOSCFG_KERNEL_CORE_NUM; i++) { g_mainTask[i].taskStatus = OS_TASK_STATUS_UNUSED; @@ -111,141 +115,143 @@ VOID OsSetMainTask() LITE_OS_SEC_TEXT WEAK VOID OsIdleTask(VOID) { while (1) { - WFI; + WFI; // ȴжָڵ͹״ֱ̬յжź } } -STATIC INLINE VOID OsInsertTCBToFreeList(LosTaskCB *taskCB) +STATIC INLINE VOID OsInsertTCBToFreeList(LosTaskCB* taskCB) { UINT32 taskID = taskCB->taskID; - (VOID)memset_s(taskCB, sizeof(LosTaskCB), 0, sizeof(LosTaskCB)); + (VOID)memset_s(taskCB, sizeof(LosTaskCB), 0, sizeof(LosTaskCB)); // ƿ taskCB->taskID = taskID; - taskCB->taskStatus = OS_TASK_STATUS_UNUSED; - taskCB->processID = OS_INVALID_VALUE; - LOS_ListAdd(&g_losFreeTask, &taskCB->pendList); + taskCB->taskStatus = OS_TASK_STATUS_UNUSED; // ״̬Ϊδʹ + taskCB->processID = OS_INVALID_VALUE; // ýIDΪЧֵ + LOS_ListAdd(&g_losFreeTask, &taskCB->pendList); // ƿӵб } -LITE_OS_SEC_TEXT_INIT VOID OsTaskJoinPostUnsafe(LosTaskCB *taskCB) +LITE_OS_SEC_TEXT_INIT VOID OsTaskJoinPostUnsafe(LosTaskCB* taskCB) { - LosTaskCB *resumedTask = NULL; + LosTaskCB* resumedTask = NULL; - if (taskCB->taskStatus & OS_TASK_FLAG_PTHREAD_JOIN) { + if (taskCB->taskStatus & OS_TASK_FLAG_PTHREAD_JOIN) { // pthread_join־ if (!LOS_ListEmpty(&taskCB->joinList)) { - resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&(taskCB->joinList))); - OsTaskWakeClearPendMask(resumedTask); - OsSchedTaskWake(resumedTask); + resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&(taskCB->joinList))); // ȡһȴƿ + OsTaskWakeClearPendMask(resumedTask); // ĵȴ־ + OsSchedTaskWake(resumedTask); // ѵȴ } - taskCB->taskStatus &= ~OS_TASK_FLAG_PTHREAD_JOIN; + taskCB->taskStatus &= ~OS_TASK_FLAG_PTHREAD_JOIN; // pthread_join־ } - taskCB->taskStatus |= OS_TASK_STATUS_EXIT; + taskCB->taskStatus |= OS_TASK_STATUS_EXIT; // ״̬Ϊ˳ } -LITE_OS_SEC_TEXT UINT32 OsTaskJoinPendUnsafe(LosTaskCB *taskCB) +LITE_OS_SEC_TEXT UINT32 OsTaskJoinPendUnsafe(LosTaskCB* taskCB) { - LosProcessCB *processCB = OS_PCB_FROM_PID(taskCB->processID); - if (!(processCB->processStatus & OS_PROCESS_STATUS_RUNNING)) { - return LOS_EPERM; + LosProcessCB* processCB = OS_PCB_FROM_PID(taskCB->processID); // ȡ̵Ľ̿ƿ + if (!(processCB->processStatus & OS_PROCESS_STATUS_RUNNING)) { // ״̬״̬ + return LOS_EPERM; // ش룬ʾûȨ } - if (taskCB->taskStatus & OS_TASK_STATUS_INIT) { - return LOS_EINVAL; + if (taskCB->taskStatus & OS_TASK_STATUS_INIT) { // ״̬Ϊʼ״̬ + return LOS_EINVAL; // ش룬ʾЧ } - if ((taskCB->taskStatus & OS_TASK_FLAG_PTHREAD_JOIN) && LOS_ListEmpty(&taskCB->joinList)) { - OsTaskWaitSetPendMask(OS_TASK_WAIT_JOIN, taskCB->taskID, LOS_WAIT_FOREVER); - return OsSchedTaskWait(&taskCB->joinList, LOS_WAIT_FOREVER, TRUE); - } else if (taskCB->taskStatus & OS_TASK_STATUS_EXIT) { - return LOS_OK; + if ((taskCB->taskStatus & OS_TASK_FLAG_PTHREAD_JOIN) && LOS_ListEmpty(&taskCB->joinList)) { // pthread_join־ҵȴбΪ + OsTaskWaitSetPendMask(OS_TASK_WAIT_JOIN, taskCB->taskID, LOS_WAIT_FOREVER); // ĵȴ־ + return OsSchedTaskWait(&taskCB->joinList, LOS_WAIT_FOREVER, TRUE); // ȴ״̬ȴ + } + else if (taskCB->taskStatus & OS_TASK_STATUS_EXIT) { // ״̬Ϊ˳״̬ + return LOS_OK; // سɹ } - return LOS_EINVAL; + return LOS_EINVAL; // ش룬ʾЧ } -LITE_OS_SEC_TEXT UINT32 OsTaskSetDetachUnsafe(LosTaskCB *taskCB) +LITE_OS_SEC_TEXT UINT32 OsTaskSetDetachUnsafe(LosTaskCB* taskCB) { - LosProcessCB *processCB = OS_PCB_FROM_PID(taskCB->processID); - if (!(processCB->processStatus & OS_PROCESS_STATUS_RUNNING)) { - return LOS_EPERM; + LosProcessCB* processCB = OS_PCB_FROM_PID(taskCB->processID); // ȡ̵Ľ̿ƿ + if (!(processCB->processStatus & OS_PROCESS_STATUS_RUNNING)) { // ״̬״̬ + return LOS_EPERM; // ش룬ʾûȨ } - if (taskCB->taskStatus & OS_TASK_FLAG_PTHREAD_JOIN) { - if (LOS_ListEmpty(&(taskCB->joinList))) { - LOS_ListDelete(&(taskCB->joinList)); - taskCB->taskStatus &= ~OS_TASK_FLAG_PTHREAD_JOIN; - taskCB->taskStatus |= OS_TASK_FLAG_DETACHED; - return LOS_OK; + if (taskCB->taskStatus & OS_TASK_FLAG_PTHREAD_JOIN) { // pthread_join־ + if (LOS_ListEmpty(&(taskCB->joinList))) { // ȴбΪ + LOS_ListDelete(&(taskCB->joinList)); // ӵȴбɾ + taskCB->taskStatus &= ~OS_TASK_FLAG_PTHREAD_JOIN; // pthread_join־ + taskCB->taskStatus |= OS_TASK_FLAG_DETACHED; // Ϊ״̬ + return LOS_OK; // سɹ } /* This error code has a special purpose and is not allowed to appear again on the interface */ - return LOS_ESRCH; + return LOS_ESRCH; // ش룬ʾûҵ } - return LOS_EINVAL; + return LOS_EINVAL; // ش룬ʾЧ } + LITE_OS_SEC_TEXT_INIT UINT32 OsTaskInit(VOID) { UINT32 index; UINT32 size; UINT32 ret; - g_taskMaxNum = LOSCFG_BASE_CORE_TSK_LIMIT; - size = (g_taskMaxNum + 1) * sizeof(LosTaskCB); + g_taskMaxNum = LOSCFG_BASE_CORE_TSK_LIMIT; // ȡ + size = (g_taskMaxNum + 1) * sizeof(LosTaskCB); // ƿĴС /* * This memory is resident memory and is used to save the system resources * of task control block and will not be freed. */ - g_taskCBArray = (LosTaskCB *)LOS_MemAlloc(m_aucSysMem0, size); + g_taskCBArray = (LosTaskCB*)LOS_MemAlloc(m_aucSysMem0, size); // ƿڴ if (g_taskCBArray == NULL) { - ret = LOS_ERRNO_TSK_NO_MEMORY; + ret = LOS_ERRNO_TSK_NO_MEMORY; // ڴʧܣش goto EXIT; } - (VOID)memset_s(g_taskCBArray, size, 0, size); + (VOID)memset_s(g_taskCBArray, size, 0, size); // ƿڴ - LOS_ListInit(&g_losFreeTask); - LOS_ListInit(&g_taskRecycleList); + LOS_ListInit(&g_losFreeTask); // ʼб + LOS_ListInit(&g_taskRecycleList); // ʼб for (index = 0; index < g_taskMaxNum; index++) { - g_taskCBArray[index].taskStatus = OS_TASK_STATUS_UNUSED; - g_taskCBArray[index].taskID = index; - LOS_ListTailInsert(&g_losFreeTask, &g_taskCBArray[index].pendList); + g_taskCBArray[index].taskStatus = OS_TASK_STATUS_UNUSED; // ״̬Ϊδʹ + g_taskCBArray[index].taskID = index; // ID + LOS_ListTailInsert(&g_losFreeTask, &g_taskCBArray[index].pendList); // ƿӵб } - ret = OsSchedInit(); + ret = OsSchedInit(); // ʼ EXIT: if (ret != LOS_OK) { - PRINT_ERR("OsTaskInit error\n"); + PRINT_ERR("OsTaskInit error\n"); // ӡϢ } - return ret; + return ret; // سʼ } UINT32 OsGetIdleTaskId(VOID) { - Percpu *perCpu = OsPercpuGet(); - return perCpu->idleTaskID; + Percpu* perCpu = OsPercpuGet(); // ȡǰCPU˽ + return perCpu->idleTaskID; // ؿID } LITE_OS_SEC_TEXT_INIT UINT32 OsIdleTaskCreate(VOID) { UINT32 ret; TSK_INIT_PARAM_S taskInitParam; - Percpu *perCpu = OsPercpuGet(); - UINT32 *idleTaskID = &perCpu->idleTaskID; - - (VOID)memset_s((VOID *)(&taskInitParam), sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S)); - taskInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)OsIdleTask; - taskInitParam.uwStackSize = LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE; - taskInitParam.pcName = "Idle"; - taskInitParam.usTaskPrio = OS_TASK_PRIORITY_LOWEST; - taskInitParam.processID = OsGetIdleProcessID(); + Percpu* perCpu = OsPercpuGet(); // ȡǰCPU˽ + UINT32* idleTaskID = &perCpu->idleTaskID; // ȡID + + (VOID)memset_s((VOID*)(&taskInitParam), sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S)); // ʼṹ + taskInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)OsIdleTask; // ںΪOsIdleTask + taskInitParam.uwStackSize = LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE; // ջС + taskInitParam.pcName = "Idle"; // + taskInitParam.usTaskPrio = OS_TASK_PRIORITY_LOWEST; // ȼΪȼ + taskInitParam.processID = OsGetIdleProcessID(); // ȡ̵ID #ifdef LOSCFG_KERNEL_SMP - taskInitParam.usCpuAffiMask = CPUID_TO_AFFI_MASK(ArchCurrCpuid()); + taskInitParam.usCpuAffiMask = CPUID_TO_AFFI_MASK(ArchCurrCpuid()); // CPU׺ #endif - ret = LOS_TaskCreateOnly(idleTaskID, &taskInitParam); - LosTaskCB *idleTask = OS_TCB_FROM_TID(*idleTaskID); - idleTask->taskStatus |= OS_TASK_FLAG_SYSTEM_TASK; - OsSchedSetIdleTaskSchedParam(idleTask); + ret = LOS_TaskCreateOnly(idleTaskID, &taskInitParam); // + LosTaskCB* idleTask = OS_TCB_FROM_TID(*idleTaskID); // ȡƿ + idleTask->taskStatus |= OS_TASK_FLAG_SYSTEM_TASK; // ÿı־Ϊϵͳ + OsSchedSetIdleTaskSchedParam(idleTask); // ÿĵȲ - return ret; + return ret; // ش } /* @@ -254,167 +260,169 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsIdleTaskCreate(VOID) */ LITE_OS_SEC_TEXT UINT32 LOS_CurTaskIDGet(VOID) { - LosTaskCB *runTask = OsCurrTaskGet(); + LosTaskCB* runTask = OsCurrTaskGet(); // ȡǰеƿ if (runTask == NULL) { - return LOS_ERRNO_TSK_ID_INVALID; + return LOS_ERRNO_TSK_ID_INVALID; // ȡƿΪգش } - return runTask->taskID; + return runTask->taskID; // صǰID } -LITE_OS_SEC_TEXT VOID OsTaskToExit(LosTaskCB *taskCB, UINT32 status) +LITE_OS_SEC_TEXT VOID OsTaskToExit(LosTaskCB* taskCB, UINT32 status) { UINT32 intSave; - LosProcessCB *runProcess = OS_PCB_FROM_PID(taskCB->processID); - LosTaskCB *mainTask = OS_TCB_FROM_TID(runProcess->threadGroupID); + LosProcessCB* runProcess = OS_PCB_FROM_PID(taskCB->processID); // ȡ̵Ľ̿ƿ + LosTaskCB* mainTask = OS_TCB_FROM_TID(runProcess->threadGroupID); // ȡ̵߳ƿ if (mainTask == taskCB) { - OsTaskExitGroup(status); + OsTaskExitGroup(status); // ǽ̵̣߳˳ } - SCHEDULER_LOCK(intSave); + SCHEDULER_LOCK(intSave); // if (runProcess->threadNumber == 1) { /* 1: The last task of the process exits */ - SCHEDULER_UNLOCK(intSave); - (VOID)OsProcessExit(taskCB, status); + SCHEDULER_UNLOCK(intSave); // + (VOID)OsProcessExit(taskCB, status); // һ˳ʱý˳ return; } /* The thread being killed must be able to exit automatically and will have the detached property */ - OsTaskJoinPostUnsafe(taskCB); + OsTaskJoinPostUnsafe(taskCB); // ɱ߳ΪԶ˳з if (taskCB->taskStatus & (OS_TASK_FLAG_DETACHED | OS_TASK_FLAG_EXIT_KILL)) { - UINT32 ret = OsTaskDeleteUnsafe(taskCB, status, intSave); - LOS_Panic("Task delete failed! ERROR : 0x%x\n", ret); + UINT32 ret = OsTaskDeleteUnsafe(taskCB, status, intSave); // зԻ򱻱Ϊ˳ɱ״̬ɾ + LOS_Panic("Task delete failed! ERROR : 0x%x\n", ret); // ɾʧܣӡϢ } - OsSchedResched(); - SCHEDULER_UNLOCK(intSave); + OsSchedResched(); // µ + SCHEDULER_UNLOCK(intSave); // return; } + /* * Description : All task entry * Input : taskID --- The ID of the task to be run */ LITE_OS_SEC_TEXT_INIT VOID OsTaskEntry(UINT32 taskID) { - LosTaskCB *taskCB = NULL; + LosTaskCB* taskCB = NULL; - LOS_ASSERT(!OS_TID_CHECK_INVALID(taskID)); + LOS_ASSERT(!OS_TID_CHECK_INVALID(taskID)); // IDЧ /* * task scheduler needs to be protected throughout the whole process * from interrupt and other cores. release task spinlock and enable * interrupt in sequence at the task entry. */ - LOS_SpinUnlock(&g_taskSpin); - (VOID)LOS_IntUnLock(); + LOS_SpinUnlock(&g_taskSpin); // ͷ + (VOID)LOS_IntUnLock(); // ж - taskCB = OS_TCB_FROM_TID(taskID); + taskCB = OS_TCB_FROM_TID(taskID); // IDȡƿ taskCB->joinRetval = taskCB->taskEntry(taskCB->args[0], taskCB->args[1], - taskCB->args[2], taskCB->args[3]); /* 2 & 3: just for args array index */ + taskCB->args[2], taskCB->args[3]); /* 2 & 3: just for args array index */ if (taskCB->taskStatus & OS_TASK_FLAG_DETACHED) { taskCB->joinRetval = 0; } - OsTaskToExit(taskCB, 0); + OsTaskToExit(taskCB, 0); // ִϺ˳ } -LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsTaskCreateParamCheck(const UINT32 *taskID, - TSK_INIT_PARAM_S *initParam, VOID **pool) +LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsTaskCreateParamCheck(const UINT32* taskID, + TSK_INIT_PARAM_S* initParam, VOID** pool) { - LosProcessCB *process = NULL; + LosProcessCB* process = NULL; UINT32 poolSize = OS_SYS_MEM_SIZE; - *pool = (VOID *)m_aucSysMem1; + *pool = (VOID*)m_aucSysMem1; if (taskID == NULL) { - return LOS_ERRNO_TSK_ID_INVALID; + return LOS_ERRNO_TSK_ID_INVALID; // IDЧ } if (initParam == NULL) { - return LOS_ERRNO_TSK_PTR_NULL; + return LOS_ERRNO_TSK_PTR_NULL; // ʼΪ } - process = OS_PCB_FROM_PID(initParam->processID); + process = OS_PCB_FROM_PID(initParam->processID); // ݽIDȡ̿ƿ if (process->processMode > OS_USER_MODE) { - return LOS_ERRNO_TSK_ID_INVALID; + return LOS_ERRNO_TSK_ID_INVALID; // ģʽЧ } if (!OsProcessIsUserMode(process)) { if (initParam->pcName == NULL) { - return LOS_ERRNO_TSK_NAME_EMPTY; + return LOS_ERRNO_TSK_NAME_EMPTY; // Ϊ } } if (initParam->pfnTaskEntry == NULL) { - return LOS_ERRNO_TSK_ENTRY_NULL; + return LOS_ERRNO_TSK_ENTRY_NULL; // ںΪ } if (initParam->usTaskPrio > OS_TASK_PRIORITY_LOWEST) { - return LOS_ERRNO_TSK_PRIOR_ERROR; + return LOS_ERRNO_TSK_PRIOR_ERROR; // ȼ } if (initParam->uwStackSize > poolSize) { - return LOS_ERRNO_TSK_STKSZ_TOO_LARGE; + return LOS_ERRNO_TSK_STKSZ_TOO_LARGE; // ջС } if (initParam->uwStackSize == 0) { - initParam->uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE; + initParam->uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE; // ջСΪ0ΪĬϴС } - initParam->uwStackSize = (UINT32)ALIGN(initParam->uwStackSize, LOSCFG_STACK_POINT_ALIGN_SIZE); + initParam->uwStackSize = (UINT32)ALIGN(initParam->uwStackSize, LOSCFG_STACK_POINT_ALIGN_SIZE); // ջСж if (initParam->uwStackSize < LOS_TASK_MIN_STACK_SIZE) { - return LOS_ERRNO_TSK_STKSZ_TOO_SMALL; + return LOS_ERRNO_TSK_STKSZ_TOO_SMALL; // ջСС } - return LOS_OK; + return LOS_OK; // ͨ } -LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskStackAlloc(VOID **topStack, UINT32 stackSize, VOID *pool) +LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskStackAlloc(VOID** topStack, UINT32 stackSize, VOID* pool) { - *topStack = (VOID *)LOS_MemAllocAlign(pool, stackSize, LOSCFG_STACK_POINT_ALIGN_SIZE); + *topStack = (VOID*)LOS_MemAllocAlign(pool, stackSize, LOSCFG_STACK_POINT_ALIGN_SIZE); // ջڴ } -STATIC INLINE UINT32 OsTaskSyncCreate(LosTaskCB *taskCB) +STATIC INLINE UINT32 OsTaskSyncCreate(LosTaskCB* taskCB) { #ifdef LOSCFG_KERNEL_SMP_TASK_SYNC - UINT32 ret = LOS_SemCreate(0, &taskCB->syncSignal); + UINT32 ret = LOS_SemCreate(0, &taskCB->syncSignal); // ͬź if (ret != LOS_OK) { - return LOS_ERRNO_TSK_MP_SYNC_RESOURCE; + return LOS_ERRNO_TSK_MP_SYNC_RESOURCE; // ͬԴʧ } #else (VOID)taskCB; #endif - return LOS_OK; + return LOS_OK; // ͬɹ } STATIC INLINE VOID OsTaskSyncDestroy(UINT32 syncSignal) { #ifdef LOSCFG_KERNEL_SMP_TASK_SYNC - (VOID)LOS_SemDelete(syncSignal); + (VOID)LOS_SemDelete(syncSignal); // ɾͬź #else (VOID)syncSignal; #endif } -LITE_OS_SEC_TEXT UINT32 OsTaskSyncWait(const LosTaskCB *taskCB) + +LITE_OS_SEC_TEXT UINT32 OsTaskSyncWait(const LosTaskCB* taskCB) { #ifdef LOSCFG_KERNEL_SMP_TASK_SYNC UINT32 ret = LOS_OK; - LOS_ASSERT(LOS_SpinHeld(&g_taskSpin)); - LOS_SpinUnlock(&g_taskSpin); + LOS_ASSERT(LOS_SpinHeld(&g_taskSpin)); // ѳ + LOS_SpinUnlock(&g_taskSpin); // ͷ /* * gc soft timer works every OS_MP_GC_PERIOD period, to prevent this timer * triggered right at the timeout has reached, we set the timeout as double * of the gc peroid. */ if (LOS_SemPend(taskCB->syncSignal, OS_MP_GC_PERIOD * 2) != LOS_OK) { - ret = LOS_ERRNO_TSK_MP_SYNC_FAILED; + ret = LOS_ERRNO_TSK_MP_SYNC_FAILED; // ͬȴʧ } - LOS_SpinLock(&g_taskSpin); + LOS_SpinLock(&g_taskSpin); // ȡ return ret; #else @@ -423,10 +431,10 @@ LITE_OS_SEC_TEXT UINT32 OsTaskSyncWait(const LosTaskCB *taskCB) #endif } -STATIC INLINE VOID OsTaskSyncWake(const LosTaskCB *taskCB) +STATIC INLINE VOID OsTaskSyncWake(const LosTaskCB* taskCB) { #ifdef LOSCFG_KERNEL_SMP_TASK_SYNC - (VOID)OsSemPostUnsafe(taskCB->syncSignal, NULL); + (VOID)OsSemPostUnsafe(taskCB->syncSignal, NULL); // ͬź #else (VOID)taskCB; #endif @@ -434,39 +442,39 @@ STATIC INLINE VOID OsTaskSyncWake(const LosTaskCB *taskCB) STATIC VOID OsTaskKernelResourcesToFree(UINT32 syncSignal, UINTPTR topOfStack) { - VOID *poolTmp = (VOID *)m_aucSysMem1; + VOID* poolTmp = (VOID*)m_aucSysMem1; - OsTaskSyncDestroy(syncSignal); + OsTaskSyncDestroy(syncSignal); // ͬź - (VOID)LOS_MemFree(poolTmp, (VOID *)topOfStack); + (VOID)LOS_MemFree(poolTmp, (VOID*)topOfStack); // ͷջڴ } LITE_OS_SEC_TEXT VOID OsTaskCBRecycleToFree() { - LosTaskCB *taskCB = NULL; + LosTaskCB* taskCB = NULL; UINT32 intSave; SCHEDULER_LOCK(intSave); while (!LOS_ListEmpty(&g_taskRecycleList)) { - taskCB = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&g_taskRecycleList)); - LOS_ListDelete(&taskCB->pendList); + taskCB = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&g_taskRecycleList)); // блȡƿ + LOS_ListDelete(&taskCB->pendList); // ӻбƳƿ SCHEDULER_UNLOCK(intSave); - OsTaskResourcesToFree(taskCB); + OsTaskResourcesToFree(taskCB); // ͷԴ SCHEDULER_LOCK(intSave); } SCHEDULER_UNLOCK(intSave); } -LITE_OS_SEC_TEXT VOID OsTaskResourcesToFree(LosTaskCB *taskCB) +LITE_OS_SEC_TEXT VOID OsTaskResourcesToFree(LosTaskCB* taskCB) { UINT32 syncSignal = LOSCFG_BASE_IPC_SEM_LIMIT; UINT32 intSave; UINTPTR topOfStack; #ifdef LOSCFG_KERNEL_VM - LosProcessCB *processCB = OS_PCB_FROM_PID(taskCB->processID); + LosProcessCB* processCB = OS_PCB_FROM_PID(taskCB->processID); if (OsProcessIsUserMode(processCB) && (taskCB->userMapBase != 0)) { SCHEDULER_LOCK(intSave); UINT32 mapBase = (UINTPTR)taskCB->userMapBase; @@ -476,10 +484,10 @@ LITE_OS_SEC_TEXT VOID OsTaskResourcesToFree(LosTaskCB *taskCB) SCHEDULER_UNLOCK(intSave); LOS_ASSERT(!(processCB->vmSpace == NULL)); - UINT32 ret = OsUnMMap(processCB->vmSpace, (UINTPTR)mapBase, mapSize); + UINT32 ret = OsUnMMap(processCB->vmSpace, (UINTPTR)mapBase, mapSize); // ȡӳûڴ if ((ret != LOS_OK) && (mapBase != 0) && !(processCB->processStatus & OS_PROCESS_STATUS_INIT)) { PRINT_ERR("process(%u) ummap user task(%u) stack failed! mapbase: 0x%x size :0x%x, error: %d\n", - processCB->processID, taskCB->taskID, mapBase, mapSize, ret); + processCB->processID, taskCB->taskID, mapBase, mapSize, ret); } #ifdef LOSCFG_KERNEL_LITEIPC @@ -489,189 +497,197 @@ LITE_OS_SEC_TEXT VOID OsTaskResourcesToFree(LosTaskCB *taskCB) #endif if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) { - topOfStack = taskCB->topOfStack; + topOfStack = taskCB->topOfStack; // ȡջջַ taskCB->topOfStack = 0; #ifdef LOSCFG_KERNEL_SMP_TASK_SYNC - syncSignal = taskCB->syncSignal; + syncSignal = taskCB->syncSignal; // ȡͬź taskCB->syncSignal = LOSCFG_BASE_IPC_SEM_LIMIT; #endif - OsTaskKernelResourcesToFree(syncSignal, topOfStack); + OsTaskKernelResourcesToFree(syncSignal, topOfStack); // ͷںԴ SCHEDULER_LOCK(intSave); - OsClearSigInfoTmpList(&(taskCB->sig)); - OsInsertTCBToFreeList(taskCB); + OsClearSigInfoTmpList(&(taskCB->sig)); // źϢʱб + OsInsertTCBToFreeList(taskCB); // ƿ뵽б SCHEDULER_UNLOCK(intSave); } return; } -LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskCBInitBase(LosTaskCB *taskCB, - const VOID *stackPtr, - const VOID *topStack, - const TSK_INIT_PARAM_S *initParam) + +LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskCBInitBase(LosTaskCB* taskCB, + const VOID* stackPtr, + const VOID* topStack, + const TSK_INIT_PARAM_S* initParam) { - taskCB->stackPointer = (VOID *)stackPtr; - taskCB->args[0] = initParam->auwArgs[0]; /* 0~3: just for args array index */ - taskCB->args[1] = initParam->auwArgs[1]; - taskCB->args[2] = initParam->auwArgs[2]; - taskCB->args[3] = initParam->auwArgs[3]; - taskCB->topOfStack = (UINTPTR)topStack; - taskCB->stackSize = initParam->uwStackSize; - taskCB->priority = initParam->usTaskPrio; - taskCB->taskEntry = initParam->pfnTaskEntry; - taskCB->signal = SIGNAL_NONE; + taskCB->stackPointer = (VOID*)stackPtr; // Ķջָ + taskCB->args[0] = initParam->auwArgs[0]; /* 0~3: just for args array index */ // IJ + taskCB->args[1] = initParam->auwArgs[1]; + taskCB->args[2] = initParam->auwArgs[2]; + taskCB->args[3] = initParam->auwArgs[3]; + taskCB->topOfStack = (UINTPTR)topStack; // ջջַ + taskCB->stackSize = initParam->uwStackSize; // ջĴС + taskCB->priority = initParam->usTaskPrio; // ȼ + taskCB->taskEntry = initParam->pfnTaskEntry; // ں + taskCB->signal = SIGNAL_NONE; // ʼź #ifdef LOSCFG_KERNEL_SMP - taskCB->currCpu = OS_TASK_INVALID_CPUID; - taskCB->cpuAffiMask = (initParam->usCpuAffiMask) ? - initParam->usCpuAffiMask : LOSCFG_KERNEL_CPU_MASK; + taskCB->currCpu = OS_TASK_INVALID_CPUID; // ʼǰڵCPU ID + taskCB->cpuAffiMask = (initParam->usCpuAffiMask) ? + initParam->usCpuAffiMask : LOSCFG_KERNEL_CPU_MASK; // ʼCPU׺ #endif #ifdef LOSCFG_KERNEL_LITEIPC - LOS_ListInit(&(taskCB->msgListHead)); + LOS_ListInit(&(taskCB->msgListHead)); // ʼϢб #endif - taskCB->policy = (initParam->policy == LOS_SCHED_FIFO) ? LOS_SCHED_FIFO : LOS_SCHED_RR; - taskCB->taskStatus = OS_TASK_STATUS_INIT; + taskCB->policy = (initParam->policy == LOS_SCHED_FIFO) ? LOS_SCHED_FIFO : LOS_SCHED_RR; // ĵȲ + taskCB->taskStatus = OS_TASK_STATUS_INIT; // ʼ״̬ if (initParam->uwResved & OS_TASK_FLAG_DETACHED) { - taskCB->taskStatus |= OS_TASK_FLAG_DETACHED; - } else { - taskCB->taskStatus |= OS_TASK_FLAG_PTHREAD_JOIN; + taskCB->taskStatus |= OS_TASK_FLAG_DETACHED; // Ϊ̬ķ + } + else { + taskCB->taskStatus |= OS_TASK_FLAG_PTHREAD_JOIN; // pthread joinǣʼĵȴб LOS_ListInit(&taskCB->joinList); } - taskCB->futex.index = OS_INVALID_VALUE; - LOS_ListInit(&taskCB->lockList); - SET_SORTLIST_VALUE(&taskCB->sortList, OS_SORT_LINK_INVALID_TIME); + taskCB->futex.index = OS_INVALID_VALUE; // ʼfutexֵ + LOS_ListInit(&taskCB->lockList); // ʼб + SET_SORTLIST_VALUE(&taskCB->sortList, OS_SORT_LINK_INVALID_TIME); // ʼ } -STATIC UINT32 OsTaskCBInit(LosTaskCB *taskCB, const TSK_INIT_PARAM_S *initParam, - const VOID *stackPtr, const VOID *topStack) +STATIC UINT32 OsTaskCBInit(LosTaskCB* taskCB, const TSK_INIT_PARAM_S* initParam, + const VOID* stackPtr, const VOID* topStack) { - UINT32 intSave; - UINT32 ret; - UINT32 numCount; - UINT16 mode; - LosProcessCB *processCB = NULL; + UINT32 intSave; // ж״̬ı + UINT32 ret; // ֵ + UINT32 numCount; // ̼߳ + UINT16 mode; // ģʽ + LosProcessCB* processCB = NULL; // ̿ƿָ - OsTaskCBInitBase(taskCB, stackPtr, topStack, initParam); + OsTaskCBInitBase(taskCB, stackPtr, topStack, initParam); // ʼƿĻϢ - SCHEDULER_LOCK(intSave); - processCB = OS_PCB_FROM_PID(initParam->processID); - taskCB->processID = processCB->processID; - mode = processCB->processMode; - LOS_ListTailInsert(&(processCB->threadSiblingList), &(taskCB->threadList)); - if (mode == OS_USER_MODE) { - taskCB->userArea = initParam->userParam.userArea; - taskCB->userMapBase = initParam->userParam.userMapBase; - taskCB->userMapSize = initParam->userParam.userMapSize; - OsUserTaskStackInit(taskCB->stackPointer, (UINTPTR)taskCB->taskEntry, initParam->userParam.userSP); + SCHEDULER_LOCK(intSave); // رյж + + processCB = OS_PCB_FROM_PID(initParam->processID); // ݽIDȡ̿ƿ + taskCB->processID = processCB->processID; // ĽID + mode = processCB->processMode; // ȡ̵ģʽ + LOS_ListTailInsert(&(processCB->threadSiblingList), &(taskCB->threadList)); // ƿ̵߳ + + if (mode == OS_USER_MODE) { // ûģʽ + taskCB->userArea = initParam->userParam.userArea; // û + taskCB->userMapBase = initParam->userParam.userMapBase; // ûӳַ + taskCB->userMapSize = initParam->userParam.userMapSize; // ûӳС + OsUserTaskStackInit(taskCB->stackPointer, (UINTPTR)taskCB->taskEntry, initParam->userParam.userSP); // ʼûջ } - if (!processCB->threadNumber) { - processCB->threadGroupID = taskCB->taskID; + if (!processCB->threadNumber) { // ̵߳Ϊ0 + processCB->threadGroupID = taskCB->taskID; // ý̵߳IDΪǰID } - processCB->threadNumber++; + processCB->threadNumber++; // ߳1 - numCount = processCB->threadCount; - processCB->threadCount++; - SCHEDULER_UNLOCK(intSave); + numCount = processCB->threadCount; // ȡ̵̼߳ + processCB->threadCount++; // ̼߳1 - if (initParam->pcName != NULL) { - ret = (UINT32)OsSetTaskName(taskCB, initParam->pcName, FALSE); + SCHEDULER_UNLOCK(intSave); // ж + + if (initParam->pcName != NULL) { // Ϊ + ret = (UINT32)OsSetTaskName(taskCB, initParam->pcName, FALSE); // if (ret == LOS_OK) { return LOS_OK; } } - if (snprintf_s(taskCB->taskName, OS_TCB_NAME_LEN, OS_TCB_NAME_LEN - 1, "thread%u", numCount) < 0) { + if (snprintf_s(taskCB->taskName, OS_TCB_NAME_LEN, OS_TCB_NAME_LEN - 1, "thread%u", numCount) < 0) { // Ĭ return LOS_NOK; } + return LOS_OK; } -LITE_OS_SEC_TEXT LosTaskCB *OsGetFreeTaskCB(VOID) +LITE_OS_SEC_TEXT LosTaskCB* OsGetFreeTaskCB(VOID) { - UINT32 intSave; - LosTaskCB *taskCB = NULL; + UINT32 intSave; // ж״̬ı + LosTaskCB* taskCB = NULL; // ƿָ - SCHEDULER_LOCK(intSave); - if (LOS_ListEmpty(&g_losFreeTask)) { - SCHEDULER_UNLOCK(intSave); - PRINT_ERR("No idle TCB in the system!\n"); + SCHEDULER_LOCK(intSave); // رյж + + if (LOS_ListEmpty(&g_losFreeTask)) { // Ϊ + SCHEDULER_UNLOCK(intSave); // ж + PRINT_ERR("No idle TCB in the system!\n"); // ӡϢ #ifdef LOSCFG_DEBUG_VERSION - (VOID)OsShellCmdTskInfoGet(OS_ALL_TASK_MASK, NULL, OS_PROCESS_INFO_ALL); + (VOID)OsShellCmdTskInfoGet(OS_ALL_TASK_MASK, NULL, OS_PROCESS_INFO_ALL); // Ϣ #endif return NULL; - } +} - taskCB = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&g_losFreeTask)); - LOS_ListDelete(LOS_DL_LIST_FIRST(&g_losFreeTask)); - SCHEDULER_UNLOCK(intSave); + taskCB = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&g_losFreeTask)); // ӿлȡһƿ + LOS_ListDelete(LOS_DL_LIST_FIRST(&g_losFreeTask)); // ӿɾƿ + SCHEDULER_UNLOCK(intSave); // ж - return taskCB; + return taskCB; // ػȡĿƿָ } -LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreateOnly(UINT32 *taskID, TSK_INIT_PARAM_S *initParam) + +LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreateOnly(UINT32* taskID, TSK_INIT_PARAM_S* initParam) { - UINT32 intSave, errRet; - VOID *topStack = NULL; - VOID *stackPtr = NULL; - LosTaskCB *taskCB = NULL; - VOID *pool = NULL; + UINT32 intSave, errRet; // ж״̬ıֵ + VOID* topStack = NULL; // ջָ + VOID* stackPtr = NULL; // ջָ + LosTaskCB* taskCB = NULL; // ƿָ + VOID* pool = NULL; // ڴָ - errRet = OsTaskCreateParamCheck(taskID, initParam, &pool); + errRet = OsTaskCreateParamCheck(taskID, initParam, &pool); // 񴴽ĺϷ if (errRet != LOS_OK) { return errRet; } - taskCB = OsGetFreeTaskCB(); + taskCB = OsGetFreeTaskCB(); // ȡһеƿ if (taskCB == NULL) { errRet = LOS_ERRNO_TSK_TCB_UNAVAILABLE; goto LOS_ERREND; } - errRet = OsTaskSyncCreate(taskCB); + errRet = OsTaskSyncCreate(taskCB); // ͬ if (errRet != LOS_OK) { goto LOS_ERREND_REWIND_TCB; } - OsTaskStackAlloc(&topStack, initParam->uwStackSize, pool); + OsTaskStackAlloc(&topStack, initParam->uwStackSize, pool); // ջڴ if (topStack == NULL) { errRet = LOS_ERRNO_TSK_NO_MEMORY; goto LOS_ERREND_REWIND_SYNC; } - stackPtr = OsTaskStackInit(taskCB->taskID, initParam->uwStackSize, topStack, TRUE); - errRet = OsTaskCBInit(taskCB, initParam, stackPtr, topStack); + stackPtr = OsTaskStackInit(taskCB->taskID, initParam->uwStackSize, topStack, TRUE); // ʼջ + errRet = OsTaskCBInit(taskCB, initParam, stackPtr, topStack); // ʼƿ if (errRet != LOS_OK) { goto LOS_ERREND_TCB_INIT; } if (OsConsoleIDSetHook != NULL) { - OsConsoleIDSetHook(taskCB->taskID, OsCurrTaskGet()->taskID); + OsConsoleIDSetHook(taskCB->taskID, OsCurrTaskGet()->taskID); // ÿ̨IDĹӺ } - *taskID = taskCB->taskID; - OsHookCall(LOS_HOOK_TYPE_TASK_CREATE, taskCB); + *taskID = taskCB->taskID; // ID + OsHookCall(LOS_HOOK_TYPE_TASK_CREATE, taskCB); // 񴴽ĹӺ return LOS_OK; LOS_ERREND_TCB_INIT: - (VOID)LOS_MemFree(pool, topStack); + (VOID)LOS_MemFree(pool, topStack); // ͷջڴ LOS_ERREND_REWIND_SYNC: #ifdef LOSCFG_KERNEL_SMP_TASK_SYNC - OsTaskSyncDestroy(taskCB->syncSignal); + OsTaskSyncDestroy(taskCB->syncSignal); // ͬ #endif LOS_ERREND_REWIND_TCB: SCHEDULER_LOCK(intSave); - OsInsertTCBToFreeList(taskCB); + OsInsertTCBToFreeList(taskCB); // ƿ SCHEDULER_UNLOCK(intSave); LOS_ERREND: return errRet; } -LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreate(UINT32 *taskID, TSK_INIT_PARAM_S *initParam) +LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreate(UINT32* taskID, TSK_INIT_PARAM_S* initParam) { - UINT32 ret; - UINT32 intSave; - LosTaskCB *taskCB = NULL; + UINT32 ret; // ֵ + UINT32 intSave; // ж״̬ı + LosTaskCB* taskCB = NULL; // ƿָ if (initParam == NULL) { return LOS_ERRNO_TSK_PTR_NULL; @@ -682,72 +698,75 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreate(UINT32 *taskID, TSK_INIT_PARAM_S *in } if (OsProcessIsUserMode(OsCurrProcessGet())) { - initParam->processID = OsGetKernelInitProcessID(); - } else { - initParam->processID = OsCurrProcessGet()->processID; + initParam->processID = OsGetKernelInitProcessID(); // ǰûģʽ£IDΪں˳ʼID + } + else { + initParam->processID = OsCurrProcessGet()->processID; // 򽫽IDΪǰID } initParam->uwResved &= ~OS_TASK_FLAG_PTHREAD_JOIN; if (initParam->uwResved & LOS_TASK_STATUS_DETACHED) { initParam->uwResved = OS_TASK_FLAG_DETACHED; } - ret = LOS_TaskCreateOnly(taskID, initParam); + ret = LOS_TaskCreateOnly(taskID, initParam); // 񴴽 if (ret != LOS_OK) { return ret; } - taskCB = OS_TCB_FROM_TID(*taskID); + taskCB = OS_TCB_FROM_TID(*taskID); // IDȡƿָ SCHEDULER_LOCK(intSave); - OsSchedTaskEnQueue(taskCB); + OsSchedTaskEnQueue(taskCB); // ȶ SCHEDULER_UNLOCK(intSave); /* in case created task not running on this core, schedule or not depends on other schedulers status. */ - LOS_MpSchedule(OS_MP_CPU_ALL); + LOS_MpSchedule(OS_MP_CPU_ALL); // ദ if (OS_SCHEDULER_ACTIVE) { - LOS_Schedule(); + LOS_Schedule(); // } return LOS_OK; } + LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskResume(UINT32 taskID) { - UINT32 intSave; - UINT32 errRet; - LosTaskCB *taskCB = NULL; - BOOL needSched = FALSE; + UINT32 intSave; // ж״̬ı + UINT32 errRet; // ֵ + LosTaskCB* taskCB = NULL; // ƿָ + BOOL needSched = FALSE; // ǷҪȵı־ if (OS_TID_CHECK_INVALID(taskID)) { return LOS_ERRNO_TSK_ID_INVALID; } - taskCB = OS_TCB_FROM_TID(taskID); + taskCB = OS_TCB_FROM_TID(taskID); // IDȡƿָ SCHEDULER_LOCK(intSave); - /* clear pending signal */ + /* ź */ taskCB->signal &= ~SIGNAL_SUSPEND; if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) { errRet = LOS_ERRNO_TSK_NOT_CREATED; OS_GOTO_ERREND(); - } else if (!(taskCB->taskStatus & OS_TASK_STATUS_SUSPENDED)) { + } + else if (!(taskCB->taskStatus & OS_TASK_STATUS_SUSPENDED)) { errRet = LOS_ERRNO_TSK_NOT_SUSPENDED; OS_GOTO_ERREND(); } taskCB->taskStatus &= ~OS_TASK_STATUS_SUSPENDED; if (!(taskCB->taskStatus & OS_CHECK_TASK_BLOCK)) { - OsSchedTaskEnQueue(taskCB); + OsSchedTaskEnQueue(taskCB); // ȶ if (OS_SCHEDULER_ACTIVE) { needSched = TRUE; } } SCHEDULER_UNLOCK(intSave); - LOS_MpSchedule(OS_MP_CPU_ALL); + LOS_MpSchedule(OS_MP_CPU_ALL); // ദ if (needSched) { - LOS_Schedule(); + LOS_Schedule(); // } return LOS_OK; @@ -766,13 +785,13 @@ LOS_ERREND: * 3. Do the suspension in hard-irq * then LOS_TaskSuspend will directly return with 'ret' value. */ -LITE_OS_SEC_TEXT_INIT STATIC BOOL OsTaskSuspendCheckOnRun(LosTaskCB *taskCB, UINT32 *ret) +LITE_OS_SEC_TEXT_INIT STATIC BOOL OsTaskSuspendCheckOnRun(LosTaskCB* taskCB, UINT32* ret) { - /* init default out return value */ + /* ʼĬϵķֵ */ *ret = LOS_OK; #ifdef LOSCFG_KERNEL_SMP - /* ASYNCHRONIZED. No need to do task lock checking */ + /* 첽 */ if (taskCB->currCpu != ArchCurrCpuid()) { taskCB->signal = SIGNAL_SUSPEND; LOS_MpSchedule(taskCB->currCpu); @@ -781,13 +800,13 @@ LITE_OS_SEC_TEXT_INIT STATIC BOOL OsTaskSuspendCheckOnRun(LosTaskCB *taskCB, UIN #endif if (!OsPreemptableInSched()) { - /* Suspending the current core's running task */ + /* ڵڼֹռǰе */ *ret = LOS_ERRNO_TSK_SUSPEND_LOCKED; return FALSE; } if (OS_INT_ACTIVE) { - /* suspend running task in interrupt */ + /* жйе */ taskCB->signal = SIGNAL_SUSPEND; return FALSE; } @@ -795,10 +814,10 @@ LITE_OS_SEC_TEXT_INIT STATIC BOOL OsTaskSuspendCheckOnRun(LosTaskCB *taskCB, UIN return TRUE; } -LITE_OS_SEC_TEXT STATIC UINT32 OsTaskSuspend(LosTaskCB *taskCB) +LITE_OS_SEC_TEXT STATIC UINT32 OsTaskSuspend(LosTaskCB* taskCB) { - UINT32 errRet; - UINT16 tempStatus; + UINT32 errRet; // ֵ + UINT16 tempStatus; // ʱ洢״̬ tempStatus = taskCB->taskStatus; if (tempStatus & OS_TASK_STATUS_UNUSED) { @@ -815,55 +834,56 @@ LITE_OS_SEC_TEXT STATIC UINT32 OsTaskSuspend(LosTaskCB *taskCB) } if (tempStatus & OS_TASK_STATUS_READY) { - OsSchedTaskDeQueue(taskCB); + OsSchedTaskDeQueue(taskCB); // ӵȶƳ } taskCB->taskStatus |= OS_TASK_STATUS_SUSPENDED; - OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTOSUSPENDEDLIST, taskCB); + OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTOSUSPENDEDLIST, taskCB); // ĹӺ if (taskCB == OsCurrTaskGet()) { - OsSchedResched(); + OsSchedResched(); // } return LOS_OK; } + LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskSuspend(UINT32 taskID) { - UINT32 intSave; - LosTaskCB *taskCB = NULL; - UINT32 errRet; + UINT32 intSave; // ж״̬ı + LosTaskCB* taskCB = NULL; // ƿָ + UINT32 errRet; // ֵ if (OS_TID_CHECK_INVALID(taskID)) { return LOS_ERRNO_TSK_ID_INVALID; } - taskCB = OS_TCB_FROM_TID(taskID); + taskCB = OS_TCB_FROM_TID(taskID); // IDȡƿָ if (taskCB->taskStatus & OS_TASK_FLAG_SYSTEM_TASK) { return LOS_ERRNO_TSK_OPERATE_SYSTEM_TASK; } SCHEDULER_LOCK(intSave); - errRet = OsTaskSuspend(taskCB); + errRet = OsTaskSuspend(taskCB); // ùĺ SCHEDULER_UNLOCK(intSave); return errRet; } -STATIC INLINE VOID OsTaskStatusUnusedSet(LosTaskCB *taskCB) +STATIC INLINE VOID OsTaskStatusUnusedSet(LosTaskCB* taskCB) { - taskCB->taskStatus |= OS_TASK_STATUS_UNUSED; - taskCB->eventMask = 0; + taskCB->taskStatus |= OS_TASK_STATUS_UNUSED; // ״̬Ϊδʹ + taskCB->eventMask = 0; // ¼ - OS_MEM_CLEAR(taskCB->taskID); + OS_MEM_CLEAR(taskCB->taskID); // ID } -STATIC INLINE VOID OsTaskReleaseHoldLock(LosProcessCB *processCB, LosTaskCB *taskCB) +STATIC INLINE VOID OsTaskReleaseHoldLock(LosProcessCB* processCB, LosTaskCB* taskCB) { - LosMux *mux = NULL; - UINT32 ret; + LosMux* mux = NULL; // ָ + UINT32 ret; // ֵ while (!LOS_ListEmpty(&taskCB->lockList)) { mux = LOS_DL_LIST_ENTRY(LOS_DL_LIST_FIRST(&taskCB->lockList), LosMux, holdList); - ret = OsMuxUnlockUnsafe(taskCB, mux, NULL); + ret = OsMuxUnlockUnsafe(taskCB, mux, NULL); // еĻ if (ret != LOS_OK) { LOS_ListDelete(&mux->holdList); PRINT_ERR("mux ulock failed! : %u\n", ret); @@ -871,29 +891,31 @@ STATIC INLINE VOID OsTaskReleaseHoldLock(LosProcessCB *processCB, LosTaskCB *tas } if (processCB->processMode == OS_USER_MODE) { - OsTaskJoinPostUnsafe(taskCB); + OsTaskJoinPostUnsafe(taskCB); // û̬˳ʱ #ifdef LOSCFG_KERNEL_VM - OsFutexNodeDeleteFromFutexHash(&taskCB->futex, TRUE, NULL, NULL); + OsFutexNodeDeleteFromFutexHash(&taskCB->futex, TRUE, NULL, NULL); // FutexϣɾFutexڵ #endif } - OsTaskSyncWake(taskCB); + OsTaskSyncWake(taskCB); // ѵȴ + + return; } -LITE_OS_SEC_TEXT VOID OsRunTaskToDelete(LosTaskCB *runTask) +LITE_OS_SEC_TEXT VOID OsRunTaskToDelete(LosTaskCB* runTask) { - LosProcessCB *processCB = OS_PCB_FROM_PID(runTask->processID); + LosProcessCB* processCB = OS_PCB_FROM_PID(runTask->processID); // ȡ̵Ľ̿ƿָ - OsTaskReleaseHoldLock(processCB, runTask); - OsTaskStatusUnusedSet(runTask); + OsTaskReleaseHoldLock(processCB, runTask); // ͷеԴ + OsTaskStatusUnusedSet(runTask); // ״̬Ϊδʹ - LOS_ListDelete(&runTask->threadList); - processCB->threadNumber--; - LOS_ListTailInsert(&g_taskRecycleList, &runTask->pendList); - OsEventWriteUnsafe(&g_resourceEvent, OS_RESOURCE_EVENT_FREE, FALSE, NULL); + LOS_ListDelete(&runTask->threadList); // ߳ɾ + processCB->threadNumber--; // ̵߳һ + LOS_ListTailInsert(&g_taskRecycleList, &runTask->pendList); // + OsEventWriteUnsafe(&g_resourceEvent, OS_RESOURCE_EVENT_FREE, FALSE, NULL); // Դ¼֪ͨ - OsSchedResched(); + OsSchedResched(); // return; } @@ -906,7 +928,8 @@ LITE_OS_SEC_TEXT VOID OsRunTaskToDelete(LosTaskCB *runTask) * 3. Do the deletion in hard-irq * then LOS_TaskDelete will directly return with 'ret' value. */ -STATIC BOOL OsRunTaskToDeleteCheckOnRun(LosTaskCB *taskCB, UINT32 *ret) + +STATIC BOOL OsRunTaskToDeleteCheckOnRun(LosTaskCB* taskCB, UINT32* ret) { /* init default out return value */ *ret = LOS_OK; @@ -915,9 +938,9 @@ STATIC BOOL OsRunTaskToDeleteCheckOnRun(LosTaskCB *taskCB, UINT32 *ret) /* ASYNCHRONIZED. No need to do task lock checking */ if (taskCB->currCpu != ArchCurrCpuid()) { /* - * the task is running on another cpu. - * mask the target task with "kill" signal, and trigger mp schedule - * which might not be essential but the deletion could more in time. + * һCPUС + * ʹ"kill"źĿ񣬲ദȣ + * ܲDZģɾԸʱ */ taskCB->signal = SIGNAL_KILL; LOS_MpSchedule(taskCB->currCpu); @@ -927,15 +950,15 @@ STATIC BOOL OsRunTaskToDeleteCheckOnRun(LosTaskCB *taskCB, UINT32 *ret) #endif if (!OsPreemptableInSched()) { - /* If the task is running and scheduler is locked then you can not delete it */ + /* ҵ޷ɾ */ *ret = LOS_ERRNO_TSK_DELETE_LOCKED; return FALSE; } if (OS_INT_ACTIVE) { /* - * delete running task in interrupt. - * mask "kill" signal and later deletion will be handled. + * жɾе + * "kill"źţԺɾ */ taskCB->signal = SIGNAL_KILL; return FALSE; @@ -944,35 +967,35 @@ STATIC BOOL OsRunTaskToDeleteCheckOnRun(LosTaskCB *taskCB, UINT32 *ret) return TRUE; } -STATIC VOID OsTaskDeleteInactive(LosProcessCB *processCB, LosTaskCB *taskCB) +STATIC VOID OsTaskDeleteInactive(LosProcessCB* processCB, LosTaskCB* taskCB) { - LosMux *mux = (LosMux *)taskCB->taskMux; - UINT16 taskStatus = taskCB->taskStatus; + LosMux* mux = (LosMux*)taskCB->taskMux; // ָ + UINT16 taskStatus = taskCB->taskStatus; // ״̬ LOS_ASSERT(!(taskStatus & OS_TASK_STATUS_RUNNING)); - OsTaskReleaseHoldLock(processCB, taskCB); + OsTaskReleaseHoldLock(processCB, taskCB); // ͷеԴ - OsSchedTaskExit(taskCB); + OsSchedTaskExit(taskCB); // ˳ if (taskStatus & OS_TASK_STATUS_PENDING) { if (LOS_MuxIsValid(mux) == TRUE) { - OsMuxBitmapRestore(mux, taskCB, (LosTaskCB *)mux->owner); + OsMuxBitmapRestore(mux, taskCB, (LosTaskCB*)mux->owner); } } - OsTaskStatusUnusedSet(taskCB); + OsTaskStatusUnusedSet(taskCB); // ״̬Ϊδʹ - LOS_ListDelete(&taskCB->threadList); - processCB->threadNumber--; - LOS_ListTailInsert(&g_taskRecycleList, &taskCB->pendList); + LOS_ListDelete(&taskCB->threadList); // ߳ɾ + processCB->threadNumber--; // ̵߳һ + LOS_ListTailInsert(&g_taskRecycleList, &taskCB->pendList); // return; } -LITE_OS_SEC_TEXT UINT32 OsTaskDeleteUnsafe(LosTaskCB *taskCB, UINT32 status, UINT32 intSave) +LITE_OS_SEC_TEXT UINT32 OsTaskDeleteUnsafe(LosTaskCB* taskCB, UINT32 status, UINT32 intSave) { - LosProcessCB *processCB = OS_PCB_FROM_PID(taskCB->processID); - UINT32 mode = processCB->processMode; - UINT32 errRet = LOS_OK; + LosProcessCB* processCB = OS_PCB_FROM_PID(taskCB->processID); // ȡ̵Ľ̿ƿָ + UINT32 mode = processCB->processMode; // ̵ģʽ + UINT32 errRet = LOS_OK; // ֵ if (taskCB->taskStatus & OS_TASK_FLAG_SYSTEM_TASK) { errRet = LOS_ERRNO_TSK_OPERATE_SYSTEM_TASK; @@ -984,15 +1007,15 @@ LITE_OS_SEC_TEXT UINT32 OsTaskDeleteUnsafe(LosTaskCB *taskCB, UINT32 status, UIN } if (!(taskCB->taskStatus & OS_TASK_STATUS_RUNNING)) { - OsTaskDeleteInactive(processCB, taskCB); + OsTaskDeleteInactive(processCB, taskCB); // еɾ SCHEDULER_UNLOCK(intSave); OsWriteResourceEvent(OS_RESOURCE_EVENT_FREE); return errRet; } - OsHookCall(LOS_HOOK_TYPE_TASK_DELETE, taskCB); + OsHookCall(LOS_HOOK_TYPE_TASK_DELETE, taskCB); // ɾĹӺ if (mode == OS_USER_MODE) { SCHEDULER_UNLOCK(intSave); - OsTaskResourcesToFree(taskCB); + OsTaskResourcesToFree(taskCB); // ͷԴ SCHEDULER_LOCK(intSave); } @@ -1001,7 +1024,7 @@ LITE_OS_SEC_TEXT UINT32 OsTaskDeleteUnsafe(LosTaskCB *taskCB, UINT32 status, UIN #else LOS_ASSERT(OsPercpuGet()->taskLockCnt == 0); #endif - OsRunTaskToDelete(taskCB); + OsRunTaskToDelete(taskCB); // еɾ EXIT: SCHEDULER_UNLOCK(intSave); @@ -1012,8 +1035,8 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskDelete(UINT32 taskID) { UINT32 intSave; UINT32 ret; - LosTaskCB *taskCB = NULL; - LosProcessCB *processCB = NULL; + LosTaskCB* taskCB = NULL; + LosProcessCB* processCB = NULL; if (OS_TID_CHECK_INVALID(taskID)) { return LOS_ERRNO_TSK_ID_INVALID; @@ -1023,7 +1046,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskDelete(UINT32 taskID) return LOS_ERRNO_TSK_YIELD_IN_INT; } - taskCB = OS_TCB_FROM_TID(taskID); + taskCB = OS_TCB_FROM_TID(taskID); // ȡƿָ SCHEDULER_LOCK(intSave); if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) { ret = LOS_ERRNO_TSK_NOT_CREATED; @@ -1036,11 +1059,11 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskDelete(UINT32 taskID) return LOS_ERRNO_TSK_OPERATE_SYSTEM_TASK; } - processCB = OS_PCB_FROM_PID(taskCB->processID); + processCB = OS_PCB_FROM_PID(taskCB->processID); // ȡ̵Ľ̿ƿָ if (processCB->threadNumber == 1) { /* 1: The last task of the process exits */ if (processCB == OsCurrProcessGet()) { SCHEDULER_UNLOCK(intSave); - OsProcessExit(taskCB, OS_PRO_EXIT_OK); + OsProcessExit(taskCB, OS_PRO_EXIT_OK); // ˳ return LOS_OK; } @@ -1048,7 +1071,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskDelete(UINT32 taskID) OS_GOTO_ERREND(); } - return OsTaskDeleteUnsafe(taskCB, OS_PRO_EXIT_OK, intSave); + return OsTaskDeleteUnsafe(taskCB, OS_PRO_EXIT_OK, intSave); // ɾ LOS_ERREND: SCHEDULER_UNLOCK(intSave); @@ -1058,14 +1081,14 @@ LOS_ERREND: LITE_OS_SEC_TEXT UINT32 LOS_TaskDelay(UINT32 tick) { UINT32 intSave; - LosTaskCB *runTask = NULL; + LosTaskCB* runTask = NULL; if (OS_INT_ACTIVE) { PRINT_ERR("In interrupt not allow delay task!\n"); return LOS_ERRNO_TSK_DELAY_IN_INT; } - runTask = OsCurrTaskGet(); + runTask = OsCurrTaskGet(); // ȡǰƿָ if (runTask->taskStatus & OS_TASK_FLAG_SYSTEM_TASK) { OsBackTrace(); return LOS_ERRNO_TSK_OPERATE_SYSTEM_TASK; @@ -1074,14 +1097,14 @@ LITE_OS_SEC_TEXT UINT32 LOS_TaskDelay(UINT32 tick) if (!OsPreemptable()) { return LOS_ERRNO_TSK_DELAY_IN_LOCK; } - OsHookCall(LOS_HOOK_TYPE_TASK_DELAY, tick); + OsHookCall(LOS_HOOK_TYPE_TASK_DELAY, tick); // ʱĹӺ if (tick == 0) { - return LOS_TaskYield(); + return LOS_TaskYield(); // óCPU } SCHEDULER_LOCK(intSave); - OsSchedDelay(runTask, tick); - OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTODELAYEDLIST, runTask); + OsSchedDelay(runTask, tick); // ʱ + OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTODELAYEDLIST, runTask); // ƶʱеĹӺ SCHEDULER_UNLOCK(intSave); return LOS_OK; @@ -1090,25 +1113,26 @@ LITE_OS_SEC_TEXT UINT32 LOS_TaskDelay(UINT32 tick) LITE_OS_SEC_TEXT_MINOR UINT16 LOS_TaskPriGet(UINT32 taskID) { UINT32 intSave; - LosTaskCB *taskCB = NULL; + LosTaskCB* taskCB = NULL; UINT16 priority; if (OS_TID_CHECK_INVALID(taskID)) { return (UINT16)OS_INVALID; } - taskCB = OS_TCB_FROM_TID(taskID); + taskCB = OS_TCB_FROM_TID(taskID); // ȡƿָ SCHEDULER_LOCK(intSave); if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) { SCHEDULER_UNLOCK(intSave); return (UINT16)OS_INVALID; } - priority = taskCB->priority; + priority = taskCB->priority; // ȡȼ SCHEDULER_UNLOCK(intSave); return priority; } + LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskPriSet(UINT32 taskID, UINT16 taskPrio) { UINT32 intSave; From 3d9090664fa4c316dacc5b8fa7c7ac53558d6fe5 Mon Sep 17 00:00:00 2001 From: zengqi <173384268@qq.com> Date: Mon, 4 Dec 2023 20:32:22 +0800 Subject: [PATCH 09/21] zengqi --- sched/sched_sq/los_sched.c | 6 +- sched/sched_sq/los_sortlink.c | 251 +++++++++++++++++++++++++++++++++- 2 files changed, 254 insertions(+), 3 deletions(-) diff --git a/sched/sched_sq/los_sched.c b/sched/sched_sq/los_sched.c index ed3f2ea..5c98dc3 100644 --- a/sched/sched_sq/los_sched.c +++ b/sched/sched_sq/los_sched.c @@ -1073,8 +1073,10 @@ STATIC VOID OsSchedTaskSwicth(LosTaskCB *runTask, LosTaskCB *newTask) /* do the task context switch */ OsTaskSchedule(newTask, runTask); // 进行任务上下文切换 } -//在切换任务之前,它首先调用OsSchedSwitchCheck函数来检查任务切换的相关条件。然后,它更新当前任务和新任务的运行状态标志,并进行一些其他操作,如设置当前任务、进行进程切换、设置用户态任务等。接下来,它根据任务的状态更新新任务的起始时间,并设置下一个任务的到期时间。最后,它调用OsTaskSchedule函数进行任务上下文切换。 - +/*在切换任务之前,它首先调用OsSchedSwitchCheck函数来检查任务切换的相关条件。然后,它更新当前任务和新任务的运行状态标志, +并进行一些其他操作,如设置当前任务、进行进程切换、设置用户态任务等。接下来,它根据任务的状态更新新任务的起始时间,并设置 +下一个任务的到期时间。最后,它调用OsTaskSchedule函数进行任务上下文切换。 +*/ VOID OsSchedIrqEndCheckNeedSched(VOID) { Percpu *percpu = OsPercpuGet(); // 获取当前 CPU 的数据结构指针 diff --git a/sched/sched_sq/los_sortlink.c b/sched/sched_sq/los_sortlink.c index 9115892..9a29f12 100644 --- a/sched/sched_sq/los_sortlink.c +++ b/sched/sched_sq/los_sortlink.c @@ -118,7 +118,256 @@ STATIC Percpu *OsFindIdleCpu(UINT16 *idleCpuID) *idleCpuID = cpuID; } - cpuID++; + cpuID++;/* + * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved. + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its contributors may be used + * to endorse or promote products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "los_sortlink_pri.h" +#include "los_memory.h" +#include "los_exc.h" +#include "los_percpu_pri.h" +#include "los_sched_pri.h" +#include "los_mp.h" +UINT32 OsSortLinkInit(SortLinkAttribute *sortLinkHeader) +{ + LOS_ListInit(&sortLinkHeader->sortLink); // 初始化排序链表头 + sortLinkHeader->nodeNum = 0; // 初始化节点数量为0 + return LOS_OK; +} + +STATIC INLINE VOID OsAddNode2SortLink(SortLinkAttribute *sortLinkHeader, SortLinkList *sortList) +{ + LOS_DL_LIST *head = (LOS_DL_LIST *)&sortLinkHeader->sortLink; // 获取排序链表头指针 + + if (LOS_ListEmpty(head)) { // 如果链表为空 + LOS_ListHeadInsert(head, &sortList->sortLinkNode); // 将节点插入链表头 + sortLinkHeader->nodeNum++; // 节点数量加1 + return; + } + + SortLinkList *listSorted = LOS_DL_LIST_ENTRY(head->pstNext, SortLinkList, sortLinkNode); // 获取链表中的第一个节点 + if (listSorted->responseTime > sortList->responseTime) { // 如果插入节点的响应时间小于第一个节点的响应时间 + LOS_ListAdd(head, &sortList->sortLinkNode); // 将节点插入链表头之前 + sortLinkHeader->nodeNum++; // 节点数量加1 + return; + } else if (listSorted->responseTime == sortList->responseTime) { // 如果插入节点的响应时间等于第一个节点的响应时间 + LOS_ListAdd(head->pstNext, &sortList->sortLinkNode); // 将节点插入第一个节点之后 + sortLinkHeader->nodeNum++; // 节点数量加1 + return; + } + + LOS_DL_LIST *prevNode = head->pstPrev; // 获取链表中的最后一个节点 + do { + listSorted = LOS_DL_LIST_ENTRY(prevNode, SortLinkList, sortLinkNode); // 获取当前节点 + if (listSorted->responseTime <= sortList->responseTime) { // 如果插入节点的响应时间小于等于当前节点的响应时间 + LOS_ListAdd(prevNode, &sortList->sortLinkNode); // 将节点插入当前节点之前 + sortLinkHeader->nodeNum++; // 节点数量加1 + break; + } + + prevNode = prevNode->pstPrev; // 继续向前遍历 + } while (1); +} +/*OsSortLinkInit函数用于初始化排序链表头。在函数中,它调用LOS_ListInit函数初始化排序链表头,并将节点数量设置为0,然后返回LOS_OK。 + +OsAddNode2SortLink函数用于将节点插入排序链表中。在函数中,首先获取排序链表头指针。然后,如果链表为空,将节点插入链表头,并增加节点数量, +然后返回。如果链表不为空,获取链表中的第一个节点,并比较插入节点的响应时间与第一个节点的响应时间。如果插入节点的响应时间小于第一个节点的 +响应时间,将节点插入链表头之前,并增加节点数量,然后返回。如果插入节点的响应时间等于第一个节点的响应时间,将节点插入第一个节点之后, +并增加节点数量,然后返回。如果插入节点的响应时间大于第一个节点的响应时间,获取链表中的最后一个节点,并从链表尾部向前遍历。在遍历过程中, +如果插入节点的响应时间小于等于当前节点的响应时间,将节点插入当前节点之前,并增加节点数量,然后退出循环。最后,返回。*/ +VOID OsDeleteNodeSortLink(SortLinkAttribute *sortLinkHeader, SortLinkList *sortList) +{ + LOS_ListDelete(&sortList->sortLinkNode); // 从排序链表中删除节点 + SET_SORTLIST_VALUE(sortList, OS_SORT_LINK_INVALID_TIME); // 将节点的响应时间设置为无效值 + sortLinkHeader->nodeNum--; // 节点数量减1 +} + +STATIC INLINE UINT64 OsGetSortLinkNextExpireTime(SortLinkAttribute *sortHeader, UINT64 startTime) +{ + LOS_DL_LIST *head = &sortHeader->sortLink; // 获取排序链表头指针 + LOS_DL_LIST *list = head->pstNext; // 获取链表中的第一个节点 + + if (LOS_ListEmpty(head)) { // 如果链表为空 + return OS_SCHED_MAX_RESPONSE_TIME - OS_TICK_RESPONSE_PRECISION; // 返回最大响应时间减去精度 + } + + SortLinkList *listSorted = LOS_DL_LIST_ENTRY(list, SortLinkList, sortLinkNode); // 获取第一个节点 + if (listSorted->responseTime <= (startTime + OS_TICK_RESPONSE_PRECISION)) { // 如果第一个节点的响应时间小于等于(开始时间加上精度) + return startTime + OS_TICK_RESPONSE_PRECISION; // 返回开始时间加上精度 + } + + return listSorted->responseTime; // 返回第一个节点的响应时间 +} + +STATIC Percpu *OsFindIdleCpu(UINT16 *idleCpuID) +{ + Percpu *idleCpu = OsPercpuGetByID(0); // 获取CPU 0 的PerCPU结构体指针 + *idleCpuID = 0; // 将空闲CPU的ID设置为0 +/*OsDeleteNodeSortLink函数用于从排序链表中删除节点。在函数中,它调用LOS_ListDelete函数删除节点,并将节点的响应时间设置为无效值,然后将节点数量减1。 + +OsGetSortLinkNextExpireTime函数用于获取排序链表中下一个即将到期的节点的响应时间。在函数中,首先获取排序链表头指针和链表中的第一个节点。 +然后,如果链表为空,返回最大响应时间减去精度。如果第一个节点的响应时间小于等于(开始时间加上精度),返回开始时间加上精度。否则,返回第一个节点的响应时间。 + +OsFindIdleCpu函数用于查找空闲的CPU。在函数中,它通过调用OsPercpuGetByID函数获取CPU 0 的PerCPU结构体指针,并将空闲CPU的ID设置为0。*/ + +#ifdef LOSCFG_KERNEL_SMP + UINT16 cpuID = 1; // 初始化CPU ID为1 + UINT32 nodeNum = idleCpu->taskSortLink.nodeNum + idleCpu->swtmrSortLink.nodeNum; // 获取当前CPU的任务排序链表和软件定时器排序链表的节点数量之和 + + do { + Percpu *cpu = OsPercpuGetByID(cpuID); // 获取指定CPU的PerCPU结构体指针 + UINT32 temp = cpu->taskSortLink.nodeNum + cpu->swtmrSortLink.nodeNum; // 获取指定CPU的任务排序链表和软件定时器排序链表的节点数量之和 + if (nodeNum > temp) { // 如果当前CPU的节点数量之和大于指定CPU的节点数量之和 + idleCpu = cpu; // 更新空闲CPU指针 + *idleCpuID = cpuID; // 更新空闲CPU的ID + } + + cpuID++; // 继续遍历下一个CPU + } while (cpuID < LOSCFG_KERNEL_CORE_NUM); // 遍历完所有的CPU +#endif + + return idleCpu; // 返回空闲CPU的指针 +} + +VOID OsAdd2SortLink(SortLinkList *node, UINT64 startTime, UINT32 waitTicks, SortLinkType type) +{ + UINT32 intSave; + Percpu *cpu = NULL; + SortLinkAttribute *sortLinkHeader = NULL; + SPIN_LOCK_S *spinLock = NULL; + UINT16 idleCpu; + + if (OS_SCHEDULER_ACTIVE) { // 如果调度器处于活动状态 + cpu = OsFindIdleCpu(&idleCpu); // 查找空闲的CPU + } else { + idleCpu = ArchCurrCpuid(); // 获取当前CPU的ID + cpu = OsPercpuGet(); // 获取当前CPU的PerCPU结构体指针 + } + + if (type == OS_SORT_LINK_TASK) { + sortLinkHeader = &cpu->taskSortLink; // 获取任务排序链表头指针 + spinLock = &cpu->taskSortLinkSpin; // 获取任务排序链表自旋锁 + } else if (type == OS_SORT_LINK_SWTMR) { + sortLinkHeader = &cpu->swtmrSortLink; // 获取软件定时器排序链表头指针 + spinLock = &cpu->swtmrSortLinkSpin; // 获取软件定时器排序链表自旋锁 + } else { + LOS_Panic("Sort link type error : %u\n", type); // 报错,排序链表类型错误 + } + + LOS_SpinLockSave(spinLock, &intSave); // 保存自旋锁状态并禁止中断 + SET_SORTLIST_VALUE(node, startTime + (UINT64)waitTicks * OS_CYCLE_PER_TICK); // 设置节点的响应时间 + OsAddNode2SortLink(sortLinkHeader, node); // 将节点插入排序链表中 +#ifdef LOSCFG_KERNEL_SMP + node->cpuid = idleCpu; // 设置节点的CPU ID为空闲CPU的ID + if (idleCpu != ArchCurrCpuid()) { // 如果空闲CPU的ID不等于当前CPU的ID + LOS_MpSchedule(CPUID_TO_AFFI_MASK(idleCpu)); // 调度空闲CPU执行任务 + } +#endif + LOS_SpinUnlockRestore(spinLock, intSave); // 恢复自旋锁状态并允许中断 +} + +VOID OsDeleteSortLink(SortLinkList *node, SortLinkType type) +{ + UINT32 intSave; +#ifdef LOSCFG_KERNEL_SMP + Percpu *cpu = OsPercpuGetByID(node->cpuid); // 获取节点所在CPU的PerCPU结构体指针 +#else + Percpu *cpu = OsPercpuGetByID(0); // 获取CPU 0 的PerCPU结构体指针 +#endif +/*OsAdd2SortLink函数用于将节点插入排序链表中。在函数中,首先根据调度器的活动状态选择空闲的CPU。 +如果调度器处于活动状态,调用OsFindIdleCpu函数查找空闲的CPU;否则,获取当前CPU的ID, +并通过OsPercpuGet函数获取当前CPU的PerCPU结构体指针。然后,根据排序链表类型选择相应的排序链表头指针和自旋锁。 +接下来,保存自旋锁状态并禁止中断,设置节点的响应时间,将节点插入排序链表中,根据SMP配置设置节点的CPU ID, +并如果空闲CPU的ID不等于当前CPU的ID,调度空闲CPU执行任务。最后,恢复自旋锁状态并允许中断。 + +OsDeleteSortLink函数用于从排序链表中删除节点。在函数中,首先保存自旋锁状态并禁止中断。如果SMP配置开启, +根据节点的CPU ID获取节点所在CPU的PerCPU结构体指针;否则,获取CPU 0 的PerCPU结构体指针。*/ + + SPIN_LOCK_S *spinLock = NULL; + SortLinkAttribute *sortLinkHeader = NULL; + if (type == OS_SORT_LINK_TASK) { + sortLinkHeader = &cpu->taskSortLink; // 获取任务排序链表头指针 + spinLock = &cpu->taskSortLinkSpin; // 获取任务排序链表自旋锁 + } else if (type == OS_SORT_LINK_SWTMR) { + sortLinkHeader = &cpu->swtmrSortLink; // 获取软件定时器排序链表头指针 + spinLock = &cpu->swtmrSortLinkSpin; // 获取软件定时器排序链表自旋锁 + } else { + LOS_Panic("Sort link type error : %u\n", type); // 报错,排序链表类型错误 + } + + LOS_SpinLockSave(spinLock, &intSave); // 保存自旋锁状态并禁止中断 + if (node->responseTime != OS_SORT_LINK_INVALID_TIME) { // 如果节点的响应时间不为无效时间 + OsDeleteNodeSortLink(sortLinkHeader, node); // 从排序链表中删除节点 + } + LOS_SpinUnlockRestore(spinLock, intSave); // 恢复自旋锁状态并允许中断 +} +UINT64 OsGetNextExpireTime(UINT64 startTime) +{ + UINT32 intSave; + Percpu *cpu = OsPercpuGet(); // 获取当前CPU的PerCPU结构体指针 + SortLinkAttribute *taskHeader = &cpu->taskSortLink; // 获取任务排序链表头指针 + SortLinkAttribute *swtmrHeader = &cpu->swtmrSortLink; // 获取软件定时器排序链表头指针 + + LOS_SpinLockSave(&cpu->taskSortLinkSpin, &intSave); // 保存任务排序链表自旋锁状态并禁止中断 + UINT64 taskExpirTime = OsGetSortLinkNextExpireTime(taskHeader, startTime); // 获取任务排序链表中下一个过期时间 + LOS_SpinUnlockRestore(&cpu->taskSortLinkSpin, intSave); // 恢复任务排序链表自旋锁状态并允许中断 + + LOS_SpinLockSave(&cpu->swtmrSortLinkSpin, &intSave); // 保存软件定时器排序链表自旋锁状态并禁止中断 + UINT64 swtmrExpirTime = OsGetSortLinkNextExpireTime(swtmrHeader, startTime); // 获取软件定时器排序链表中下一个过期时间 + LOS_SpinUnlockRestore(&cpu->swtmrSortLinkSpin, intSave); // 恢复软件定时器排序链表自旋锁状态并允许中断 + + return (taskExpirTime < swtmrExpirTime) ? taskExpirTime : swtmrExpirTime; // 返回较小的过期时间 +} + +UINT32 OsSortLinkGetTargetExpireTime(const SortLinkList *targetSortList) +{ + UINT64 currTimes = OsGetCurrSchedTimeCycle(); // 获取当前调度时间 + if (currTimes >= targetSortList->responseTime) { // 如果当前时间大于等于目标排序链表节点的响应时间 + return 0; // 返回0,表示已经过期 + } + + return (UINT32)(targetSortList->responseTime - currTimes) / OS_CYCLE_PER_TICK; // 计算剩余的滴答数 +} + +UINT32 OsSortLinkGetNextExpireTime(const SortLinkAttribute *sortLinkHeader) +{ + LOS_DL_LIST *head = (LOS_DL_LIST *)&sortLinkHeader->sortLink; // 获取排序链表头节点 + + if (LOS_ListEmpty(head)) { // 如果排序链表为空 + return 0; // 返回0,表示没有过期时间 + } + + SortLinkList *listSorted = LOS_DL_LIST_ENTRY(head->pstNext, SortLinkList, sortLinkNode); // 获取排序链表中的第一个节点 + return OsSortLinkGetTargetExpireTime(listSorted); // 获取目标排序链表节点的过期时间 +} + } while (cpuID < LOSCFG_KERNEL_CORE_NUM); #endif From 305f40e848a0b5fce6433db642c6a2d4e86b6b85 Mon Sep 17 00:00:00 2001 From: pqk2c5h8v <3232796758@qq.com> Date: Mon, 4 Dec 2023 21:36:03 +0800 Subject: [PATCH 10/21] ADD file via upload --- process(800-1200).docx | Bin 0 -> 10895 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 process(800-1200).docx diff --git a/process(800-1200).docx b/process(800-1200).docx new file mode 100644 index 0000000000000000000000000000000000000000..e358788d49c765d2724de09df50840733b34e9b7 GIT binary patch literal 10895 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 AfB*mh literal 0 HcmV?d00001 From 594279cc80b4f6088b423c6956de0cf49ffeb6d8 Mon Sep 17 00:00:00 2001 From: pqk2c5h8v <3232796758@qq.com> Date: Mon, 4 Dec 2023 21:36:19 +0800 Subject: [PATCH 11/21] ADD file via upload --- process(800-1200).cpp | 426 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 426 insertions(+) create mode 100644 process(800-1200).cpp diff --git a/process(800-1200).cpp b/process(800-1200).cpp new file mode 100644 index 0000000..32abce8 --- /dev/null +++ b/process(800-1200).cpp @@ -0,0 +1,426 @@ +```c +// 去掉初始化标签 +kerInitProcess->processStatus &= ~OS_PROCESS_STATUS_INIT; +g_processGroup = kerInitProcess->group; +LOS_ListInit(&g_processGroup->groupList); +OsCurrProcessSet(kerInitProcess); + +// 创建内核态0号进程 +LosProcessCB *idleProcess = OS_PCB_FROM_PID(g_kernelIdleProcess); +ret = OsInitPCB(idleProcess, OS_KERNEL_MODE, OS_TASK_PRIORITY_LOWEST, "KIdle"); +if (ret != LOS_OK) { + return ret; +} +idleProcess->parentProcessID = kerInitProcess->processID; +LOS_ListTailInsert(&kerInitProcess->childrenList, &idleProcess->siblingList); +idleProcess->group = kerInitProcess->group; +LOS_ListTailInsert(&kerInitProcess->group->processList, &idleProcess->subordinateGroupList); + +#ifdef LOSCFG_SECURITY_CAPABILITY +idleProcess->user = kerInitProcess->user; +#endif + +#ifdef LOSCFG_FS_VFS +idleProcess->files = kerInitProcess->files; +#endif + +// 创建空闲任务并将其指定给内核态0号进程 +ret = OsIdleTaskCreate(); +if (ret != LOS_OK) { + return ret; +} +idleProcess->threadGroupID = OsPercpuGet()->idleTaskID; + +return LOS_OK; +``` + +```c +// 进程调度参数检查 +STATIC INLINE INT32 OsProcessSchedlerParamCheck(INT32 which, INT32 pid, UINT16 prio, UINT16 policy) +{ + if (OS_PID_CHECK_INVALID(pid)) { + return LOS_EINVAL; + } + + if (which != LOS_PRIO_PROCESS) { + return LOS_EINVAL; + } + + if (prio > OS_PROCESS_PRIORITY_LOWEST) { + return LOS_EINVAL; + } + + if (policy != LOS_SCHED_RR) { + return LOS_EINVAL; + } + + return LOS_OK; +} + +#ifdef LOSCFG_SECURITY_CAPABILITY +STATIC BOOL OsProcessCapPermitCheck(const LosProcessCB *processCB, UINT16 prio) +{ + LosProcessCB *runProcess = OsCurrProcessGet(); + + // 对于内核态进程直接通过检查 + if (!OsProcessIsUserMode(runProcess)) { + return TRUE; + } + + // 用户态进程可以降低自己的优先级 + if ((runProcess->processID == processCB->processID) && (prio > processCB->priority)) { + return TRUE; + } + + // 如果具有 CAP_SCHED_SETPRIORITY 权限,可以修改进程的优先级 + if (IsCapPermit(CAP_SCHED_SETPRIORITY)) { + return TRUE; + } + return FALSE; +} +#endif + +LITE_OS_SEC_TEXT INT32 OsSetProcessScheduler(INT32 which, INT32 pid, UINT16 prio, UINT16 policy) +{ + LosProcessCB *processCB = NULL; + BOOL needSched = FALSE; + UINT32 intSave; + INT32 ret; + + ret = OsProcessSchedlerParamCheck(which, pid, prio, policy); + if (ret != LOS_OK) { + return -ret; + } + + SCHEDULER_LOCK(intSave); + processCB = OS_PCB_FROM_PID(pid); + + // 如果进程未激活,则返回错误 + if (OsProcessIsInactive(processCB)) { + ret = LOS_ESRCH; + goto EXIT; + } + +#ifdef LOSCFG_SECURITY_CAPABILITY + // 如果权限不足,则返回错误 + if (!OsProcessCapPermitCheck(processCB, prio)) { + ret = LOS_EPERM; + goto EXIT; + } +#endif + + // 修改进程调度参数,判断是否需要进行调度 + needSched = OsSchedModifyProcessSchedParam(processCB, policy, prio); + SCHEDULER_UNLOCK(intSave); + + // 调度其他核上的进程 + LOS_MpSchedule(OS_MP_CPU_ALL); + + // 如果需要调度且调度器已经激活,则进行调度 + if (needSched && OS_SCHEDULER_ACTIVE) { + LOS_Schedule(); + } + return LOS_OK; + +EXIT: + SCHEDULER_UNLOCK(intSave); + return -ret; +} + +LITE_OS_SEC_TEXT INT32 LOS_SetProcessScheduler(INT32 pid, UINT16 policy, UINT16 prio) +{ + return OsSetProcessScheduler(LOS_PRIO_PROCESS, pid, prio, policy); +} + +LITE_OS_SEC_TEXT INT32 LOS_GetProcessScheduler(INT32 pid) +{ + UINT32 intSave; + + if (OS_PID_CHECK_INVALID(pid)) { + return -LOS_EINVAL; + } + + SCHEDULER_LOCK(intSave); + LosProcessCB *processCB = OS_PCB_FROM_PID(pid); + + // 如果进程未使用,则返回错误 + if (OsProcessIsUnused(processCB)) { + SCHEDULER_UNLOCK(intSave); + return -LOS_ESRCH; + } + + SCHEDULER_UNLOCK(intSave); + + return LOS_SCHED_RR; +} + +LITE_OS_SEC_TEXT INT32 LOS_SetProcessPriority(INT32 pid, UINT16 prio) +{ + return OsSetProcessScheduler(LOS_PRIO_PROCESS, pid, prio, LOS_GetProcessScheduler(pid)); +} + +LITE_OS_SEC_TEXT INT32 OsGetProcessPriority(INT32 which, INT32 pid) +{ + LosProcessCB *processCB = NULL; + INT32 prio; + UINT32 intSave; + (VOID)which; + + if (OS_PID_CHECK_INVALID(pid)) { + return -LOS_EINVAL; + } + + if (which != LOS_PRIO_PROCESS) { + return -LOS_EINVAL; + } + + SCHEDULER_LOCK(intSave); + processCB = OS_PCB_FROM_PID(pid); + + // 如果进程未使用,则返回错误 + if (OsProcessIsUnused(processCB)) { + prio = -LOS_ESRCH; + goto OUT; + } + + prio = (INT32)processCB->priority; + +OUT: + SCHEDULER_UNLOCK(intSave); + return prio; +} + +LITE_OS_SEC_TEXT INT32 LOS_GetProcessPriority(INT32 pid) +{ + return OsGetProcessPriority(LOS_PRIO_PROCESS, pid); +} + +// 将运行任务插入等待列表 +STATIC VOID OsWaitInsertWaitListInOrder(LosTaskCB *runTask, LosProcessCB *processCB) +{ + LOS_DL_LIST *head = &processCB->waitList; + LOS_DL_LIST *list = head; + LosTaskCB *taskCB = NULL; + + if (runTask->waitFlag == OS_PROCESS_WAIT_GID) { + while (list->pstNext != head) { + taskCB = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(list)); + + // 如果等待标记为 OS_PROCESS_WAIT_PRO,则继续查找下一个等待队列 + if (taskCB->waitFlag == OS_PROCESS_WAIT_PRO) { + list = list->pstNext; + continue; + } + break; + } + } else if (runTask->waitFlag == OS_PROCESS_WAIT_ANY) { + while (list->pstNext != head) { + taskCB = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(list)); + + // 如果等待标记不为 OS_PROCESS_WAIT_ANY,则继续查找下一个等待队列 + if (taskCB->waitFlag != OS_PROCESS_WAIT_ANY) { + list = list->pstNext; + continue; + } + break; + } + } +} + +``` +// 等待指定的子进程退出 +STATIC UINT32 OsWaitSetFlag(const LosProcessCB *processCB, INT32 pid, LosProcessCB **child) +{ + LosProcessCB *childCB = NULL; + ProcessGroup *group = NULL; + LosTaskCB *runTask = OsCurrTaskGet(); // 获取当前运行的任务控制块 + UINT32 ret; + + if (pid > 0) { + // 等待具有指定进程号的子进程退出 + childCB = OsFindExitChildProcess(processCB, pid); // 查找具有指定进程号的已退出的子进程 + if (childCB != NULL) { + goto WAIT_BACK; // 子进程已退出,则跳转到WAIT_BACK标签处 + } + + ret = OsFindChildProcess(processCB, pid); // 查找具有指定进程号的子进程是否存在 + if (ret != LOS_OK) { + return LOS_ECHILD; // 没有找到指定进程号的子进程,返回错误码LOS_ECHILD + } + runTask->waitFlag = OS_PROCESS_WAIT_PRO; // 设置当前任务的等待标志为进程号 + runTask->waitID = pid; // 设置当前任务等待的进程号为指定进程号 + } else if (pid == 0) { + // 等待同一进程组中的任何子进程退出 + childCB = OsFindGroupExitProcess(processCB->group, OS_INVALID_VALUE); // 查找同一进程组中的已退出的子进程 + if (childCB != NULL) { + goto WAIT_BACK; // 子进程已退出,则跳转到WAIT_BACK标签处 + } + runTask->waitID = processCB->group->groupID; // 设置当前任务等待的进程号为进程组号 + runTask->waitFlag = OS_PROCESS_WAIT_GID; // 设置当前任务的等待标志为进程组号 + } else if (pid == -1) { + // 等待任何子进程退出 + childCB = OsFindExitChildProcess(processCB, OS_INVALID_VALUE); // 查找任何已退出的子进程 + if (childCB != NULL) { + goto WAIT_BACK; // 子进程已退出,则跳转到WAIT_BACK标签处 + } + runTask->waitID = pid; // 设置当前任务等待的进程号为-1 + runTask->waitFlag = OS_PROCESS_WAIT_ANY; // 设置当前任务的等待标志为任何子进程 + } else { // pid < -1 + // 等待进程组号为pid绝对值的任何子进程退出 + group = OsFindProcessGroup(-pid); // 查找具有指定进程组号的进程组 + if (group == NULL) { + return LOS_ECHILD; // 没有找到指定进程组号的进程组,返回错误码LOS_ECHILD + } + + childCB = OsFindGroupExitProcess(group, OS_INVALID_VALUE); // 查找指定进程组中已退出的子进程 + if (childCB != NULL) { + goto WAIT_BACK; // 子进程已退出,则跳转到WAIT_BACK标签处 + } + + runTask->waitID = -pid; // 设置当前任务等待的进程号为进程组号的绝对值 + runTask->waitFlag = OS_PROCESS_WAIT_GID; // 设置当前任务的等待标志为进程组号 + } + +WAIT_BACK: + *child = childCB; // 返回已退出的子进程 + return LOS_OK; +} + +// 回收已退出的子进程资源,并返回进程号 +STATIC UINT32 OsWaitRecycleChildProcess(const LosProcessCB *childCB, UINT32 intSave, INT32 *status, siginfo_t *info) +{ + ProcessGroup *group = NULL; + UINT32 pid = childCB->processID; // 子进程的进程号 + UINT16 mode = childCB->processMode; // 子进程的运行模式 + INT32 exitCode = childCB->exitCode; // 子进程的退出码 + UINT32 uid = 0; + +#ifdef LOSCFG_SECURITY_CAPABILITY + if (childCB->user != NULL) { + uid = childCB->user->userID; // 子进程的用户ID + } +#endif + + OsRecycleZombiesProcess((LosProcessCB *)childCB, &group); // 回收已退出的子进程资源,并获取进程组 + + SCHEDULER_UNLOCK(intSave); // 解锁调度器 + + if (status != NULL) { + if (mode == OS_USER_MODE) { + (VOID)LOS_ArchCopyToUser((VOID *)status, (const VOID *)(&(exitCode)), sizeof(INT32)); // 拷贝退出码到用户空间 + } else { + *status = exitCode; // 将退出码保存到status中 + } + } + /* get signal info */ + if (info != NULL) { + siginfo_t tempinfo = { 0 }; + + tempinfo.si_signo = SIGCHLD; + tempinfo.si_errno = 0; + tempinfo.si_pid = pid; + tempinfo.si_uid = uid; + /* + * Process exit code + * 31 15 8 7 0 + * | | exit code | core dump | signal | + */ + if ((exitCode & 0x7f) == 0) { + tempinfo.si_code = CLD_EXITED; + tempinfo.si_status = (exitCode >> 8U); + } else { + tempinfo.si_code = (exitCode & 0x80) ? CLD_DUMPED : CLD_KILLED; + tempinfo.si_status = (exitCode & 0x7f); + } + + if (mode == OS_USER_MODE) { + (VOID)LOS_ArchCopyToUser((VOID *)(info), (const VOID *)(&(tempinfo)), sizeof(siginfo_t)); // 拷贝信号信息到用户空间 + } else { + (VOID)memcpy_s((VOID *)(info), sizeof(siginfo_t), (const VOID *)(&(tempinfo)), sizeof(siginfo_t)); + } + } + (VOID)LOS_MemFree(m_aucSysMem1, group); // 释放进程组资源 + return pid; // 返回子进程的进程号 +} + +// 检查等待子进程的具体信息 +STATIC UINT32 OsWaitChildProcessCheck(LosProcessCB *processCB, INT32 pid, LosProcessCB **childCB) +{ + if (LOS_ListEmpty(&(processCB->childrenList)) && LOS_ListEmpty(&(processCB->exitChildList))) { + return LOS_ECHILD; // 没有子进程,则返回错误码LOS_ECHILD + } + + return OsWaitSetFlag(processCB, pid, childCB); // 设置等待标志等信息 +} + +// 检查等待选项是否正确 +STATIC UINT32 OsWaitOptionsCheck(UINT32 options) +{ + UINT32 flag = LOS_WAIT_WNOHANG | LOS_WAIT_WUNTRACED | LOS_WAIT_WCONTINUED; + + flag = ~flag & options; + if (flag != 0) { + return LOS_EINVAL; // 选项不正确,返回错误码LOS_EINVAL + } + + if ((options & (LOS_WAIT_WCONTINUED | LOS_WAIT_WUNTRACED)) != 0) { + return LOS_EOPNOTSUPP; // 不支持的选项,返回错误码LOS_EOPNOTSUPP + } + + if (OS_INT_ACTIVE) { + return LOS_EINTR; // 当前处于中断上下文中,返回错误码LOS_EINTR + } + + return LOS_OK; // 选项正确,返回LOS_OK +} + +// 等待子进程退出 +STATIC INT32 OsWait(INT32 pid, USER INT32 *status, USER siginfo_t *info, UINT32 options, VOID *rusage) +{ + (VOID)rusage; + UINT32 ret; + UINT32 intSave; + LosProcessCB *childCB = NULL; + LosProcessCB *processCB = NULL; + LosTaskCB *runTask = NULL; + + SCHEDULER_LOCK(intSave); // 加锁调度器 + processCB = OsCurrProcessGet(); // 获取当前进程控制块 + runTask = OsCurrTaskGet(); // 获取当前任务控制块 + + ret = OsWaitChildProcessCheck(processCB, pid, &childCB); // 检查等待子进程的具体信息 + if (ret != LOS_OK) { + pid = -ret; // 若等待子进程的标志不正确,将错误码赋值给pid + goto ERROR; + } + + if (childCB != NULL) { + return (INT32)OsWaitRecycleChildProcess(childCB, intSave, status, info); // 回收已退出的子进程资源并返回进程号 + } + + if ((options & LOS_WAIT_WNOHANG) != 0) { + runTask->waitFlag = 0; // 不阻塞任务 + pid = 0; + goto ERROR; + } + + OsWaitInsertWaitListInOrder(runTask, processCB); // 将当前任务插入等待列表中 + + runTask->waitFlag = 0; + if (runTask->waitID == OS_INVALID_VALUE) { + pid = -LOS_ECHILD; // 没有子进程需要等待,返回错误码LOS_ECHILD + goto ERROR; + } + + childCB = OS_PCB_FROM_PID(runTask->waitID); // 根据等待的进程号获取子进程控制块 + if (!(childCB->processStatus & OS_PROCESS_STATUS_ZOMBIES)) { + pid = -LOS_ESRCH; // 子进程没有退出,返回错误码LOS_ESRCH + goto ERROR; + } + + return (INT32)OsWaitRecycleChildProcess(childCB, intSave, status, info); // 回收已退出的子进程资源并返回进程号 + +ERROR: + SCHEDULER_UNLOCK(intSave); // 解锁调度器 + return pid; +} \ No newline at end of file From bbb74e871835cd840ab8ae2eedcd9a3d8ae32f88 Mon Sep 17 00:00:00 2001 From: pvrb8ka45 <1664581173@qq.com> Date: Mon, 4 Dec 2023 22:41:29 +0800 Subject: [PATCH 12/21] process1520-2000 --- process1520-2000.c | 460 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 460 insertions(+) create mode 100644 process1520-2000.c diff --git a/process1520-2000.c b/process1520-2000.c new file mode 100644 index 0000000..ebd7a64 --- /dev/null +++ b/process1520-2000.c @@ -0,0 +1,460 @@ +STATIC UINT32 OsLoadUserInit(LosProcessCB *processCB) +{ + /* userInitTextStart ----- + * | user text |//定义起始位置的指针变量// + * + * | user data | initSize + * userInitBssStart ---//定义结束位置的指针变量// + * | user bss | initBssSize + * userInitEnd --- ----- + */ + errno_t errRet; + INT32 ret; + CHAR *userInitTextStart = (CHAR *)&__user_init_entry; + CHAR *userInitBssStart = (CHAR *)&__user_init_bss; + CHAR *userInitEnd = (CHAR *)&__user_init_end; + UINT32 initBssSize = userInitEnd - userInitBssStart;//计算 BSS 段(未初始化数据段)的大小 initBssSize// + UINT32 initSize = userInitEnd - userInitTextStart;//计算和整个初始化段(包括 text、data 和 bss)的大小 // + VOID *userBss = NULL; + VOID *userText = NULL; + + if ((LOS_Align((UINTPTR)userInitTextStart, PAGE_SIZE) != (UINTPTR)userInitTextStart) || + (LOS_Align((UINTPTR)userInitEnd, PAGE_SIZE) != (UINTPTR)userInitEnd)) { + return LOS_EINVAL;//检查 userInitTextStart 和 userInitEnd 是否都按页对齐// + } + + if ((initSize == 0) || (initSize <= initBssSize)) { + return LOS_EINVAL;//检查 initSize 是否为零或者小于等于 initBssSize,如果是,则返回错误码 LOS_EINVAL// + } + + userText = LOS_PhysPagesAllocContiguous(initSize >> PAGE_SHIFT); + if (userText == NULL) { + return LOS_NOK;//使用 LOS_PhysPagesAllocContiguous 函数为用户空间初始化段分配连续的物理页面,并将地址赋值给 userText// + } + + errRet = memcpy_s(userText, initSize, (VOID *)&__user_init_load_addr, initSize - initBssSize); + if (errRet != EOK) { + PRINT_ERR("Load user init text, data and bss failed! err : %d\n", errRet); + goto ERROR;//使用 memcpy_s 将初始化段的 text 和 data 部分从 __user_init_load_addr 复制到新分配的 userText 指向的内存区域// + } + ret = LOS_VaddrToPaddrMmap(processCB->vmSpace, (VADDR_T)(UINTPTR)userInitTextStart, LOS_PaddrQuery(userText), + initSize, VM_MAP_REGION_FLAG_PERM_READ | VM_MAP_REGION_FLAG_PERM_WRITE | + VM_MAP_REGION_FLAG_FIXED | VM_MAP_REGION_FLAG_PERM_EXECUTE | + VM_MAP_REGION_FLAG_PERM_USER); + if (ret < 0) { + PRINT_ERR("Mmap user init text, data and bss failed! err : %d\n", ret); + goto ERROR;//使用 LOS_VaddrToPaddrMmap 函数将新分配的物理页面映射到进程的虚拟地址空间// + } + + /* The User init boot segment may not actually exist */ + if (initBssSize != 0) { + userBss = (VOID *)((UINTPTR)userText + userInitBssStart - userInitTextStart); + errRet = memset_s(userBss, initBssSize, 0, initBssSize); + if (errRet != EOK) { + PRINT_ERR("memset user init bss failed! err : %d\n", errRet); + goto ERROR;//如果存在 BSS 段(initBssSize 不为 0),则使用 memset_s 函数将 BSS 段的内存清零// + } + } + + return LOS_OK; + +ERROR: + (VOID)LOS_PhysPagesFreeContiguous(userText, initSize >> PAGE_SHIFT); + return LOS_NOK; +} + +LITE_OS_SEC_TEXT_INIT UINT32 OsUserInitProcess(VOID) +{ + UINT32 ret; + UINT32 size; + TSK_INIT_PARAM_S param = { 0 }; + VOID *stack = NULL; + + LosProcessCB *processCB = OS_PCB_FROM_PID(g_userInitProcess); + ret = OsProcessCreateInit(processCB, OS_USER_MODE, "Init", OS_PROCESS_USERINIT_PRIORITY); + if (ret != LOS_OK) { + return ret; + } + + ret = OsLoadUserInit(processCB); + if (ret != LOS_OK) { + goto ERROR; + } + + stack = OsUserInitStackAlloc(processCB, &size); + if (stack == NULL) { + PRINT_ERR("Alloc user init process user stack failed!\n"); + goto ERROR;//如果在复制或内存映射过程中发生错误,会跳转到 ERROR 标签处理错误情况,释放已分配资源并返回错误码// + } + + param.pfnTaskEntry = (TSK_ENTRY_FUNC)(CHAR *)&__user_init_entry; + param.userParam.userSP = (UINTPTR)stack + size; + param.userParam.userMapBase = (UINTPTR)stack; + param.userParam.userMapSize = size; + param.uwResved = OS_TASK_FLAG_PTHREAD_JOIN; + ret = OsUserInitProcessStart(g_userInitProcess, ¶m); + if (ret != LOS_OK) { + (VOID)OsUnMMap(processCB->vmSpace, param.userParam.userMapBase, param.userParam.userMapSize); + goto ERROR; + } + + return LOS_OK;//如果一切顺利,函数最后返回 LOS_OK,表示用户空间初始化程序加载成功// + +ERROR: + OsDeInitPCB(processCB);//在发生错误时,调用此函数来清理进程控制块// + return ret;//返回错误码// +} + +STATIC UINT32 OsCopyUser(LosProcessCB *childCB, LosProcessCB *parentCB) +{ +#ifdef LOSCFG_SECURITY_CAPABILITY//执行用户信息的复制// + UINT32 size = sizeof(User) + sizeof(UINT32) * (parentCB->user->groupNumber - 1);//算需要复制的用户信息所需的内存大小// + childCB->user = LOS_MemAlloc(m_aucSysMem1, size);//为子进程分配内存来存储用户信息// + if (childCB->user == NULL) { + return LOS_ENOMEM;//如果分配失败,返回 LOS_ENOMEM 表示内存不足// + } + + (VOID)memcpy_s(childCB->user, size, parentCB->user, size);//使用 memcpy_s 将父进程的用户信息复制到子进程// +#endif + return LOS_OK;//返回 LOS_OK 表示成功// +} + +STATIC VOID OsInitCopyTaskParam(LosProcessCB *childProcessCB, const CHAR *name, UINTPTR entry, UINT32 size, + TSK_INIT_PARAM_S *childPara) +{ + LosTaskCB *mainThread = NULL; + UINT32 intSave;//初始化子进程的任务参数// + + SCHEDULER_LOCK(intSave); + mainThread = OsCurrTaskGet();//锁定调度器以保证线程安全// + + if (OsProcessIsUserMode(childProcessCB)) { + childPara->pfnTaskEntry = mainThread->taskEntry; + childPara->uwStackSize = mainThread->stackSize; + childPara->userParam.userArea = mainThread->userArea; + childPara->userParam.userMapBase = mainThread->userMapBase; + childPara->userParam.userMapSize = mainThread->userMapSize;//根据子进程是否为用户模式,设置任务入口点、堆栈大小以及其他用户特定的参数// + } else { + childPara->pfnTaskEntry = (TSK_ENTRY_FUNC)entry; + childPara->uwStackSize = size; + } + childPara->pcName = (CHAR *)name; + childPara->policy = mainThread->policy; + childPara->usTaskPrio = mainThread->priority; + childPara->processID = childProcessCB->processID;//设置任务名称、调度策略、优先级等信息// + if (mainThread->taskStatus & OS_TASK_FLAG_PTHREAD_JOIN) { + childPara->uwResved = OS_TASK_FLAG_PTHREAD_JOIN; + } else if (mainThread->taskStatus & OS_TASK_FLAG_DETACHED) { + childPara->uwResved = OS_TASK_FLAG_DETACHED;//如果当前任务支持线程的 join 操作或者是 detached 状态,则相应地设置标志位// + } + + SCHEDULER_UNLOCK(intSave);//解锁调度器// +} + +STATIC UINT32 OsCopyTask(UINT32 flags, LosProcessCB *childProcessCB, const CHAR *name, UINTPTR entry, UINT32 size) +{//创建一个新的任务,作为子进程的主线程// + LosTaskCB *runTask = OsCurrTaskGet(); + TSK_INIT_PARAM_S childPara = { 0 }; + UINT32 ret; + UINT32 intSave; + UINT32 taskID; + + OsInitCopyTaskParam(childProcessCB, name, entry, size, &childPara); + + ret = LOS_TaskCreateOnly(&taskID, &childPara);//调用 LOS_TaskCreateOnly 来创建任务,仅创建任务而不立即运行// + if (ret != LOS_OK) { + if (ret == LOS_ERRNO_TSK_TCB_UNAVAILABLE) { + return LOS_EAGAIN; + } + return LOS_ENOMEM;//如果任务创建失败,根据错误类型返回相应的错误码(如 LOS_EAGAIN 表示资源暂时不可用,LOS_ENOMEM 表示内存不足)// + } + + LosTaskCB *childTaskCB = OS_TCB_FROM_TID(taskID);//获取新创建任务的任务控制块指针// + childTaskCB->taskStatus = runTask->taskStatus; + if (childTaskCB->taskStatus & OS_TASK_STATUS_RUNNING) { + childTaskCB->taskStatus &= ~OS_TASK_STATUS_RUNNING; + } else { + if (OS_SCHEDULER_ACTIVE) { + LOS_Panic("Clone thread status not running error status: 0x%x\n", childTaskCB->taskStatus); + }//如果子任务的状态为运行状态,则清除运行状态位// + childTaskCB->taskStatus &= ~OS_TASK_STATUS_UNUSED; + childProcessCB->priority = OS_PROCESS_PRIORITY_LOWEST;//如果调度器处于激活状态并且子任务不在运行状态,触发内核恐慌// + } + + if (OsProcessIsUserMode(childProcessCB)) { + SCHEDULER_LOCK(intSave); + OsUserCloneParentStack(childTaskCB->stackPointer, runTask->topOfStack, runTask->stackSize); + SCHEDULER_UNLOCK(intSave); + } + return LOS_OK; +} + +STATIC UINT32 OsCopyParent(UINT32 flags, LosProcessCB *childProcessCB, LosProcessCB *runProcessCB) +{ + UINT32 ret; + UINT32 intSave; + LosProcessCB *parentProcessCB = NULL; + + SCHEDULER_LOCK(intSave);//锁定调度器以保证线程安全// + childProcessCB->priority = runProcessCB->priority; + + if (flags & CLONE_PARENT) { + parentProcessCB = OS_PCB_FROM_PID(runProcessCB->parentProcessID); + } else { + parentProcessCB = runProcessCB; + }//根据 flags 中的 CLONE_PARENT 位决定子进程的父进程是当前进程的父进程还是当前进程本身// + childProcessCB->parentProcessID = parentProcessCB->processID; + LOS_ListTailInsert(&parentProcessCB->childrenList, &childProcessCB->siblingList); + childProcessCB->group = parentProcessCB->group; + LOS_ListTailInsert(&parentProcessCB->group->processList, &childProcessCB->subordinateGroupList); + ret = OsCopyUser(childProcessCB, parentProcessCB);//调用 OsCopyUser 函数复制用户信息// + + SCHEDULER_UNLOCK(intSave);//解锁调度器// + return ret; +} + +STATIC UINT32 OsCopyMM(UINT32 flags, LosProcessCB *childProcessCB, LosProcessCB *runProcessCB) +{ + status_t status; + UINT32 intSave; + + if (!OsProcessIsUserMode(childProcessCB)) { + return LOS_OK;//如果子进程不是用户模式,直接返回 LOS_OK// + } + + if (flags & CLONE_VM) { + SCHEDULER_LOCK(intSave); + childProcessCB->vmSpace->archMmu.virtTtb = runProcessCB->vmSpace->archMmu.virtTtb; + childProcessCB->vmSpace->archMmu.physTtb = runProcessCB->vmSpace->archMmu.physTtb; + SCHEDULER_UNLOCK(intSave); + return LOS_OK;//如果 flags 中的 CLONE_VM 位被设置,表示需要共享虚拟内存空间,那么将父进程的虚拟内存表指针复制给子进程,并返回 LOS_OK// + } + + status = LOS_VmSpaceClone(runProcessCB->vmSpace, childProcessCB->vmSpace); + if (status != LOS_OK) { + return LOS_ENOMEM; + } + return LOS_OK;//如果没有设置 CLONE_VM 位,则调用 LOS_VmSpaceClone 函数来克隆父进程的虚拟内存空间给子进程// +} + +STATIC UINT32 OsCopyFile(UINT32 flags, LosProcessCB *childProcessCB, LosProcessCB *runProcessCB) +{ +#ifdef LOSCFG_FS_VFS + if (flags & CLONE_FILES) { + childProcessCB->files = runProcessCB->files; + } else { + childProcessCB->files = dup_fd(runProcessCB->files); + } + if (childProcessCB->files == NULL) { + return LOS_ENOMEM;//如果虚拟内存空间克隆失败,返回 LOS_ENOMEM 表示内存不足// + } +#endif + + childProcessCB->consoleID = runProcessCB->consoleID; + childProcessCB->umask = runProcessCB->umask; + return LOS_OK; +} + +STATIC UINT32 OsForkInitPCB(UINT32 flags, LosProcessCB *child, const CHAR *name, UINTPTR sp, UINT32 size) +{//初始化子进程的进程控制块(PCB)// + UINT32 ret; + LosProcessCB *run = OsCurrProcessGet(); + + ret = OsInitPCB(child, run->processMode, OS_PROCESS_PRIORITY_LOWEST, name); + if (ret != LOS_OK) { + return ret; + }//调用 OsInitPCB 来初始化 PCB 的基本信息// + + ret = OsCopyParent(flags, child, run); + if (ret != LOS_OK) { + return ret; + } + + return OsCopyTask(flags, child, name, sp, size);//继续调用 OsCopyParent 复制父进程的某些资源给子进程,最后调用 OsCopyTask 来复制任务相关的资源// +} + +STATIC UINT32 OsChildSetProcessGroupAndSched(LosProcessCB *child, LosProcessCB *run) +{//用于将子进程设置到正确的进程组,并将其加入到调度队列中// + UINT32 intSave; + UINT32 ret; + ProcessGroup *group = NULL; + + SCHEDULER_LOCK(intSave); + if (run->group->groupID == OS_USER_PRIVILEGE_PROCESS_GROUP) { + ret = OsSetProcessGroupIDUnsafe(child->processID, child->processID, &group); + if (ret != LOS_OK) { + SCHEDULER_UNLOCK(intSave); + return LOS_ENOMEM; + } + }//如果父进程属于用户特权进程组,则会为子进程创建一个新的进程组// + + OsSchedTaskEnQueue(OS_TCB_FROM_TID(child->threadGroupID)); + SCHEDULER_UNLOCK(intSave); + + (VOID)LOS_MemFree(m_aucSysMem1, group); + return LOS_OK;//将子进程的主线程加入调度队列,并释放之前可能分配的进程组内存// +} + +STATIC UINT32 OsCopyProcessResources(UINT32 flags, LosProcessCB *child, LosProcessCB *run) +{//负责复制父进程的资源给子进程,包括内存管理单元、文件描述符等// + UINT32 ret; + + ret = OsCopyMM(flags, child, run); + if (ret != LOS_OK) { + return ret; + } + + ret = OsCopyFile(flags, child, run); + if (ret != LOS_OK) { + return ret; + }//如果系统配置了 LOSCFG_KERNEL_LITEIPC,则还需要重新初始化 IPC 资源// + +#ifdef LOSCFG_KERNEL_LITEIPC + if (OsProcessIsUserMode(child)) { + ret = LiteIpcPoolReInit(&child->ipcInfo, (const ProcIpcInfo *)(&run->ipcInfo)); + if (ret != LOS_OK) { + return LOS_ENOMEM; + } + } +#endif + +#ifdef LOSCFG_SECURITY_CAPABILITY + OsCopyCapability(run, child); +#endif + + return LOS_OK;//如果配置了 LOSCFG_SECURITY_CAPABILITY,还需要复制安全能力// +} + +STATIC INT32 OsCopyProcess(UINT32 flags, const CHAR *name, UINTPTR sp, UINT32 size) +{ + UINT32 intSave, ret, processID; + LosProcessCB *run = OsCurrProcessGet(); + + LosProcessCB *child = OsGetFreePCB(); + if (child == NULL) { + return -LOS_EAGAIN; + } + processID = child->processID;//获取一个空闲的 PCB,然后通过调用 OsForkInitPCB 初始化 PCB// + + ret = OsForkInitPCB(flags, child, name, sp, size); + if (ret != LOS_OK) { + goto ERROR_INIT; + } + + ret = OsCopyProcessResources(flags, child, run); + if (ret != LOS_OK) { + goto ERROR_TASK; + }//通过 OsCopyProcessResources 复制资源// + + ret = OsChildSetProcessGroupAndSched(child, run); + if (ret != LOS_OK) { + goto ERROR_TASK; + } + + LOS_MpSchedule(OS_MP_CPU_ALL); + if (OS_SCHEDULER_ACTIVE) { + LOS_Schedule(); + } + + return processID;//通过 OsChildSetProcessGroupAndSched 设置进程组和调度。如果任何步骤失败,它会跳转到错误处理部分并释放已分配的资源// + +ERROR_TASK: + SCHEDULER_LOCK(intSave); + (VOID)OsTaskDeleteUnsafe(OS_TCB_FROM_TID(child->threadGroupID), OS_PRO_EXIT_OK, intSave);//调用来删除已经创建但未能成功完成初始化的子进程的主线程// +ERROR_INIT: + OsDeInitPCB(child); + return -ret;//调用来释放和反初始化进程控制块(PCB)// +} + +LITE_OS_SEC_TEXT INT32 OsClone(UINT32 flags, UINTPTR sp, UINT32 size) +{ + UINT32 cloneFlag = CLONE_PARENT | CLONE_THREAD | CLONE_VFORK | CLONE_VM; + + if (flags & (~cloneFlag)) { + PRINT_WARN("Clone dont support some flags!\n");//检查传入的 flags 参数,并确保没有不支持的标志被设置。如果有不支持的标志,它会打印警告// + } + + return OsCopyProcess(cloneFlag & flags, NULL, sp, size);//调用 OsCopyProcess 来实际创建一个新的进程或线程// +} + +LITE_OS_SEC_TEXT INT32 LOS_Fork(UINT32 flags, const CHAR *name, const TSK_ENTRY_FUNC entry, UINT32 stackSize) +{//供了一个创建新进程的接口,类似于 UNIX 系统中的 fork 系统调用// + UINT32 cloneFlag = CLONE_PARENT | CLONE_THREAD | CLONE_VFORK | CLONE_FILES; + + if (flags & (~cloneFlag)) { + PRINT_WARN("Clone dont support some flags!\n"); + }//检查 flags 参数,确保没有不支持的标志被设置,并添加 CLONE_FILES 标志,以便子进程可以共享文件描述符表// + + flags |= CLONE_FILES; + return OsCopyProcess(cloneFlag & flags, name, (UINTPTR)entry, stackSize); +} +#else +LITE_OS_SEC_TEXT_INIT UINT32 OsUserInitProcess(VOID) +{ + return 0; +} +#endif//OsCopyProcess 函数来创建一个新的进程// + +LITE_OS_SEC_TEXT VOID LOS_Exit(INT32 status) +{//允许一个进程退出并释放资源// + UINT32 intSave; + + /* The exit of a kernel - state process must be kernel - state and all threads must actively exit */ + LosProcessCB *processCB = OsCurrProcessGet(); + SCHEDULER_LOCK(intSave);//如果当前进程是内核态进程且拥有多个线程,则不允许直接退出// + if (!OsProcessIsUserMode(processCB) && (processCB->threadNumber != 1)) { + SCHEDULER_UNLOCK(intSave); + PRINT_ERR("Kernel-state processes with multiple threads are not allowed to exit directly\n"); + return; + } + SCHEDULER_UNLOCK(intSave); + + OsTaskExitGroup((UINT32)status); + OsProcessExit(OsCurrTaskGet(), (UINT32)status);//如果条件允许,它会调用 OsTaskExitGroup 和 OsProcessExit 来完成退出流程// +} + +LITE_OS_SEC_TEXT INT32 LOS_GetUsedPIDList(UINT32 *pidList, INT32 pidMaxNum) +{//这个函数用于获取当前正在使用的所有进程的 PID 列表// + LosProcessCB *pcb = NULL; + INT32 num = 0; + UINT32 intSave; + UINT32 pid = 1; + + if (pidList == NULL) { + return 0; + }//它通过遍历所有可能的 PID 并检查对应的 PCB 是否正在使用来实现// + SCHEDULER_LOCK(intSave); + while (OsProcessIDUserCheckInvalid(pid) == false) { + pcb = OS_PCB_FROM_PID(pid); + pid++; + if (OsProcessIsUnused(pcb)) { + continue; + } + pidList[num] = pcb->processID; + num++; + if (num >= pidMaxNum) { + break; + } + } + SCHEDULER_UNLOCK(intSave); + return num;//如果 PCB 正在使用,它将该 PCB 的 PID 添加到 pidList 数组中,并返回找到的 PID 数量// +} + +#ifdef LOSCFG_FS_VFS +LITE_OS_SEC_TEXT struct fd_table_s *LOS_GetFdTable(UINT32 pid) +{//返回指定 PID 的进程的文件描述符表// + LosProcessCB *pcb = NULL; + struct files_struct *files = NULL;//它首先检查 PID 是否有效,然后获取对应的 PCB 和文件结构体 files// + + if (OS_PID_CHECK_INVALID(pid)) { + return NULL; + } + pcb = OS_PCB_FROM_PID(pid); + files = pcb->files; + if (files == NULL) { + return NULL; + } + + return files->fdt;//如果这些结构体有效,它返回文件描述符表 fdt// +} + From 1062c7c1d10386c3e6b9b1f64969dcbb5fd4ebb6 Mon Sep 17 00:00:00 2001 From: zengqi <173384268@qq.com> Date: Fri, 22 Dec 2023 19:08:19 +0800 Subject: [PATCH 13/21] =?UTF-8?q?=E6=9B=BE=E7=90=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sched/sched_sq/los_sched.c | 9 +- sched/sched_sq/los_sortlink.c | 231 ---------------------------------- 2 files changed, 8 insertions(+), 232 deletions(-) diff --git a/sched/sched_sq/los_sched.c b/sched/sched_sq/los_sched.c index 5c98dc3..1fab649 100644 --- a/sched/sched_sq/los_sched.c +++ b/sched/sched_sq/los_sched.c @@ -744,7 +744,13 @@ VOID OsSchedTaskWake(LosTaskCB *resumedTask) if (!(resumedTask->taskStatus & OS_TASK_STATUS_SUSPENDED)) { // 如果任务没有被挂起 #ifdef LOSCFG_SCHED_DEBUG - resumedTask->schedStat.pendTime += OsGetCurrSchedTimeCycle() - resumedTask-> + resumedTask->schedStat.pendTime += OsGetCurrSchedTimeCycle() - resumedTask->startTime; + resumedTask->schedStat.pendCount++; +#endif + OsSchedTaskEnQueue(resumedTask); + } +} + BOOL OsSchedModifyTaskSchedParam(LosTaskCB *taskCB, UINT16 policy, UINT16 priority) { if (taskCB->policy != policy) { // 如果任务的调度策略与传入的策略不同 @@ -773,6 +779,7 @@ BOOL OsSchedModifyTaskSchedParam(LosTaskCB *taskCB, UINT16 policy, UINT16 priori return FALSE; // 返回不需要进行调度 } + BOOL OsSchedModifyProcessSchedParam(LosProcessCB *processCB, UINT16 policy, UINT16 priority) { LosTaskCB *taskCB = NULL; diff --git a/sched/sched_sq/los_sortlink.c b/sched/sched_sq/los_sortlink.c index 9a29f12..52770ad 100644 --- a/sched/sched_sq/los_sortlink.c +++ b/sched/sched_sq/los_sortlink.c @@ -29,126 +29,6 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "los_sortlink_pri.h" -#include "los_memory.h" -#include "los_exc.h" -#include "los_percpu_pri.h" -#include "los_sched_pri.h" -#include "los_mp.h" - -UINT32 OsSortLinkInit(SortLinkAttribute *sortLinkHeader) -{ - LOS_ListInit(&sortLinkHeader->sortLink); - sortLinkHeader->nodeNum = 0; - return LOS_OK; -} - -STATIC INLINE VOID OsAddNode2SortLink(SortLinkAttribute *sortLinkHeader, SortLinkList *sortList) -{ - LOS_DL_LIST *head = (LOS_DL_LIST *)&sortLinkHeader->sortLink; - - if (LOS_ListEmpty(head)) { - LOS_ListHeadInsert(head, &sortList->sortLinkNode); - sortLinkHeader->nodeNum++; - return; - } - - SortLinkList *listSorted = LOS_DL_LIST_ENTRY(head->pstNext, SortLinkList, sortLinkNode); - if (listSorted->responseTime > sortList->responseTime) { - LOS_ListAdd(head, &sortList->sortLinkNode); - sortLinkHeader->nodeNum++; - return; - } else if (listSorted->responseTime == sortList->responseTime) { - LOS_ListAdd(head->pstNext, &sortList->sortLinkNode); - sortLinkHeader->nodeNum++; - return; - } - - LOS_DL_LIST *prevNode = head->pstPrev; - do { - listSorted = LOS_DL_LIST_ENTRY(prevNode, SortLinkList, sortLinkNode); - if (listSorted->responseTime <= sortList->responseTime) { - LOS_ListAdd(prevNode, &sortList->sortLinkNode); - sortLinkHeader->nodeNum++; - break; - } - - prevNode = prevNode->pstPrev; - } while (1); -} - -VOID OsDeleteNodeSortLink(SortLinkAttribute *sortLinkHeader, SortLinkList *sortList) -{ - LOS_ListDelete(&sortList->sortLinkNode); - SET_SORTLIST_VALUE(sortList, OS_SORT_LINK_INVALID_TIME); - sortLinkHeader->nodeNum--; -} - -STATIC INLINE UINT64 OsGetSortLinkNextExpireTime(SortLinkAttribute *sortHeader, UINT64 startTime) -{ - LOS_DL_LIST *head = &sortHeader->sortLink; - LOS_DL_LIST *list = head->pstNext; - - if (LOS_ListEmpty(head)) { - return OS_SCHED_MAX_RESPONSE_TIME - OS_TICK_RESPONSE_PRECISION; - } - - SortLinkList *listSorted = LOS_DL_LIST_ENTRY(list, SortLinkList, sortLinkNode); - if (listSorted->responseTime <= (startTime + OS_TICK_RESPONSE_PRECISION)) { - return startTime + OS_TICK_RESPONSE_PRECISION; - } - - return listSorted->responseTime; -} - -STATIC Percpu *OsFindIdleCpu(UINT16 *idleCpuID) -{ - Percpu *idleCpu = OsPercpuGetByID(0); - *idleCpuID = 0; - -#ifdef LOSCFG_KERNEL_SMP - UINT16 cpuID = 1; - UINT32 nodeNum = idleCpu->taskSortLink.nodeNum + idleCpu->swtmrSortLink.nodeNum; - - do { - Percpu *cpu = OsPercpuGetByID(cpuID); - UINT32 temp = cpu->taskSortLink.nodeNum + cpu->swtmrSortLink.nodeNum; - if (nodeNum > temp) { - idleCpu = cpu; - *idleCpuID = cpuID; - } - - cpuID++;/* - * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved. - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - #include "los_sortlink_pri.h" #include "los_memory.h" #include "los_exc.h" @@ -368,114 +248,3 @@ UINT32 OsSortLinkGetNextExpireTime(const SortLinkAttribute *sortLinkHeader) return OsSortLinkGetTargetExpireTime(listSorted); // 获取目标排序链表节点的过期时间 } - } while (cpuID < LOSCFG_KERNEL_CORE_NUM); -#endif - - return idleCpu; -} - -VOID OsAdd2SortLink(SortLinkList *node, UINT64 startTime, UINT32 waitTicks, SortLinkType type) -{ - UINT32 intSave; - Percpu *cpu = NULL; - SortLinkAttribute *sortLinkHeader = NULL; - SPIN_LOCK_S *spinLock = NULL; - UINT16 idleCpu; - - if (OS_SCHEDULER_ACTIVE) { - cpu = OsFindIdleCpu(&idleCpu); - } else { - idleCpu = ArchCurrCpuid(); - cpu = OsPercpuGet(); - } - - if (type == OS_SORT_LINK_TASK) { - sortLinkHeader = &cpu->taskSortLink; - spinLock = &cpu->taskSortLinkSpin; - } else if (type == OS_SORT_LINK_SWTMR) { - sortLinkHeader = &cpu->swtmrSortLink; - spinLock = &cpu->swtmrSortLinkSpin; - } else { - LOS_Panic("Sort link type error : %u\n", type); - } - - LOS_SpinLockSave(spinLock, &intSave); - SET_SORTLIST_VALUE(node, startTime + (UINT64)waitTicks * OS_CYCLE_PER_TICK); - OsAddNode2SortLink(sortLinkHeader, node); -#ifdef LOSCFG_KERNEL_SMP - node->cpuid = idleCpu; - if (idleCpu != ArchCurrCpuid()) { - LOS_MpSchedule(CPUID_TO_AFFI_MASK(idleCpu)); - } -#endif - LOS_SpinUnlockRestore(spinLock, intSave); -} - -VOID OsDeleteSortLink(SortLinkList *node, SortLinkType type) -{ - UINT32 intSave; -#ifdef LOSCFG_KERNEL_SMP - Percpu *cpu = OsPercpuGetByID(node->cpuid); -#else - Percpu *cpu = OsPercpuGetByID(0); -#endif - - SPIN_LOCK_S *spinLock = NULL; - SortLinkAttribute *sortLinkHeader = NULL; - if (type == OS_SORT_LINK_TASK) { - sortLinkHeader = &cpu->taskSortLink; - spinLock = &cpu->taskSortLinkSpin; - } else if (type == OS_SORT_LINK_SWTMR) { - sortLinkHeader = &cpu->swtmrSortLink; - spinLock = &cpu->swtmrSortLinkSpin; - } else { - LOS_Panic("Sort link type error : %u\n", type); - } - - LOS_SpinLockSave(spinLock, &intSave); - if (node->responseTime != OS_SORT_LINK_INVALID_TIME) { - OsDeleteNodeSortLink(sortLinkHeader, node); - } - LOS_SpinUnlockRestore(spinLock, intSave); -} - -UINT64 OsGetNextExpireTime(UINT64 startTime) -{ - UINT32 intSave; - Percpu *cpu = OsPercpuGet(); - SortLinkAttribute *taskHeader = &cpu->taskSortLink; - SortLinkAttribute *swtmrHeader = &cpu->swtmrSortLink; - - LOS_SpinLockSave(&cpu->taskSortLinkSpin, &intSave); - UINT64 taskExpirTime = OsGetSortLinkNextExpireTime(taskHeader, startTime); - LOS_SpinUnlockRestore(&cpu->taskSortLinkSpin, intSave); - - LOS_SpinLockSave(&cpu->swtmrSortLinkSpin, &intSave); - UINT64 swtmrExpirTime = OsGetSortLinkNextExpireTime(swtmrHeader, startTime); - LOS_SpinUnlockRestore(&cpu->swtmrSortLinkSpin, intSave); - - return (taskExpirTime < swtmrExpirTime) ? taskExpirTime : swtmrExpirTime; -} - -UINT32 OsSortLinkGetTargetExpireTime(const SortLinkList *targetSortList) -{ - UINT64 currTimes = OsGetCurrSchedTimeCycle(); - if (currTimes >= targetSortList->responseTime) { - return 0; - } - - return (UINT32)(targetSortList->responseTime - currTimes) / OS_CYCLE_PER_TICK; -} - -UINT32 OsSortLinkGetNextExpireTime(const SortLinkAttribute *sortLinkHeader) -{ - LOS_DL_LIST *head = (LOS_DL_LIST *)&sortLinkHeader->sortLink; - - if (LOS_ListEmpty(head)) { - return 0; - } - - SortLinkList *listSorted = LOS_DL_LIST_ENTRY(head->pstNext, SortLinkList, sortLinkNode); - return OsSortLinkGetTargetExpireTime(listSorted); -} - From 0acad494f77d644345e26b4a4a53d51f5d79585e Mon Sep 17 00:00:00 2001 From: weitong <494475907@qq.com> Date: Fri, 22 Dec 2023 20:50:49 +0800 Subject: [PATCH 14/21] weitong --- DOCX/weitong用例描述.docx | Bin 0 -> 15245 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 DOCX/weitong用例描述.docx diff --git a/DOCX/weitong用例描述.docx b/DOCX/weitong用例描述.docx new file mode 100644 index 0000000000000000000000000000000000000000..b4b2365ede68253aa9e38bbdf839ea5d5071f608 GIT binary patch literal 15245 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

!W%oceL3$&dWTtgR%M2y$m-alpG-Wk_ZL z>=&`vn-)u{z1>x`D}+z?7TA#dtAnP_^IXYTICOlRacu^{%S%ey<6+!_pMFl)tL@6n z-JZ})=p!pbZPS!r;q|}765w|l*x(CJV=`w~+9otmJ;L;7TU4RgN*hSVEeA-GnhEx3 zYMF=NP;7A4hR}xU4_%OCDHR%fk&Z(2huz=k$nP3f(DSNr$#~#WpR^)DJ$iPS?hWU` zF9r+j#xf+FMJGyj55VIK`^69d;Xu3C@(Z_9%J{&Mm1-dQOQ90cV~Fl|k^?kdtv|Y_ zrgxpy!7;RcRtL51lu`iLcz_KJ!mel!YPZ2EO<@|AV|`;cvxqJES@<7*fZhTRz}L%T zYAOJ?qLUL>5&-7Que*^6a6bKVkC17%OXUr(NZ8oy-3yaGorhTpIE4P6;J=x_f2Z(wlkHCmP>lbi@Gl13-|_#tN&krk092R(fPdSv{|^6G jt@&3t7~5aq|J0$fl3*X~@moh944~^n&(^d5cJ==N!HTg~ literal 0 HcmV?d00001 From f5a3d5334ce9a289300ab11456c75390c92bfd13 Mon Sep 17 00:00:00 2001 From: zengqi <173384268@qq.com> Date: Fri, 22 Dec 2023 21:23:02 +0800 Subject: [PATCH 15/21] =?UTF-8?q?=E6=9B=BE=E7=90=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sched/sched_sq/调度器.docx | Bin 0 -> 13829 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 sched/sched_sq/调度器.docx diff --git a/sched/sched_sq/调度器.docx b/sched/sched_sq/调度器.docx new file mode 100644 index 0000000000000000000000000000000000000000..b1a030e938354fb41c5fa4c8a68f9ff04278fe87 GIT binary patch literal 13829 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 literal 0 HcmV?d00001 From b3724e5a520c856a254ea5e6daa168d8a74553a5 Mon Sep 17 00:00:00 2001 From: pqk2c5h8v <3232796758@qq.com> Date: Sat, 30 Dec 2023 08:04:01 +0800 Subject: [PATCH 16/21] ADD file via upload --- 用例描述.docx | Bin 0 -> 87097 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 用例描述.docx diff --git a/用例描述.docx b/用例描述.docx new file mode 100644 index 0000000000000000000000000000000000000000..bb0a56303a45ffa2ff000caf4781e0f22b716b90 GIT binary patch literal 87097 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
t9Ug4Zh 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

bv<_ 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 H6PW)8Gz|+& literal 0 HcmV?d00001 From f77d800ca3734d7f78faff893380890e484b44d3 Mon Sep 17 00:00:00 2001 From: pqk2c5h8v <3232796758@qq.com> Date: Sat, 30 Dec 2023 08:05:39 +0800 Subject: [PATCH 17/21] =?UTF-8?q?Delete=20'=E7=94=A8=E4=BE=8B=E6=8F=8F?= =?UTF-8?q?=E8=BF=B0.docx'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 用例描述.docx | Bin 87097 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 用例描述.docx diff --git a/用例描述.docx b/用例描述.docx deleted file mode 100644 index bb0a56303a45ffa2ff000caf4781e0f22b716b90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87097 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
t9Ug4Zh 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

bv<_ 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 H6PW)8Gz|+& From 8b170d4cb9405b779090a103b36bc51f0f06f140 Mon Sep 17 00:00:00 2001 From: pqk2c5h8v <3232796758@qq.com> Date: Sat, 30 Dec 2023 08:06:02 +0800 Subject: [PATCH 18/21] ADD file via upload --- 用例描述.docx | Bin 0 -> 87097 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 用例描述.docx diff --git a/用例描述.docx b/用例描述.docx new file mode 100644 index 0000000000000000000000000000000000000000..bb0a56303a45ffa2ff000caf4781e0f22b716b90 GIT binary patch literal 87097 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
t9Ug4Zh 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

bv<_ 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 H6PW)8Gz|+& literal 0 HcmV?d00001 From f243eaa121c88046f245cf5a05739a09b9938c05 Mon Sep 17 00:00:00 2001 From: pvrb8ka45 <1664581173@qq.com> Date: Mon, 1 Jan 2024 20:52:46 +0800 Subject: [PATCH 19/21] =?UTF-8?q?1500-2000=E7=94=A8=E4=BE=8B=E7=9A=84?= =?UTF-8?q?=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1500-200用例描述.docx | Bin 0 -> 13441 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 1500-200用例描述.docx diff --git a/1500-200用例描述.docx b/1500-200用例描述.docx new file mode 100644 index 0000000000000000000000000000000000000000..38e3aff70f3c733f301ca6ad445aefdf99c2e462 GIT binary patch literal 13441 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 literal 0 HcmV?d00001 From e55d244aabedb821ccc8c57a7289a4fccd86aa13 Mon Sep 17 00:00:00 2001 From: pvrb8ka45 <1664581173@qq.com> Date: Mon, 1 Jan 2024 20:56:22 +0800 Subject: [PATCH 20/21] =?UTF-8?q?Delete=20'1500-200=E7=94=A8=E4=BE=8B?= =?UTF-8?q?=E6=8F=8F=E8=BF=B0.docx'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1500-200用例描述.docx | Bin 13441 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 1500-200用例描述.docx diff --git a/1500-200用例描述.docx b/1500-200用例描述.docx deleted file mode 100644 index 38e3aff70f3c733f301ca6ad445aefdf99c2e462..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13441 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 From 467fe5889f4afc033b07424c4bf38089b69b8221 Mon Sep 17 00:00:00 2001 From: pvrb8ka45 <1664581173@qq.com> Date: Mon, 1 Jan 2024 20:56:46 +0800 Subject: [PATCH 21/21] =?UTF-8?q?=E6=9C=B1=E6=97=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1500-200用例描述.docx | Bin 0 -> 13441 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 1500-200用例描述.docx diff --git a/1500-200用例描述.docx b/1500-200用例描述.docx new file mode 100644 index 0000000000000000000000000000000000000000..38e3aff70f3c733f301ca6ad445aefdf99c2e462 GIT binary patch literal 13441 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 literal 0 HcmV?d00001