aspeed2600 openbmc对mctp over pcie的支持分析(支持mctp over pcie)

2024-08-29 13:44

本文主要是介绍aspeed2600 openbmc对mctp over pcie的支持分析(支持mctp over pcie),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

遍搜全网,竟然关于openbmc mctp over pcie的支持说明情况了无文章,这不是一个艰难的问题,服务器BMC也不是一个超级精尖的产品,想当年分享stm32资料,都是满天飞。可能服务器市场大家对于文章上的分享并无兴趣。

此篇文章只是一个最基本的简单的说明文章,弥补一下openbmc资源匮乏吧。另外,本片文章只是一个简单的开篇文章,有错漏,有知识不全面,请尽管评论。

注意: 本章涉及的代码可以查看代码仓库:https://gitee.com/wit_yuan/yuan_mctpd/tree/yuan_modified_mctpd

1.官方活跃的mctp支持情况

官方活跃的2个仓库有:https://github.com/CodeConstruct/mctp和https://github.com/openbmc/libmctp,这一套下来还需要kernel的支持, 代码的提交可以参考如下链接:
https://lore.kernel.org/netdev/20210729022053.134453-1-jk@codeconstruct.com.au/
简单来讲,可以参考内核这几个文件:

build/ast2600-default/workspace/sources/linux-aspeed/net/mctp/af_mctp.c
build/ast2600-default/workspace/sources/linux-aspeed/net/mctp/device.c
build/ast2600-default/workspace/sources/linux-aspeed/net/mctp/neigh.c
build/ast2600-default/workspace/sources/linux-aspeed/net/mctp/route.c
build/ast2600-default/workspace/sources/linux-aspeed/net/socket.c

这几个文件是核心的整个mctp架构代码。

如下几个文件是驱动代码,对接到硬件上:

build/ast2600-default/workspace/sources/linux-aspeed/drivers/net/mctp/mctp-i2c.c
build/ast2600-default/workspace/sources/linux-aspeed/drivers/net/mctp/mctp-i3c.c
build/ast2600-default/workspace/sources/linux-aspeed/drivers/net/mctp/mctp-serial.c

可以看到,这里面没有一个直接的针对mctp-pcie.c文件,粗浅看,这个架构是不支持mctp over pcie的。

补充一点,文件:build/ast2600-default/workspace/sources/linux-aspeed/drivers/soc/aspeed/aspeed-mctp.c是内核的mctp over pcie驱动文件,但是说了与不说一样,因为架构上没支持(差一个驱动程序)。

简单看一下文件:build/ast2600-default/workspace/sources/linux-aspeed/drivers/net/mctp/mctp-i2c.c中的mctp_i2c_add_netdev()函数:

static int mctp_i2c_add_netdev(struct mctp_i2c_client *mcli,struct i2c_adapter *adap)
---> struct net_device *ndev = NULL;
---> ndev = alloc_netdev(sizeof(*midev), namebuf, NET_NAME_ENUM, mctp_i2c_net_setup);
---> rc = mctp_register_netdev(ndev, &mctp_i2c_mctp_ops);

可以反推,目前的架构是不支持mctp over pcie的。当前的架构情况是kernel mctp + lib + dbus服务组成。

2.intel-mctp的支持情况

留意: intel已经对这一块不再维护了。

可以在intelopenbmc仓库里面,找到链接:

  • 1.libmctp链接:https://github.com/Intel-BMC/libmctp
  • 2.pmci链接:https://github.com/Intel-BMC/pmci
  • 3.mctpd链接:https://github.com/Intel-BMC/pmci/tree/master/mctpd

mctpd仓库代码,基本上看到是支持mctp over pcie的并且BMC是支持作为endpoint的。这符合我的需求。

我的需求如下:

1.bios作为bus owner,负责分配eid
2.bmc作为endpoint,访问其他pcie设备

2.1 libmctp分析

libmctp的代码仓库如下:
https://github.com/Intel-BMC/libmctp

对于mctp over pcie的支持,可查看文件:

build/ast2600-default/workspace/sources/libmctp-intel/libmctp.h
build/ast2600-default/workspace/sources/libmctp-intel/astpcie.c

库的功能实现用的是.c文件,实现基本的ioctl(),对于C++来说不好和kernel交互的代码。这里是实现就没什么可说的。

2.2.intel-bmcmctpd的实现

mctpd的代码仓库如下:
https://github.com/Intel-BMC/pmci/tree/master/mctpd

这一块的作用是作为一个dbus service,供其他client调用接口。代码结构比较清晰。

注意,这里面有一个yaml的文件需要导入,作为serverclient等的支持的头文件。

文件可以参考一个patch: https://github.com/Intel-BMC/openbmc/blob/ac27a5095790a2d49a44d7c46440e375a8f84812/meta-openbmc-mods/meta-common/recipes-phosphor/dbus/phosphor-dbus-interfaces/0032-update-meson-build-for-MCTP-interfaces.patch#L33,具体需要修改:
在这里插入图片描述
与:
在这里插入图片描述

2.3 导入intel bmc mctp over pcie的实现

注意:这里导入只是一个基本的功能测试mctp over pcie,不是实际功能开发。

参考git仓库上的.bb文件,资源路径:
https://github.com/Intel-BMC/openbmc/tree/1-release/meta-openbmc-mods/meta-common/recipes-phosphor/pmci.

在目录: meta-aspeed-sdk/recipes-phosphor/mctpd/中导入https://github.com/Intel-BMC/openbmc/blob/1-release/meta-openbmc-mods/meta-common/recipes-phosphor/pmci/mctpd.bb文件。

修改mctpd.bb文件名,改为:mctpd_1.0.bb,内容如:

SUMMARY = "MCTP Daemon"
DESCRIPTION = "Implementation of MCTP (DTMF DSP0236)"LICENSE = "CLOSED"
SRC_URI = "file://mctpd.tar.gz"S = "${WORKDIR}"
PV = "1.0+git${SRCPV}"OECMAKE_SOURCEPATH = "${S}"inherit cmake systemdFILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"DEPENDS += " \libmctp-intel \systemd \sdbusplus \phosphor-logging \boost \i2c-tools \cli11 \nlohmann-json \gtest \phosphor-dbus-interfaces \udev \"PACKAGECONFIG[systemd] = ",,systemd,libsystemd"
SYSTEMD_AUTO_ENABLE:${PN} = "enable"do_install:append(){install -d ${D}/${systemd_system_unitdir}install -d ${D}/${bindir}install -d ${D}/${datadir}/mctp/install -m 755 ${WORKDIR}/${PN}-${PV}/mctpd ${D}/${bindir}install -m 0644 ${S}/configurations/mctp_config.json ${D}/${datadir}/mctp/mctp_config.jsoninstall -m 0644 ${S}/service_files/xyz.openbmc_project.mctpd@.service \${D}/${systemd_system_unitdir}/xyz.openbmc_project.mctpd@.service
}FILES:${PN} += "${systemd_system_unitdir}"
FILES:${PN} += "${datadir}/mctp/"
FILES:${PN} += "${bindir}"

如上,是因为当前使用的openbmc代码未加入intel mctp.bb文件,故把mctpd的代码从intel-bmc网站上下载下来之后,打包成:mctpd.tar.gz,整个目录结构如下:

在这里插入图片描述
采取命令:

# devtool modify mctpd

之后,需要修改build/ast2600-default/tmp/work/armv7ahf-vfpv4d16-openbmc-linux-gnueabi/mctpd/1.0+git/CMakeLists.txt中的内容:

set(CMAKE_CXX_STANDARD 23)-Wnull-dereference \  //需要去掉
install(FILES ${SERVICE_FILES} DESTINATION /usr/lib/systemd/system/) //修改为/usr目录下

另外,修改文件build/ast2600-default/workspace/sources/mctpd/src/SMBusBinding.cpp,注释掉其中的内容:

void SMBusBinding::readResponse()
{// smbusReceiverFd.async_wait(//     boost::asio::posix::descriptor_base::wait_error, [this](auto& ec) {//         if (ec)//         {//             phosphor::logging::log<phosphor::logging::level::ERR>(//                 "Error: mctp_smbus_read()");//             readResponse();//         }//         // through libmctp this will invoke rxMessage and message assembly//         mctp_smbus_read(smbus);//         readResponse();//     });phosphor::logging::log<phosphor::logging::level::ERR>("mctpd yuan modify it, Error: SMBusBinding::readResponse()");
}

另外,修改文件:build/ast2600-default/workspace/sources/mctpd/include/hw/aspeed/PCIeMonitor.hpp中的:

    static constexpr const char* astUdevPath ="/sys/devices/platform/ahb/ahb:apb/1e6e8000.mctp/misc/aspeed-mctp0";

修改文件:meta-aspeed-sdk/recipes-aspeed/packagegroups/packagegroup-oss.bb中的内容:

# delete mctp , wityuan noted 2024/08/25.
SUMMARY:${PN}-apps = "Open Source Applications"
RDEPENDS:${PN}-apps = " \mdio-tool \gperf \iperf3 \pciutils \ethtool \mmc-utils \i3c-tools \i2c-tools \xdma-test \libpeci \dhrystone \nbd-client \iozone3 \ncsi-netlink \hdparm \stressapptest \e2fsprogs-mke2fs \nvme-cli \${@d.getVar('PREFERRED_PROVIDER_u-boot-fw-utils', True) or 'u-boot-fw-utils'} \aer-inject \fio \memtester \coremark \"

删掉了其中的mctp.

之后,执行如下命令,编译mctpd:

# bitbake -c build mctpd

2.4 导入intel-bmc libmctp pcie的实现

当前的openbmc代码实际上是包含libmctp-intel的实现的。修改libmctp-intelbb文件:
修改meta-aspeed-sdk/recipes-phosphor/pmci/libmctp-intel_git.bb文件,内容如:

SUMMARY = "libmctp:intel"
DESCRIPTION = "Implementation of MCTP(DMTF DSP0236)"SRC_URI = "git://github.com/Intel-BMC/libmctp.git;protocol=https;branch=master"
SRCREV = "21dc38e911a27af2e914f834b2e2b775f7dad520"S = "${WORKDIR}/git"PV = "1.0+git"LICENSE = "Apache-2.0 | GPL-2.0-or-later"
LIC_FILES_CHKSUM = "file://LICENSE;md5=0d30807bb7a4f16d36e96b78f9ed8fae"inherit cmake systemd
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"DEPENDS += "i2c-tools"#FILES:${PN}-dev += ""
FILES:${PN} += " ${libdir}"LIBVER = "0.1.0"do_install:append() {install -d ${D}${libdir}install -m 755 ${WORKDIR}/${PN}-${PV}/libmctp_intel.so.${LIBVER} ${D}/${libdir}/
}

修改build/ast2600-default/workspace/sources/libmctp-intel/CMakeLists.txt文件,增加内容:

SET_TARGET_PROPERTIES(mctp_intel PROPERTIES VERSION 0.1.0 SOVERSION 0)

修改内容:

add_library (mctp_intel SHARED alloc.c asti3c.c astlpc.c core.c log.c libmctp.h serial.c astpcie.c smbus.c)

接着修改文件:build/ast2600-default/workspace/sources/libmctp-intel/astpcie.h中的内容:

/* driver device file */
#define AST_DRV_FILE "/dev/aspeed-mctp0"

注意,还需要修改文件:meta-aspeed-sdk/recipes-core/images/obmc-phosphor-image.bbappend:

IMAGE_INSTALL:append = " \webui-vue \libmctp \entity-manager \dbus-sensors \"

libmctp改为libmctp-intel.

执行编译操作:

# bitbake -c build libmctp-intel

编译成功后,启动BMC,或者在文件:build/ast2600-default/workspace/sources/libmctp-intel/oe-workdir/libmctp-intel-1.0+git中可以看到如下信息:

# ls /usr/lib/libm* -al
-rwxr-xr-x    1 root     root        271756 Mar  9  2018 /usr/lib/libm.so.6
lrwxrwxrwx    1 root     root            16 Mar  9  2018 /usr/lib/libmapper.so.1 -> libmapper.so.1.0
-rwxr-xr-x    1 root     root         13548 Mar  9  2018 /usr/lib/libmapper.so.1.0
lrwxrwxrwx    1 root     root            22 Mar  9  2018 /usr/lib/libmctp_intel.so.0 -> libmctp_intel.so.0.1.0
-rwxr-xr-x    1 root     root         34064 Mar  9  2018 /usr/lib/libmctp_intel.so.0.1.0
lrwxrwxrwx    1 root     root            15 Mar  9  2018 /usr/lib/libmnl.so.0 -> libmnl.so.0.2.0
-rwxr-xr-x    1 root     root         17748 Mar  9  2018 /usr/lib/libmnl.so.0.2.0
lrwxrwxrwx    1 root     root            17 Mar  9  2018 /usr/lib/libmount.so.1 -> libmount.so.1.1.0
-rwxr-xr-x    1 root     root        407264 Mar  9  2018 /usr/lib/libmount.so.1.1.0

在这里插入图片描述

注意:
BMC的驱动名称已经改变:

# ls /dev/aspeed-mctp0  -al
crw-------    1 root     root       10, 111 Sep 20 11:23 /dev/aspeed-mctp0

接着修改文件:build/ast2600-default/conf/local.conf,添加内容:

...
IMAGE_INSTALL:append = " mctpd"

以上,改完之后,编译生成镜像:

# bitbake obmc-phosphor-image

最终,启动BMC,在BMC串口下执行命令:

# /usr/bin/mctpd -b pcie &

然后检查是否成功启动dbus mctp服务。

  • 1.查看mctpd服务
# busctl | grep mctp
:1.71                                                  425 mctpd           root             :1.71         serial-getty@ttyS4.service                    -
xyz.openbmc_project.MCTP-pcie                          425 mctpd           root             :1.71         serial-getty@ttyS4.service 

在这里插入图片描述

  • 2.查看检查到哪些endpoint
# busctl tree xyz.openbmc_project.MCTP-pcie
`- /xyz`- /xyz/openbmc_project`- /xyz/openbmc_project/mctp`- /xyz/openbmc_project/mctp/device|- /xyz/openbmc_project/mctp/device/10|- /xyz/openbmc_project/mctp/device/29|- /xyz/openbmc_project/mctp/device/61`- /xyz/openbmc_project/mctp/device/8

在这里插入图片描述

  • 3.检查endpoint属性信息
# busctl introspect  xyz.openbmc_project.MCTP-pcie  /xyz/openbmc_project/mctp/device/10
NAME                                                 TYPE      SIGNATURE RESULT/VALUE                             FLAGS
org.freedesktop.DBus.Introspectable                  interface -         -                                        -
.Introspect                                          method    -         s                                        -
org.freedesktop.DBus.Peer                            interface -         -                                        -
.GetMachineId                                        method    -         s                                        -
.Ping                                                method    -         -                                        -
org.freedesktop.DBus.Properties                      interface -         -                                        -
.Get                                                 method    ss        v                                        -
.GetAll                                              method    s         a{sv}                                    -
.Set                                                 method    ssv       -                                        -
.PropertiesChanged                                   signal    sa{sv}as  -                                        -
xyz.openbmc_project.Common.UUID                      interface -         -                                        -
.UUID                                                property  s         "bca4af17-8995-5632-be7d-53f1697c7912"   emits-change
xyz.openbmc_project.Inventory.Decorator.LocationCode interface -         -                                        -
.LocationCode                                        property  s         ""                                       emits-change
xyz.openbmc_project.Inventory.Decorator.PCIDevice    interface -         -                                        -
.Bus                                                 property  y         57                                       emits-change
.Device                                              property  y         0                                        emits-change
.Function                                            property  y         0                                        emits-change
xyz.openbmc_project.MCTP.Endpoint                    interface -         -                                        -
.Mode                                                property  s         "xyz.openbmc_project.MCTP.Base.Bindin... emits-change
.NetworkId                                           property  q         0                                        emits-change
xyz.openbmc_project.MCTP.PCIVendorDefined            interface -         -                                        -
.MessageTypeProperty                                 property  aq        1 83                                     emits-change
.VendorID                                            property  s         "0x590"                                  emits-change
xyz.openbmc_project.MCTP.SupportedMessageTypes       interface -         -                                        -
.Ethernet                                            property  b         false                                    emits-change
.MctpControl                                         property  b         true                                     emits-change
.NCSI                                                property  b         false                                    emits-change
.NVMeMgmtMsg                                         property  b         false                                    emits-change
.PLDM                                                property  b         true                                     emits-change
.SPDM                                                property  b         false                                    emits-change
.VDIANA                                              property  b         false                                    emits-change
.VDPCI                                               property  b         true                                     emits-change
root@ast2600-default:~#

在这里插入图片描述

  • 4.检查另外一个endpoint:
# busctl introspect  xyz.openbmc_project.MCTP-pcie  /xyz/openbmc_project/mctp/device/8
NAME                                                 TYPE      SIGNATURE RESULT/VALUE                             FLAGS
org.freedesktop.DBus.Introspectable                  interface -         -                                        -
.Introspect                                          method    -         s                                        -
org.freedesktop.DBus.Peer                            interface -         -                                        -
.GetMachineId                                        method    -         s                                        -
.Ping                                                method    -         -                                        -
org.freedesktop.DBus.Properties                      interface -         -                                        -
.Get                                                 method    ss        v                                        -
.GetAll                                              method    s         a{sv}                                    -
.Set                                                 method    ssv       -                                        -
.PropertiesChanged                                   signal    sa{sv}as  -                                        -
xyz.openbmc_project.Common.UUID                      interface -         -                                        -
.UUID                                                property  s         "00000000-0000-0000-0000-000000000000"   emits-change
xyz.openbmc_project.Inventory.Decorator.LocationCode interface -         -                                        -
.LocationCode                                        property  s         ""                                       emits-change
xyz.openbmc_project.Inventory.Decorator.PCIDevice    interface -         -                                        -
.Bus                                                 property  y         0                                        emits-change
.Device                                              property  y         20                                       emits-change
.Function                                            property  y         6                                        emits-change
xyz.openbmc_project.MCTP.Endpoint                    interface -         -                                        -
.Mode                                                property  s         "xyz.openbmc_project.MCTP.Base.Bindin... emits-change
.NetworkId                                           property  q         0                                        emits-change
xyz.openbmc_project.MCTP.PCIVendorDefined            interface -         -                                        -
.MessageTypeProperty                                 property  aq        1 256                                    emits-change
.VendorID                                            property  s         "0x8086"                                 emits-change
xyz.openbmc_project.MCTP.SupportedMessageTypes       interface -         -                                        -
.Ethernet                                            property  b         false                                    emits-change
.MctpControl                                         property  b         true                                     emits-change
.NCSI                                                property  b         false                                    emits-change
.NVMeMgmtMsg                                         property  b         false                                    emits-change
.PLDM                                                property  b         false                                    emits-change
.SPDM                                                property  b         false                                    emits-change
.VDIANA                                              property  b         false                                    emits-change
.VDPCI                                               property  b         true                                     emits-change

如此,基本的mctp over pcie代码逻辑基本上跑通了。

3.问题与解决

3.1 报错libmctp-intel rdepends on libmctp-intel-dev

出现报错信息如下:

ERROR: libmctp-intel-1.0+git-r0 do_package_qa: QA Issue: libmctp-intel rdepends on libmctp-intel-dev [dev-deps]
ERROR: libmctp-intel-1.0+git-r0 do_package_qa: QA Issue: -dev package libmctp-intel-dev contains non-symlink .so '/usr/lib/libmctp_intel.so' [dev-elf]

针对此问题,解决办法如:
CmakeFile中添加:

SET_TARGET_PROPERTIES(mctp_intel PROPERTIES VERSION 0.1.0 SOVERSION 0)

这样可以生成:

lrwxrwxrwx  1 wityuan wityuan     18 826 23:19 libmctp_intel.so -> libmctp_intel.so.0
lrwxrwxrwx  1 wityuan wityuan     22 826 23:19 libmctp_intel.so.0 -> libmctp_intel.so.0.1.0
-rwxr-xr-x  1 wityuan wityuan 150972 826 23:19 libmctp_intel.so.0.1.0

然后: .bb 中添加:

do_install:append() {install -d ${D}${libdir}install -m 755 ${WORKDIR}/${PN}-${PV}/libmctp_intel.so.${LIBVER} ${D}/${libdir}/
}

或者使用静态库?!!, 暂时改为动态库了。

3.2 报错Pseudo log: path mismatch

报错信息如下:

ERROR: Task (/home/wityuan/Desktop/sdk_v09.01/openbmc/meta-aspeed-sdk/recipes-phosphor/mctpd/mctpd_1.0.bb:do_install) failed with exit code '1' 
Pseudo log:
path mismatch [3 links]: ino 21059040 db '/home/wityuan/Desktop/sdk_v09.01/openbmc/build/ast2600-default/tmp/work/armv7ahf-vfpv4d16-openbmc-linux-gnueabi/mctpd/1.0+git/package/usr/src/debug/mctpd/1.0+git/src/main.cpp' req '/home/wityuan/Desktop/sdk_v09.01/openbmc/build/ast2600-default/workspace/sources/mctpd/src/main.cpp'.

可以删除文件:

build/ast2600-default/tmp/work/armv7ahf-vfpv4d16-openbmc-linux-gnueabi/mctpd/1.0+git/pseudo/files.db

然后再次编译即可。目前比较好的办法还没找到。^_ ^

参考资料:https://wiki.yoctoproject.org/wiki/Pseudo_Abort,
解释信息如下:

Pseudo can suffer from problems where files are created or modified in pseudo's fakeroot context, then deleted outside of it. 
In particular, the inode number for that file may be reused. 
If some later access under pseudo uses that inode number, pseudo can see this and become confused about whether the files are the same file or not. 
Under older behaviour for pseudo, the modes of the old file may be applied to the new one, causing mode permission corruption.

3.3 报错package is not obeying usrmerge distro feature

报错信息如下:

<packagename> package is not obeying usrmerge distro feature. /<path> should be relocated to /usr. [usrmerge]

yocto上看到解释如下:

If usrmerge is in DISTRO_FEATURES, this check will ensure that no package installs files to root (/bin, /sbin, /lib, /lib64) directories. 
If you are seeing this message, it indicates that the do_install step (or perhaps the build process that do_install is calling into, 
e.g. make install is using hardcoded paths instead of the variables set up for this (bindir, sbindir, etc.), and should be changed so that it does.

修改办法直接是修改cmakelist中,将install目录改为/usr下。

3.4 报错Files/directories were installed but not shipped in any package

报错信息具体内容如:

<recipename>: Files/directories were installed but not shipped in any package [installed-vs-shipped]

具体解释可以查看文档:https://docs.yoctoproject.org/ref-manual/qa-checks.html,重点是:

Files have been installed within the do_install task but have not been included in any package by way of the FILES variable

修改办法:

Add the files to FILES for the package you want them to appear in (e.g. FILES:${PN} for the main package).
Delete the files at the end of the do_install task if the files are not needed in any package.

也就是需要对应修改:

FILES:${PN} += "..."
do_install:append() {...
}

最后,解决问题,需要多看官方文档:https://docs.yoctoproject.org/ref-manual/,一遍不够,多看几遍吧。另外,多分析bitbake源码。

这篇关于aspeed2600 openbmc对mctp over pcie的支持分析(支持mctp over pcie)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1118025

相关文章

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

Spring、Spring Boot、Spring Cloud 的区别与联系分析

《Spring、SpringBoot、SpringCloud的区别与联系分析》Spring、SpringBoot和SpringCloud是Java开发中常用的框架,分别针对企业级应用开发、快速开... 目录1. Spring 框架2. Spring Boot3. Spring Cloud总结1. Sprin

Spring 中 BeanFactoryPostProcessor 的作用和示例源码分析

《Spring中BeanFactoryPostProcessor的作用和示例源码分析》Spring的BeanFactoryPostProcessor是容器初始化的扩展接口,允许在Bean实例化前... 目录一、概览1. 核心定位2. 核心功能详解3. 关键特性二、Spring 内置的 BeanFactory

MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析

《MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析》本文将详细讲解MyBatis-Plus中的lambdaUpdate用法,并提供丰富的案例来帮助读者更好地理解和应... 目录深入探索MyBATis-Plus中Service接口的lambdaUpdate用法及示例案例背景

MyBatis-Plus中静态工具Db的多种用法及实例分析

《MyBatis-Plus中静态工具Db的多种用法及实例分析》本文将详细讲解MyBatis-Plus中静态工具Db的各种用法,并结合具体案例进行演示和说明,具有很好的参考价值,希望对大家有所帮助,如有... 目录MyBATis-Plus中静态工具Db的多种用法及实例案例背景使用静态工具Db进行数据库操作插入