yocto meta-st-stm32mp conf文件夹分析

news2025/2/27 20:40:56

meta-st-stm32mp conf文件夹分析

machine conf分析

本节主要分析conf/machine下面的文件
在这里插入图片描述

stm32mp1.conf

  1. 包含inc文件
include conf/machine/include/st-machine-common-stm32mp.inc
include conf/machine/include/st-machine-providers-stm32mp.inc

st-machine-providers-stm32mp.inc 主要是确定provider,包括kernel uboot atf optee-os等
st-machine-common-stm32mp.inc 主要的处理逻辑都在这里面
2. 指定特定的machine家族

MACHINEOVERRIDES .= ":stm32mp1common"
  1. 确定Chip architecture
DEFAULTTUNE = "cortexa7thf-neon-vfpv4"
include conf/machine/include/tune-cortexa7.inc
  1. 确定boot 方案
BOOTSCHEME_LABELS += "trusted"
BOOTSCHEME_LABELS += "optee"

支持trust 启动和optee安全启动
5. 设置boot设备

BOOTDEVICE_LABELS += "emmc"
BOOTDEVICE_LABELS += "nand-4-256"
BOOTDEVICE_LABELS += "nor-sdcard"
BOOTDEVICE_LABELS += "sdcard"

支持emmc sdcard nand nor启动
6. 设置machine的设备树

STM32MP_DT_FILES_DK += "stm32mp157c-dk2 stm32mp157f-dk2"
  1. 配置machine feature
MACHINE_FEATURES += "splashscreen"
MACHINE_FEATURES += "watchdog"
MACHINE_FEATURES += "bluetooth"
MACHINE_FEATURES += "wifi"
MACHINE_FEATURES += "${@'gpu' if d.getVar('ACCEPT_EULA_'+d.getVar('MACHINE')) == '1' else ''}"
MACHINE_FEATURES += "m4copro"

BLUETOOTH_LIST += "linux-firmware-bluetooth-bcm4343"
WIFI_LIST += "linux-firmware-bcm43430"
  1. kernel相关配置
KERNEL_MODULE_AUTOLOAD = "goodix"

# Define the devicetree for Linux A7 examples
LINUX_A7_EXAMPLES_DT += "stm32mp157c-dk2-a7-examples"

指定自动加载的module 和kernel的dt文件
9. 指定M4核心的相关配置

CUBE_M4_EXAMPLES_DT += "stm32mp157c-dk2-m4-examples"

stm32mp1-xxx.conf
上面stm32mp1.conf列出了很多mp1系列支持的启动方式、启动设备、dt文件等多样化配置,stm32mp1-xxx.conf是具体的官方评估板的配置文件,里面的配置是stm32mp1.conf的子集。例如启动设备只支持sdcard,支持trusted启动,MACHINE_FEATURES有删减等。不做具体介绍,一看便知。

include文件夹

上面stm32mp1.conf 里面引用了几个inc文件,下面主要看一下include里面的这几个文件

在这里插入图片描述

st-machine-providers-stm32mp.inc

这个文件比较简单,主要就是通过PREFERRED_PROVIDER_指定具体的包,主要包括kernel uboot tfa optee-os

PREFERRED_PROVIDER_virtual/kernel = "linux-stm32mp"
PREFERRED_PROVIDER_virtual/bootloader = "u-boot-stm32mp"
PREFERRED_PROVIDER_u-boot = "u-boot-stm32mp"
PREFERRED_PROVIDER_virtual/trusted-firmware-a = "tf-a-stm32mp"
PREFERRED_PROVIDER_virtual/trusted-firmware-a-serialboot = "tf-a-stm32mp-serialboot"

TF_A_CONFIG_append_pn-tf-a-stm32mp-serialboot = " serialboot "
TF_A_CONFIG_append_pn-tf-a-stm32mp = " ${@bb.utils.contains('BOOTSCHEME_LABELS', 'trusted', 'trusted', '', d)} "
TF_A_CONFIG_append_pn-tf-a-stm32mp = " ${@bb.utils.contains('BOOTSCHEME_LABELS', 'optee', 'optee', '', d)} "

PREFERRED_PROVIDER_virtual/optee-os = "optee-os-stm32mp"

st-machine-storage-device-stm32mp.inc

DEVICE_STORAGE ?= "EMMC:mmc1, NAND:nand0, NOR:nor0, SDCARD:mmc0"

DEVICE_STORAGE_NAMES += "EMMC"
DEVICE_STORAGE_NAMES += "NAND"
DEVICE_STORAGE_NAMES += "NOR"
DEVICE_STORAGE_NAMES += "SDCARD"

DEVICE_STORAGE_TYPES += "mmc0"
DEVICE_STORAGE_TYPES += "mmc1"
DEVICE_STORAGE_TYPES += "mmc2"
DEVICE_STORAGE_TYPES += "nand0"
DEVICE_STORAGE_TYPES += "nor0"

python () {
    """
    This function configure dynamically the needed alias between generic storage
    device name and device type.
    Output for this function is the initialization of:
        DEVICE_<device_name> = '<device_type>'
        DEVICE_<device_type> = '<device_name>'
    """
    device_storage_config = d.getVar('DEVICE_STORAGE') or ''
    if not device_storage_config:
        return
    if not device_storage_config.strip():
        return
    if len(device_storage_config.split(',')) > 0:
        # Init supported device storage configuration
        supported_device_names = (d.getVar('DEVICE_STORAGE_NAMES') or '').split()
        supported_device_types = (d.getVar('DEVICE_STORAGE_TYPES') or '').split()
        # Loop for all storage device configurations
        for device_storage in device_storage_config.split(','):
            device_name = device_storage.split(':')[0].strip()
            device_type = device_storage.split(':')[1].strip()
            # Check for configuration consistency
            if device_name and device_type:
                # Make sure configuration is correctly done
                if device_name not in supported_device_names:
                    bb.fatal('Wrong DEVICE_STORAGE configuration: "%s" is not part of supported device name (%s)' % (device_name, supported_device_names))
                if device_type not in supported_device_types:
                    bb.fatal('Wrong DEVICE_STORAGE configuration: "%s" is not part of supported device type (%s)' % (device_type, supported_device_types))
                # Configure alias
                d.setVar('DEVICE_%s' % device_name, device_type)
                d.setVar('DEVICE_%s' % device_type, device_name)
            else:
                bb.fatal('Wrong DEVICE_STORAGE configuration: expecting DEVICE_STORAGE = "<device_name1>:<devie_type1>,<device_name2>:<device_type2>"')
}

# -----------------------------------------------------------------------------
# EMMC
# Extra space is required to store 'Protective MBR' and 'Primary GPT Header'
# Currently the required size is 17kBytes (i.e. 0x4400)
# We need to align this size to get the first offset to use
DEVICE_START_OFFSET_EMMC    ?= "0x00080000"
DEVICE_ALIGNMENT_SIZE_EMMC  ?= "0x00080000"

# Specific to EMMC, there are two boot partitions using specific offset to access
DEVICE_START_OFFSET_BOOT0_EMMC ?= "boot1"
DEVICE_START_OFFSET_BOOT1_EMMC ?= "boot2"

# Configure the rootfs partition uid used in gpt partition table for EMMC
DEVICE_PARTUUID_ROOTFS_EMMC ?= "${@d.getVar(d.expand('DEVICE_PARTUUID_ROOTFS_${DEVICE_EMMC}')) or ''}"

# Configure the list of boards that enable EMMC
DEVICE_BOARD_ENABLE_EMMC += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'emmc', '${STM32MP_DT_FILES_ED}', '', d)}"
DEVICE_BOARD_ENABLE_EMMC += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'emmc', '${STM32MP_DT_FILES_EV}', '', d)}"

# -----------------------------------------------------------------------------
# NAND
DEVICE_START_OFFSET_NAND   ?= "0x00000000"
DEVICE_ALIGNMENT_SIZE_NAND ?= "0x00040000"

# Configure the list of boards that enable EMMC
DEVICE_BOARD_ENABLE_NAND   += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'nand-4-256', '${STM32MP_DT_FILES_ED}', '', d)}"
DEVICE_BOARD_ENABLE_NAND   += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'nand-4-256', '${STM32MP_DT_FILES_EV}', '', d)}"

# -----------------------------------------------------------------------------
# NOR
DEVICE_START_OFFSET_NOR    ?= "0x00000000"
DEVICE_ALIGNMENT_SIZE_NOR  ?= "0x00010000"

# Configure the list of boards that enable EMMC
DEVICE_BOARD_ENABLE_NOR    += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'nor-sdcard' , '${STM32MP_DT_FILES_EV}', '', d)}"

# -----------------------------------------------------------------------------
# SDCARD
# Extra space is required to store 'Protective MBR' and 'Primary GPT Header'
# Currently the required size is 17kBytes (i.e. 0x4400)
# We need to align this size to get the first offset to use
DEVICE_START_OFFSET_SDCARD    ?= "0x00004400"
DEVICE_ALIGNMENT_SIZE_SDCARD  ?= "0x00000200"

# Configure the rootfs partition uid used in gpt partition table for SDCARD
DEVICE_PARTUUID_ROOTFS_SDCARD ?= "${@d.getVar(d.expand('DEVICE_PARTUUID_ROOTFS_${DEVICE_SDCARD}')) or ''}"

# Configure the list of boards that enable SDCARD
DEVICE_BOARD_ENABLE_SDCARD    += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'sdcard', '${STM32MP_DT_FILES_DK}', '', d)}"
DEVICE_BOARD_ENABLE_SDCARD    += "${@bb.utils.contains_any('BOOTDEVICE_LABELS', [ 'sdcard', 'nor-sdcard' ], '${STM32MP_DT_FILES_ED}', '', d)}"
DEVICE_BOARD_ENABLE_SDCARD    += "${@bb.utils.contains_any('BOOTDEVICE_LABELS', [ 'sdcard', 'nor-sdcard' ], '${STM32MP_DT_FILES_EV}', '', d)}"

# -----------------------------------------------------------------------------
# Fixed configuration from U-Boot source code
# -----------------------------------------------------------------------------
DEVICE_PARTUUID_ROOTFS_mmc0 ?= "e91c4e10-16e6-4c0e-bd0e-77becf4a3582"
DEVICE_PARTUUID_ROOTFS_mmc1 ?= "491f6117-415d-4f53-88c9-6e0de54deac6"
DEVICE_PARTUUID_ROOTFS_mmc2 ?= "fd58f1c7-be0d-4338-8ee9-ad8f050aeb18"

st-machine-storage-device-stm32mp中上来定义了三个变量
DEVICE_STORAGE:可配置的启动存储组合
DEVICE_STORAGE_NAMES:默认支持的启动存储名字。eg:EMMC SDCARD
DEVICE_STORAGE_TYPES:默认支持的启动存储类型。eg:mmc0 mmc1
python函数做的关键工作其实就2行赋值:
d.setVar(‘DEVICE_%s’ % device_name, device_type)
d.setVar(‘DEVICE_%s’ % device_type, device_name)
最终效果就是DEVICE_EMMC=mmc0 DEVICE_mmc0=EMMC

然后就是针对每一种可启动设备的变量配置,这里只关注EMMC 和SDCARD,NOR 和NAND暂不关注。
关键变量整理以后赋值如下(以fsmp1开发板获取结果显示):

在这里插入图片描述DEVICE_START_OFFSET_EMMC ?= “0x00080000”
DEVICE_ALIGNMENT_SIZE_EMMC ?= “0x00080000”

DEVICE_START_OFFSET_BOOT0_EMMC ?= “boot1”
DEVICE_START_OFFSET_BOOT1_EMMC ?= “boot2”

DEVICE_PARTUUID_ROOTFS_EMMC =“491f6117-415d-4f53-88c9-6e0de54deac6”
DEVICE_BOARD_ENABLE_EMMC = " stm32mp157a-fsmp1a "
总结:主要就是给不同的启动设备设置分区的UUID和板子配套的dts文件,在extlinux中会用到。

st-machine-features-stm32mp.inc

GPU_IMAGE_INSTALL = "${@bb.utils.contains('MACHINE_FEATURES', 'gpu', '${GPU_LIST}', '', d)} "
ALSA_IMAGE_INSTALL = "${@bb.utils.contains('COMBINED_FEATURES', 'alsa', '${ALSA_LIST}', '', d)} "
BLUETOOTH_IMAGE_INSTALL = "${@bb.utils.contains('MACHINE_FEATURES', 'bluetooth', '${BLUETOOTH_LIST}', '', d)}"
M4COPRO_IMAGE_INSTALL = "${@bb.utils.contains('MACHINE_FEATURES', 'm4copro', '${M4COPRO_LIST}', '', d)}"
OPTEE_IMAGE_INSTALL = "${@bb.utils.contains('COMBINED_FEATURES', 'optee', '${OPTEE_LIST}', '', d)} "
WIFI_IMAGE_INSTALL = "${@bb.utils.contains('MACHINE_FEATURES', 'wifi', '${WIFI_LIST}', '', d)} "

EXTRA_IMAGEDEPENDS_append = " \
    ${OPTEE_BINARY_INSTALL} \"

MACHINE_EXTRA_RRECOMMENDS_append = " \
    ${GPU_IMAGE_INSTALL}        \
    ${ALSA_IMAGE_INSTALL}       \
    ${BLUETOOTH_IMAGE_INSTALL}  \
    ${M4COPRO_IMAGE_INSTALL}    \
    ${OPTEE_IMAGE_INSTALL}      \
    ${WIFI_IMAGE_INSTALL}       \"

这个文件指定了一系列的FEATURE_IMAGE_INSTALL变量,然后通过判断MACHINE_FEATURES变量中是否指定该FEATURE决定是否将这些包 包含到根文件系统。
EXTRA_IMAGEDEPENDS:镜像构建所需要的机器特定包列表。这些包对于机器启动来说是必要的。
MACHINE_EXTRA_RRECOMMENDS:镜像构建所需要的机器特定包列表。这些包对于机器启动来说不是必要的。

gpu_vivante.inc



GPU_USERLAND_LIBRARIES_WAYLAND ?= "gcnano-userland-multi-binary-stm32mp"
GPU_USERLAND_LIBRARIES_EGLFS   ?= "gcnano-userland-multi-binary-stm32mp"
GPU_USERLAND_LIBRARIES_X11     ?= "mesa"

def get_gpu_vivante_handler(d):
    """  Overloading the default EGL/GLES/mesa implementation."""
    machine_features = d.getVar('MACHINE_FEATURES').split()
    distro_features = d.getVar('DISTRO_FEATURES').split()

    gpu_lib_wayland = d.getVar('GPU_USERLAND_LIBRARIES_WAYLAND').split()
    gpu_lib_eglfs = d.getVar('GPU_USERLAND_LIBRARIES_EGLFS').split()
    gpu_lib_x11 = d.getVar('GPU_USERLAND_LIBRARIES_X11').split()

    if 'gpu' in machine_features:
        if 'wayland' in distro_features:
            provider = gpu_lib_wayland[0]
        else:
            if 'x11' in distro_features:
                provider = gpu_lib_x11[0]
            else:
                '''no wayland, no X11 -> choose DRM/FB for eglfs'''
                provider = gpu_lib_eglfs[0]
    else:
        provider = "mesa"

    return provider;

GPU_USERLAND_LIBRARIES_INSTALL = "${@get_gpu_vivante_handler(d)}"

PREFERRED_PROVIDER_virtual/egl = "${@get_gpu_vivante_handler(d)}"
PREFERRED_PROVIDER_virtual/libgles1 = "${@get_gpu_vivante_handler(d)}"
PREFERRED_PROVIDER_virtual/libgles2 = "${@get_gpu_vivante_handler(d)}"
PREFERRED_PROVIDER_virtual/libgbm = "${@get_gpu_vivante_handler(d)}"
PREFERRED_PROVIDER_virtual/mesa = "${@bb.utils.contains('PREFERRED_PROVIDER_virtual/egl','mesa','mesa','mesa-gl',d)}"
PREFERRED_PROVIDER_virtual/libgl = "${@bb.utils.contains('PREFERRED_PROVIDER_virtual/egl','mesa','mesa','mesa-gl',d)}"

主要通过 MACHINE_FEATURES DISTRO_FEATURES两个变量配合来确定一些包的provider.
比如MACHINE_FEATURES 包含gpu、DISTRO_FEATURES 没有指定wayland或者x11,则 egl libgles1 libgles2 libgbm 系列包的provider都是 gcnano-userland-multi-binary-stm32mp 。 mesa libgl 系列包的provider 是 mesa-gl。

st-machine-extlinux-config-stm32mp.inc

st-machine-extlinux-config-stm32mp.inc关键变量整理以后赋值如下(以fsmp1开发板获取结果显示、去除nand nor相关内容):

#@DESCRIPTION: STM32MP machine extlinux file configuration

# Define extlinux console for stm32mp machine
UBOOT_EXTLINUX_CONSOLE = "console=ttySTM0,115200"
# Define default FDTDIR for all configs
UBOOT_EXTLINUX_FDTDIR = "/"
# Define default MENU DESCRIPTION for all configs
UBOOT_EXTLINUX_MENU_DESCRIPTION = "OpenSTLinux"
# Define default boot config for all config
UBOOT_EXTLINUX_DEFAULT_LABEL ?= "OpenSTLinux"
# Define default INITRD for all configs
INITRD_SHORTNAME ??= ""
UBOOT_EXTLINUX_INITRD ?= "/uInitrd"

# -----------------------------------------------------------------------------
# Configurations
# -----------------------------------------------------------------------------
# Define additional targets to use
UBOOT_EXTLINUX_TARGETS += "${@bb.utils.contains_any('BOOTDEVICE_LABELS', [ 'sdcard', 'nor-sdcard' ], 'target-sdcard', '', d)}"
UBOOT_EXTLINUX_TARGETS += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'emmc', 'target-emmc', '', d)}"

# Define labels for each target
# (mandatory to allow specific var override if needed)
UBOOT_EXTLINUX_LABELS_target-sdcard += "rootfs"
UBOOT_EXTLINUX_LABELS_target-emmc += "rootfs"

# Define specific bootprefix for each target
UBOOT_EXTLINUX_BOOTPREFIXES_target-sdcard = "${DEVICE_SDCARD}_"
UBOOT_EXTLINUX_BOOTPREFIXES_target-emmc = "${DEVICE_EMMC}_"

# Define ROOT overrides for each target
UBOOT_EXTLINUX_ROOT_target-sdcard = "root=PARTUUID=${DEVICE_PARTUUID_ROOTFS_SDCARD}"
UBOOT_EXTLINUX_ROOT_target-emmc = "root=PARTUUID=${DEVICE_PARTUUID_ROOTFS_EMMC}"
# -----------------------------------------------------------------------------
# Append specific examples configs
# -----------------------------------------------------------------------------
# Enable UBOOT_EXTLINUX_TARGETS_EXTRA_CONFIG var that allows to configure
# additional target:
#   UBOOT_EXTLINUX_TARGETS_EXTRA_CONFIG = "extra-target"
# Then define new label(s) to append to the label list from current target
#   UBOOT_EXTLINUX_TARGETS_EXTRA_CONFIG[extra-target] = "newlabel1 newlabel2"
# This will create new 'extlinux.conf' file with name 'extra-target_extlinux.conf'
# that will use UBOOT_EXTLINUX_LABELS label list defined for current target plus
# the 'newlabel1' and 'newlabel2' labels.
# -----------------------------------------------------------------------------
# Define additional extra targets to consider
UBOOT_EXTLINUX_TARGETS_EXTRA_CONFIG_target-sdcard += "${STM32MP_DT_FILES_DK}"
UBOOT_EXTLINUX_TARGETS_EXTRA_CONFIG_target-sdcard += "${STM32MP_DT_FILES_ED}"
UBOOT_EXTLINUX_TARGETS_EXTRA_CONFIG_target-sdcard += "${STM32MP_DT_FILES_EV}"
UBOOT_EXTLINUX_TARGETS_EXTRA_CONFIG_target-emmc += "${STM32MP_DT_FILES_ED}"
UBOOT_EXTLINUX_TARGETS_EXTRA_CONFIG_target-emmc += "${STM32MP_DT_FILES_EV}"
# Define extra label configuration
UBOOT_EXTLINUX_TARGETS_EXTRA_CONFIG[stm32mp157c-dk2] += "stm32mp157c-dk2-a7"
UBOOT_EXTLINUX_TARGETS_EXTRA_CONFIG[stm32mp157c-dk2] += "stm32mp157c-dk2-m4"
UBOOT_EXTLINUX_TARGETS_EXTRA_CONFIG[stm32mp157c-ev1] += "stm32mp157c-ev1-a7"
UBOOT_EXTLINUX_TARGETS_EXTRA_CONFIG[stm32mp157c-ev1] += "stm32mp157c-ev1-m4"

UBOOT_EXTLINUX_TARGETS_EXTRA_CONFIG[stm32mp157f-dk2] += "stm32mp157f-dk2-a7"
UBOOT_EXTLINUX_TARGETS_EXTRA_CONFIG[stm32mp157f-dk2] += "stm32mp157f-dk2-m4"
UBOOT_EXTLINUX_TARGETS_EXTRA_CONFIG[stm32mp157f-ev1] += "stm32mp157f-ev1-a7"
UBOOT_EXTLINUX_TARGETS_EXTRA_CONFIG[stm32mp157f-ev1] += "stm32mp157f-ev1-m4"

# -----------------------------------------------------------------------------
# Configure A7 examples labels
# -----------------------------------------------------------------------------
# Define MENU DESCRIPTION overrides for new A7 labels
UBOOT_EXTLINUX_MENU_DESCRIPTION_stm32mp157c-dk2-a7 = "stm32mp157c-dk2-a7-examples"
UBOOT_EXTLINUX_MENU_DESCRIPTION_stm32mp157c-ev1-a7 = "stm32mp157c-ev1-a7-examples"
UBOOT_EXTLINUX_MENU_DESCRIPTION_stm32mp157f-dk2-a7 = "stm32mp157f-dk2-a7-examples"
UBOOT_EXTLINUX_MENU_DESCRIPTION_stm32mp157f-ev1-a7 = "stm32mp157f-ev1-a7-examples"
# Define FDT overrides for new A7 labels
UBOOT_EXTLINUX_FDT_stm32mp157c-dk2-a7 = "/stm32mp157c-dk2-a7-examples.dtb"
UBOOT_EXTLINUX_FDT_stm32mp157c-ev1-a7 = "/stm32mp157c-ev1-a7-examples.dtb"
UBOOT_EXTLINUX_FDT_stm32mp157f-dk2-a7 = "/stm32mp157f-dk2-a7-examples.dtb"
UBOOT_EXTLINUX_FDT_stm32mp157f-ev1-a7 = "/stm32mp157f-ev1-a7-examples.dtb"

# -----------------------------------------------------------------------------
# Configure M4 examples labels
# -----------------------------------------------------------------------------
# Define MENU DESCRIPTION overrides for new A7 labels
UBOOT_EXTLINUX_MENU_DESCRIPTION_stm32mp157c-dk2-m4 = "stm32mp157c-dk2-m4-examples"
UBOOT_EXTLINUX_MENU_DESCRIPTION_stm32mp157c-ev1-m4 = "stm32mp157c-ev1-m4-examples"
UBOOT_EXTLINUX_MENU_DESCRIPTION_stm32mp157f-dk2-m4 = "stm32mp157f-dk2-m4-examples"
UBOOT_EXTLINUX_MENU_DESCRIPTION_stm32mp157f-ev1-m4 = "stm32mp157f-ev1-m4-examples"
# Define FDT overrides for new M4 labels
UBOOT_EXTLINUX_FDT_stm32mp157c-dk2-m4 = "/stm32mp157c-dk2-m4-examples.dtb"
UBOOT_EXTLINUX_FDT_stm32mp157c-ev1-m4 = "/stm32mp157c-ev1-m4-examples.dtb"
UBOOT_EXTLINUX_FDT_stm32mp157f-dk2-m4 = "/stm32mp157f-dk2-m4-examples.dtb"
UBOOT_EXTLINUX_FDT_stm32mp157f-ev1-m4 = "/stm32mp157f-ev1-m4-examples.dtb"

通过bitbake 查看环境变量如下:
在这里插入图片描述extlinux可以提供一个选择菜单选择使用什么dtb文件(是么?)

st-machine-flashlayout-stm32mp.inc

st-machine-common-stm32mp.inc

上面的inc最后大部分都会在st-machine-common-stm32mp.inc中被调用或者被配置。这里面涉及到很多class的内容。这部分暂时先不分析,等下一片文章分析完machine class里面的所有内容再回来分析整体的conf文件的内容
TODO…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/39160.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

骨传导耳机的危害有哪些,骨传导耳机是不是智商税?

关于骨传导耳机的资讯&#xff0c;在网上众说纷纭&#xff0c;那么骨传导耳机在佩戴使用时到底会不会对我们造成伤害&#xff0c;骨传导耳机到底是不是智商税呢&#xff1f;下面就给大家讲解一下骨传导耳机传播声音的方式吧。 骨传导耳机传播声音的方式是通过耳旁的骨骼传声&am…

地级市高新技术企业统计情况(2000-2019)

1、数据来源&#xff1a;国泰君安 2、时间跨度&#xff1a;2000-2019 3、区域范围&#xff1a;全国 4、指标说明&#xff1a; ① 高新技术企业定义&#xff1a;高新技术企业是指通过科学技术或者科学发明在新领域中的发展&#xff0c;或者在原有领域中革新似的运作。在界定…

C语言实现扫雷游戏(分解代码,超级详细,无压力)

目录 一、扫雷游戏 1.1玩法 1.2游戏的基本功能 二、游戏的实现 2.1创建数组 2.1.1为什么设置两组行和列&#xff1f; 2.2初始化棋盘 ‘ 2.2.1函数的调用 2.2.2函数体的实现 2.3打印棋盘 2.3.1函数的调用 2.3.2函数体的实现 2.3.3运行结果 2.4设置雷的位置 2.4.1函数…

HTML+CSS+JS网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划与设计

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

华为云桌面Workspace,实惠更实用!

今年双十一的活动&#xff0c;在各大平台都掀起一股“剁手热潮”。而对于企业主来说&#xff0c;双十一也有各种活动&#xff0c;比如华为云推出了“实惠更实用&#xff0c;‘11’都如愿”活动&#xff0c;也令到企业采购部门蠢蠢欲动。这究竟是怎么回事呢&#xff1f; 据了解&…

JAVA的学习心路历程之JDK基础入门(下)

这篇是本人JAVA基础学习的下篇&#xff0c;上篇链接在&#xff1a; JAVA的学习心路历程之JDK基础入门&#xff08;上&#xff09;_Thomas_Lbw的博客-CSDN博客_jdk学习 目录 一、字符流 1.1 字符流基类 二、文件操作 2.1 文件操作 三、Swing 四、多线程编程 4.1 多线程…

算法刷题打卡第27天:省份数量---深度优先搜索

省份数量 难度&#xff1a;中等 有 n 个城市&#xff0c;其中一些彼此相连&#xff0c;另一些没有相连。如果城市 a 与城市 b 直接相连&#xff0c;且城市 b 与城市 c 直接相连&#xff0c;那么城市 a 与城市 c 间接相连。 省份 是一组直接或间接相连的城市&#xff0c;组内不…

干测试这些年,去过阿里也去过小公司,给年轻测试员们一个忠告....

前言 你眼中的软件测试岗位是怎样的&#xff1f;大部分人可能会给出这样的回答&#xff1a;“测试&#xff1f;简单啊&#xff0c;没什么技术含量&#xff0c;无非就是看需求、看业务手册、看设计文档、然后点点功能是否实现&#xff0c;麻烦点的就是测试下部署安装是否出现兼…

二十三、CANdelaStudio深入-SnapshotData编辑

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的SnapshotData编辑,欢迎各位朋友订阅、评…

C#语言实例源码系列-实现滚动字幕

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过程中…

考虑储能电池参与一次调频技术经济模型的容量配置方法matlab程序

考虑储能电池参与一次调频技术经济模型的容量配置方法matlab程序 参考文献&#xff1a;考虑储能电池参与一次调频技术经济模型的容量配置方法 摘要 &#xff1a;规模间歇电源并网引起的电网频率问题&#xff0c;导致对引入储能辅助调频的研究越发迫切。提出一种考虑储能电池参…

网安学习Day14(web漏洞-SQL注入类型及提交注入)

SQL注入类型及提交注入简要明确参数类型简要明确请求方法参数字符型注入测试>sqlilabs less 5 6sqlilabs less 5在这里插入图片描述sqlilabs less 6POST数据提交注入测试>sqlilabs less 11参数JSON数据注入测试>本地环境代码演示COOKIE数据提交注入测试>sqlilabs l…

解决Windows 10 家庭中文版没有组策略编辑器的问题

解决Windows 10 家庭中文版无法打开组策略编辑器的问题 &#xff08;以下为解决效果&#xff09; 今天在工作时发现电脑无法打开组策略编辑器&#xff0c;即WinR输入gpedit.msc不能正常调出组策略编辑器&#xff1b; 查看了电脑为Windows 10 家庭中文版&#xff0c;查资料后发…

《恋上数据结构与算法》第1季:双向链表实现(超详细笔记,图文并茂)

数据结构与算法的学习笔记目录&#xff1a;《恋上数据结构与算法》的学习笔记 目录索引双向链表一、双向链表补充【List接口 和 AbstractList抽象类】二、设计双向链表三、双向链表的实现1. 查询节点2. 插入节点3. 删除节点4. 清空节点四、双向链表 vs 动态数组一、双向链表 与…

JUC包(java.util.concurrent)下的常用子类

文章目录前言一、对象锁juc.locks包二、原子类三、四个常用工具类3.1 信号量 Semaphore3.2 CountDownLatch总结前言 博主个人社区&#xff1a;开发与算法学习社区 博主个人主页&#xff1a;Killing Vibe的博客 欢迎大家加入&#xff0c;一起交流学习~~ 一、对象锁juc.locks包 …

单元测试入门篇

一、单元测试是什么&#xff1f; 单元测试&#xff08;unit testing&#xff09;&#xff0c;是指对软件中的最小可测试单元进行检查和验证。在测试金字塔模型中处于最底层&#xff1a; 整个金字塔模型代表着越上层的测试集成度越高&#xff0c;执行速度越慢&#xff0c;越下层…

2014-2020年国有大型商业银行和全国股份制商业银行绿色信贷数据

数据集名称&#xff1a;国有大型商业银行和全国股份制商业银行绿色信贷数据 时间范围&#xff1a;2014-2020年 数据来源&#xff1a;商业银行历年业绩报告和社会责任报告 相关说明&#xff1a;绿色金融是指为支持环境改善、应对气候变化和资源节约高效利用的经济活动&#x…

C语言练习之递归实现n的k次方

文章目录前言一、思路二、代码以及运行截图1.代码2.运行截图总结前言 使用C语言递归计算N的k次方 一、思路 求n的k次方的原理就是&#xff1a; n^k nn……*n&#xff08;k个n进行相乘&#xff09; 可以得到一个公式&#xff1a; f(k){1k0n∗f(k)k>0f(k) \left\{\begin{…

利用Redis来实现分布式锁

Redis命令 SET 命令有个 NX 参数可以实现「key不存在才插入」&#xff0c;可以用它来实现分布式锁&#xff1a; 如果 key 不存在&#xff0c;则显示插入成功&#xff0c;可以用来表示加锁成功&#xff1b;如果 key 存在&#xff0c;则会显示插入失败&#xff0c;可以用来表示…

PLC中ST编程的自定义功能块

右键单击——添加对线——程序组织单元 弹出对话框 修改名称&#xff0c;选择功能块&#xff1b; VAR_INPUT&#xff1a;输入变量&#xff1b;VAR_OUTPUT:输出变量&#xff1b;VAR&#xff1a;局部变量&#xff1b; 创建一个闪烁功能块&#xff0c;可输入亮和灭的时间&#xff…