【鸿蒙南向开发】LiteOS-M小型系统内核——CPUP

基本概念

CPU(中央处理器,Central Processing Unit)占用率分为系统CPU占用率和任务CPU占用率。

系统CPU占用率(CPU Percent)是指周期时间内系统的CPU占用率,用于表示系统一段时间内的闲忙程度,也表示CPU的负载情况。系统CPU占用率的有效表示范围为0~100,其精度(可通过配置调整)为百分比。100表示系统满负荷运转。

任务CPU占用率指单个任务的CPU占用率,用于表示单个任务在一段时间内的闲忙程度。任务CPU占用率的有效表示范围为0~100,其精度(可通过配置调整)为百分比。100表示在一段时间内系统一直在运行该任务。

用户通过系统级的CPU占用率,判断当前系统负载是否超出设计规格。

通过系统中各个任务的CPU占用情况,判断各个任务的CPU占用率是否符合设计的预期。

运行机制

OpenHarmony LiteOS-M的CPUP(CPU Percent,系统CPU占用率)采用任务级记录的方式,在任务切换时,记录任务启动时间,任务切出或者退出时间,每次当任务退出时,系统会累加整个任务的占用时间。

可以在target_config.h的中对该功能进行选配。

OpenHarmony LiteOS-M提供以下两种CPU占用率的信息查询:

  • 系统CPU占用率。
  • 任务CPU占用率。

CPU占用率的计算方法:

系统CPU占用率=系统中除idle任务外其他任务运行总时间/系统运行总时间

任务CPU占用率=任务运行总时间/系统运行总时间

开发指导

接口说明

表 1 功能列表

鸿蒙l0设备上适配恒玄开发版适配libmodbus报错[OHOS ERROR] [44/124] gcc cross compiler obj/third_party/libmodbus/src/libmodbus_static.modbus-rtu.o [OHOS ERROR] FAILED: obj/third_party/libmodbus/src/libmodbus_static.modbus-rtu.o [OHOS ERROR] ccache arm-none-eabi-gcc -D_XOPEN_SOURCE=700 -DOHOS_DEBUG -D__LITEOS__ -D__LITEOS_M__ -DSECUREC_IN_KERNEL=0 -D_BSD_SOURCE=1 -I../../../third_party/libmodbus -I../../../third_party/libmodbus/src -I../../../device/soc/bestechnic/aos_bsp/include/rtos/liteos/liteos_m/kal/cmsis -I../../../device/soc/bestechnic/aos_bsp/rtos/liteos/liteos_m -I../../../device/soc/bestechnic/aos_bsp/platform/hal -I../../../commonlibrary/utils_lite/include -I../../../base/iothardware/peripheral/interfaces/inner_api -I../../../kernel/liteos_m/arch/arm/common -I../../../kernel/liteos_m/arch/arm/cortex-m33/gcc/NTZ -I../../../kernel/liteos_m/arch/arm/include -I../../../kernel/liteos_m/arch/include -I../../../kernel/liteos_m/kernel/include -I../../../kernel/liteos_m/kal/libc/newlib/porting/include -I../../../third_party/bounds_checking_function/include -I../../../kernel/liteos_m/kal/posix/include -I../../../kernel/liteos_m/components/backtrace -I../../../kernel/liteos_m/components/cpup -I../../../kernel/liteos_m/components/exchook -I../../../kernel/liteos_m/components/fs/vfs -I../../../third_party/littlefs -I../../../third_party/littlefs/bd -I../../../kernel/liteos_m/components/fs/littlefs -I../../../device/soc/bestechnic/bes2600/liteos_m/components/net/lwip-2.1/porting/include -I../../../kernel/liteos_m/components/net/lwip-2.1/porting/include -I../../../third_party/lwip/src/include -I../../../kernel/liteos_m/components/power -I../../../kernel/liteos_m/components/signal -I../../../kernel/liteos_m/utils -Igen/device/board/fnlink/shields/v200zr-evb-t1 -I../../../device/soc/bestechnic/aos_bsp/rtos/liteos/liteos_m/kal/cmsis -I../../../device/soc/bestechnic/aos_bsp/platform/cmsis/inc -I../../../device/soc/bestechnic/aos_bsp/platform/drivers/ana -I../../../device/soc/bestechnic/aos_bsp/services/wifi_app/wifi_console -I../../../device/soc/bestechnic/aos_bsp/utils/crc32 -I../../../device/soc/bestechnic/aos_bsp/utils/kfifo -I../../../device/soc/bestechnic/aos_bsp/net/wifi -I../../../device/soc/bestechnic/aos_bsp/platform/hal/best2003 -I../../../device/soc/bestechnic/aos_bsp/services/norflash_api -I../../../device/soc/bestechnic/aos_bsp/utils/eshell -I../../../device/soc/bestechnic/aos_bsp/services/aiot/ota_secboot -I../../../device/soc/bestechnic/aos_bsp/net -I../../../device/soc/bestechnic/bes2600/liteos_m/components/drivers/display/hal -I../../../device/soc/bestechnic/bes2600/liteos_m/components/drivers/flash -I../../../device/soc/bestechnic/bes2600/liteos_m/components/drivers/mipi_dsi -I../../../device/soc/bestechnic/bes2600/liteos_m/components/drivers/touch -I../../../device/soc/bestechnic/bes2600/liteos_m/components/drivers/touch/include -I../../../device/soc/bestechnic/bes2600/liteos_m/components/fs -I../../../device/soc/bestechnic/bes2600/liteos_m/components/ui -I../../../device/soc/bestechnic/bes2600/liteos_m/components/utils/include -I../../../device/soc/bestechnic/bes2600/liteos_m/components/bt/inc -Os -mcpu=cortex-m33 -mfpu=fpv5-sp-d16 -mfloat-abi=hard -fdata-sections -mthumb -mthumb-interwork -DPLAYER_TOOL -DCHIP_BEST2003 -DOS_HEAP_SIZE=0x600000 -DCHIP_HAS_UART=3 -DRTOS -DDEBUG=1 -DCMSIS_OS_VER=2 -DOS_HWI_MAX_NUM=96 -DCONFIG_DISPLAY_A064 -DLFS_MAX_OPEN_DIRS=32 -DMBEDTLS_CMSIS_FILE=\"rtos/liteos/liteos_m/kal/cmsis/cmsis_os.h\" -DMINE_HARMONY_SOFTBUS -DLOSCFG_BASE_CORE_HILOG -DPTHREAD_KEYS_MAX=128 -DWIFI_STATE_NOT_AVALIABLE=0 -DTCP_USER_TIMEOUT=18 -D_stext=__text_start__ -D_etext=__text_end__ -mcpu=cortex-m33 -mfpu=fpv5-sp-d16 -mfloat-abi=hard -fdata-sections -mthumb -mthumb-interwork -DPLAYER_TOOL -DCHIP_BEST2003 -DOS_HEAP_SIZE=0x600000 -DCHIP_HAS_UART=3 -DRTOS -DDEBUG=1 -DCMSIS_OS_VER=2 -DOS_HWI_MAX_NUM=96 -DCONFIG_DISPLAY_A064 -DLFS_MAX_OPEN_DIRS=32 -DMBEDTLS_CMSIS_FILE=\"rtos/liteos/liteos_m/kal/cmsis/cmsis_os.h\" -DMINE_HARMONY_SOFTBUS -DLOSCFG_BASE_CORE_HILOG -DPTHREAD_KEYS_MAX=128 -DWIFI_STATE_NOT_AVALIABLE=0 -DTCP_USER_TIMEOUT=18 -D_stext=__text_start__ -D_etext=__text_end__ -mcpu=cortex-m33 -fno-common -fno-builtin -fno-strict-aliasing -Wall -fsigned-char -fstack-protector-all -imacros /home/zkxi/workspace/L0_332/src/out/v200zr/display_demo/config.h -std=c99 -c ../../../third_party/libmodbus/src/modbus-rtu.c -o obj/third_party/libmodbus/src/libmodbus_static.modbus-rtu.o [OHOS ERROR] In file included from ../../../third_party/libmodbus/src/modbus-rtu-private.h:19, [OHOS ERROR] from ../../../third_party/libmodbus/src/modbus-rtu.c:18: [OHOS ERROR] /root/toolchain/gcc-arm-none-eabi-10.3-2021.10/arm-none-eabi/include/termios.h:4:10: fatal error: sys/termios.h: No such file or directory [OHOS ERROR] 4 | #include <sys/termios.h> [OHOS ERROR] | ^~~~~~~~~~~~~~~ [OHOS ERROR] compilation terminated. 这是怎么回事,给出具体的修改方案?
最新发布
09-10
<think> 我们面对的问题是:在OpenHarmony L0设备(恒玄开发板)上编译libmodbus时出现错误,提示找不到`sys/termios.h`文件。这是因为在嵌入式平台中,头文件的路径可能与标准Linux不同。恒玄开发板使用的交叉编译工具链中,`termios.h`可能位于不同的路径下。 解决方案: 1. **修改libmodbus源码**:将`#include <sys/termios.h>`改为`#include <termios.h>`。因为交叉编译工具链中通常将`termios.h`放在标准头文件目录(如`${CROSS_COMPILE_PATH}/arm-none-eabi/include`)下,而不是`sys/`子目录。 2. **检查交叉编译工具链的头文件结构**:确认工具链中是否存在`termios.h`及其位置。如果确实在`sys/`目录下(虽然这种情况较少见),则需要创建符号链接或修改包含路径。 3. **在构建系统中添加头文件路径**:如果头文件位于非标准位置,需要在编译时通过`-I`选项指定。 具体步骤: **步骤1:定位问题代码** 根据错误信息,问题出现在`modbus-rtu-private.h`的第19行,该行包含`#include <sys/termios.h>`。我们需要修改这个包含语句。 打开文件:`third_party/libmodbus/src/modbus-rtu-private.h` 找到: ```c #include <sys/termios.h> ``` 修改为: ```c #include <termios.h> ``` **步骤2:如果修改后仍然报错,或者发现还有其他文件包含`sys/termios.h`** 可能需要在整个libmodbus代码库中搜索并替换所有的`#include <sys/termios.h>`为`#include <termios.h>`。 可以使用以下命令: ```bash grep -rn "sys/termios.h" third_party/libmodbus/ ``` 然后逐一修改。 **步骤3:如果工具链中确实没有`termios.h`或者位置特殊** 我们需要确定交叉编译工具链中`termios.h`的位置。例如,在工具链的安装目录(如`/root/toolchain/gcc-arm-none-eabi-10.3-2021.10/arm-none-eabi/include`)下查找。 如果找到的路径是`/root/toolchain/gcc-arm-none-eabi-10.3-2021.10/arm-none-eabi/include/termios.h`,说明在标准位置,步骤1的修改应该可以解决问题。 如果工具链中没有提供`termios.h`,那么可能需要从其他位置复制一个兼容的版本放到工具链的include目录中(注意版权和兼容性)。 **步骤4:修改构建脚本(可选)** 如果头文件位于非标准路径,比如在恒玄的SDK中提供了`termios.h`,那么我们需要在编译时通过`-I`选项添加包含路径。 在OpenHarmony的构建系统中,可以在`build/lite`下的相关配置文件中添加全局的include路径,或者修改libmodbus的编译配置。 例如,在`third_party/libmodbus/BUILD.gn`或相关的编译配置文件中,添加包含路径: 假设恒玄SDK中的头文件路径为`device/soc/bestechnic/aos_bsp/include`,则可以这样添加: ```gn config("libmodbus_config") { include_dirs = [ "//device/soc/bestechnic/aos_bsp/include", ... # 其他原有路径 ] } ``` 或者,在错误信息中我们看到了编译命令,我们可以在该模块的编译选项中添加: ```gn executable("your_target") { ... cflags = [ "-I//device/soc/bestechnic/aos_bsp/include", ... ] } ``` **步骤5:重新编译** 修改完成后,重新编译整个项目。 如果问题依旧,请检查: - 修改是否正确(注意修改的文件是否正确) - 是否还有其他文件引用了`sys/termios.h` - 交叉编译工具链的`include`目录是否正确设置 另外,注意鸿蒙系统L0可能使用的是newlibc库,而newlibc中`termios.h`直接位于`include`目录下,因此我们只需要包含`<termios.h>`。 总结:推荐首先尝试步骤1(修改源码),这通常是解决此类问题最快的方法。 如果步骤1无效,再尝试步骤4(添加包含路径)或步骤3(确认头文件是否存在并补齐)。 注意:在嵌入式开发中,我们经常需要根据目标平台调整源码中的包含路径,这是正常现象。 引用说明:在嵌入式Linux系统中,头文件的路径往往与标准Linux不同,因此需要根据具体工具链调整[^1]。 </think> 针对鸿蒙L0设备(OpenHarmony)在恒玄开发板上适配libmodbus时出现的`sys/termios.h`文件缺失问题,以下是详细解决方案: ### 问题根本原因 在鸿蒙L0的嵌入式环境中: 1. **头文件路径差异**:标准Linux的`sys/termios.h`在嵌入式环境通常简化为`termios.h` 2. **交叉编译工具链限制**:`arm-none-eabi-gcc`工具链默认不包含完整Linux头文件 3. **libmodbus兼容性问题**:libmodbus默认使用Linux标准路径引用串口控制头文件 --- ### 解决方案(二选一) #### 方案1:直接修改libmodbus源码(推荐) ```diff // 打开文件:third_party/libmodbus/src/modbus-rtu-private.h - #include <sys/termios.h> + #include <termios.h> // 鸿蒙L0使用此路径 // 修改后保存,重新编译 ``` #### 方案2:添加符号链接(无需改代码) ```bash # 在鸿蒙SDK的交叉编译工具链中创建映射 cd /root/toolchain/gcc-arm-none-eabi-10.3-2021.10/arm-none-eabi/include sudo mkdir -p sys sudo ln -s ../termios.h sys/termios.h # 创建符号链接 ``` --- ### 验证步骤 1. 重新编译: ```bash # 在鸿蒙构建目录执行 ./build.sh --product-name fnlink_v200zr # 替换为实际产品名 ``` 2. 检查编译输出: ``` [OHOS INFO] [44/124] gcc cross compiler obj/third_party/libmodbus/src/libmodbus_static.modbus-rtu.o [OHOS INFO] Success ``` --- ### 深入说明 1. **为何需要修改**: - 鸿蒙L0使用轻量级C库(newlib/musl),头文件路径与Linux不同 - 恒玄BES2600芯片的串口驱动位于: ``` device/soc/bestechnic/aos_bsp/platform/hal/ ├── hal_uart.h └── hal_uart.c # 实际的串口实现[^1] ``` 2. **备用方案**(若上述无效): ```c // 在modbus-rtu-private.h中添加宏定义 #if defined(__LITEOS_M__) // 鸿蒙L0标识 #include "hal_uart.h" // 直接使用恒玄SDK的串口头文件 #else #include <termios.h> #endif ``` > **关键提示**:鸿蒙L0的POSIX兼容层位于`kernel/liteos_m/kal/posix`,但串口操作已被恒玄SDK的`hal_uart`接口替代[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值