This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] SK-AM62P-LP:新内核构建中出现 EtherCAT 构建错误

Guru**** 1823430 points
Other Parts Discussed in Thread: SK-AM62P-LP
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1432311/sk-am62p-lp-ethercat-build-error-in-new-kernel-build

器件型号:SK-AM62P-LP

工具与软件:

尊敬的专家:


我按照 TI 页面中的这些步骤进行了操作

https://software-dl.ti.com/processor-sdk-linux-rt/esd/AM62PX/10_00_07_04/exports/docs/linux/Foundational_Components_Kernel_Users_Guide html#id19

我安装了内核映像和内核模块。  

当前内核
Linux am62pxx-evm 6.6.6.32-rt32-g04a9ad081f0f-dirty #1 smp preempt_RT 星期二10月29 16:47:42 IST 2024 AArch64 GNU/Linux

这个内核版本缺少 Linux 标头。

但我尝试的是、将旧的 Linux 头文件(linux-headers-6.6.32-k3-rt)复制到/usr/linux 中更新的内核名称 src

linux-headers-6.6.32-rt32-g04a9ad081f0f-dirty

您能不能帮助我们使用这些器件构建 EtherCAT 这是我们从目标中删除的最后一个阻止程序吗

构建 EtherCAT 时出错  

[64316.553416] ec_master: version magic '6.6.32-k3-rt SMP preempt_rt mod_unload aarch64' should be '6.6.32-rt32-g04a9ad081f0f-dirty SMP preempt_rt mod_unload aarch64'


------error from ethercat installation------
ERROR: could not insert 'ec_master': Exec format error  failed


 我们重新编译了 EtherCAT 并成功地重建了它、而且还创建了 ethercat.ko 文件、但问题是因为我删除了旧内核的 lib/模块并粘贴了新的内核模块。 在构建 EtherCAT 时、它会自动创建旧内核名称的文件夹并将 EtherCAT 文件夹粘贴到其中。 之后、我手动复制新内核中的文件夹、即使它无法正常工作也是如此。

让我告诉您一件事、我们不会给出安装 EtherCAT 的任何路径 、但我应该自动采用当前内核。

您能告诉我使用相同的旧内核名称或其他内容构建内核映像的步骤吗?
即使旧内核和新内核存在一些依赖关系、我也有一些依赖关系。

最后要补充的是、我们使用相同的旧 Linux-header(/usr/EtherCAT/Linux**)、同时 src 安装它、获取旧的头并构建它。


这是上一个线程、了解我们构建内核的原因。(+) SK-AM62P-LP:Docker 时发生错误-处理器论坛-处理器- TI E2E 支持论坛

此致、
去巴希

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Debashis、您好!

    您能解释一下如何构建 Acontis EtherCAT 主站吗? 我想看看我是否可以按照相同的步骤来查看我是否可以产生相同的问题。 这将帮助我解决此问题。

    正如您已经提到的、我认为这与内核版本的命名有关(6.6.6.32-K3-RT 与6.6.6.6.32-rt32-g04a9ad081f0f-dirty )。  dirty 关键字表示 Linux Git 工作树有未提交的更改。 因此、这些模块安装在/lib/modules/6.6.中 -dirty /,运行的 Linux 内核的版本必须与此匹配。

    由于重建的内核附有"脏"后缀、因此表示您已在内核源代码中进行更改并根据这些更改构建内核。 您可以还原这些更改或提交这些更改、然后重新编译内核并检查内核版本名称是否去除"脏"后缀。 您可以使用"git status"检查您是否进行了不常见的更改。

    虽然这应该会去掉"脏"、但只要您通过 TI Linux SDK 构建内核、"-g04a9ad081f0f-"仍然会显示。 另外、我想知道是否可以将/lib/modules/6.6.32-rt32-g04a9ad081f0f-dirty 重命名为/lib/modules/6.6.32-k3-rt? 这可能不是处理内核模块版本控制的正确方法、但我认为值得一试。

    -道林

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Daolin:
    我们使用的是 IGH EtherCAT 主站。
    此链接可用于检查安装步骤 https://gitlab.com/etherlab.org/ethercat/-/blob/stable-1.5/INSTALL.md?ref_type=heads

    只有在这一行中、我们针对启用或禁用某些功能进行了一些修改。  

    ./configure-enable-Sii-assign --disable-8139too --enable-hrtimer --enable-generic --disable-eoe.

    [报价 userid="576780" url="~/support/processors-group/processors/f/processors-forum/1432311/sk-am62p-lp-ethercat-build-error-in-new-kernel-build/5492458 #5492458"]尽管这样可以摆脱"肮脏"的问题、但只要您通过 TI Linux SDK 构建内核、我相信只要您仍将显示"-g04a9ad081f0f-"。 或者、[/报价]

    是的、您是正确的、现在它显示了一些类似的内容

    Linux am62pxx-evm 6.6.32-rt32-g66c58b6a4a36 #1 SMP PREEMPT_RT Fri Nov 1 10:57:25 IST 2024 aarch64 GNU/Linux



    我想知道您是否可以将/lib/modules/6.6.32-rt32-g04a9ad081f0f-dirty 重命名为/lib/modules/6.6.32-k3-rt? 这可能不是处理内核模块版本控制的正确方法、但我认为值得一试。

    当我重命名它时、它显示我们重命名模块的路径存在一些错误(无法打开该文件夹)。 但在我重命名这个后,我在./ config - with-linux-dir 向/usr/linux/linux-header 路径中再给一个添加到 src 中,否则它显示的错误无法找到 linux 头。

    depmod: ERROR: could not open directory /lib/modules/6.6.32-rt32-g66c58b6a4a36: No such file or directory
    depmod: FATAL: could not search modules: No such file or directory



    之后、我再次将内核的名称修改为前一个并构建 EtherCAT、我遇到了与前一个相同的错误。


    此致、
    去巴希

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Daolin:

    在添加此命令后、我意识到 我们必须使用 Linux 标头、因为我复制了旧的 Linux 标头并重命名了新的 Linux 标头、这可能会导致此错误。

    命令
    ./配置 --with-linux-dir=/lib/modules ( uname -r )/ build --with-module-dir=/lib/modules ( uname -r )

    用于创建旧内核名称并安装 EtherCAT 的 tree 命令。

    root@am62pxx-evm:/home/ethercat/sncn_installer# tree /lib/modules/6.6.32-k3-rt/
    /lib/modules/6.6.32-k3-rt/
    -- lib
        -- modules
            -- 6.6.32-rt32-g66c58b6a4a36
                |-- devices
                |   -- ec_generic.ko
                |-- examples
                |   -- mini
                |       -- ec_mini.ko
                -- master
                    -- ec_master.ko
    
    8 directories, 3 files


    您能给我一点澄清一下吗?

    此致、
    去巴希

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Daolin:

    我介绍了 Linux 源代码的 makefile、并构建了 Linux 头文件。
    之后、我尝试构建 EtherCAT、它在./configure only 中显示错误




    root@am62pxx-evm:/home/ethercat# ./configure --enable-sii-assign --disable-8139too --enable-hrtimer --enable-generic --disable-eoe
    checking for a BSD-compatible install... /usr/bin/install -c
    checking whether build environment is sane... yes
    checking for a race-free mkdir -p... /usr/bin/mkdir -p
    checking for gawk... no
    checking for mawk... mawk
    checking whether make sets $(MAKE)... yes
    checking whether make supports nested variables... yes
    checking whether make supports nested variables... (cached) yes
    checking for a sed that does not truncate output... /usr/bin/sed
    checking for pkg-config... /usr/bin/pkg-config
    checking pkg-config is at least version 0.9.0... yes
    checking whether make supports the include directive... yes (GNU style)
    checking for gcc... gcc
    checking whether the C compiler works... yes
    checking for C compiler default output file name... a.out
    checking for suffix of executables... 
    checking whether we are cross compiling... no
    checking for suffix of object files... o
    checking whether the compiler supports GNU C... yes
    checking whether gcc accepts -g... yes
    checking for gcc option to enable C11 features... none needed
    checking whether gcc understands -c and -o together... yes
    checking dependency style of gcc... gcc3
    checking for ar... ar
    checking the archiver (ar) interface... ar
    checking for g++... g++
    checking whether the compiler supports GNU C++... yes
    checking whether g++ accepts -g... yes
    checking for g++ option to enable C++11 features... none needed
    checking dependency style of g++... gcc3
    checking build system type... aarch64-unknown-linux-gnu
    checking host system type... aarch64-unknown-linux-gnu
    checking how to print strings... printf
    checking for a sed that does not truncate output... (cached) /usr/bin/sed
    checking for grep that handles long lines and -e... /usr/bin/grep
    checking for egrep... /usr/bin/grep -E
    checking for fgrep... /usr/bin/grep -F
    checking for ld used by gcc... /usr/bin/ld
    checking if the linker (/usr/bin/ld) is GNU ld... yes
    checking for BSD- or MS-compatible name lister (nm)... /usr/bin/nm -B
    checking the name lister (/usr/bin/nm -B) interface... BSD nm
    checking whether ln -s works... yes
    checking the maximum length of command line arguments... 1572864
    checking how to convert aarch64-unknown-linux-gnu file names to aarch64-unknown-linux-gnu format... func_convert_file_noop
    checking how to convert aarch64-unknown-linux-gnu file names to toolchain format... func_convert_file_noop
    checking for /usr/bin/ld option to reload object files... -r
    checking for file... file
    checking for objdump... objdump
    checking how to recognize dependent libraries... pass_all
    checking for dlltool... no
    checking how to associate runtime and link libraries... printf %s\n
    checking for archiver @FILE support... @
    checking for strip... strip
    checking for ranlib... ranlib
    checking command to parse /usr/bin/nm -B output from gcc object... ok
    checking for sysroot... no
    checking for a working dd... /usr/bin/dd
    checking how to truncate binary pipes... /usr/bin/dd bs=4096 count=1
    checking for mt... mt
    checking if mt is a manifest tool... no
    checking for stdio.h... yes
    checking for stdlib.h... yes
    checking for string.h... yes
    checking for inttypes.h... yes
    checking for stdint.h... yes
    checking for strings.h... yes
    checking for sys/stat.h... yes
    checking for sys/types.h... yes
    checking for unistd.h... yes
    checking for dlfcn.h... yes
    checking for objdir... .libs
    checking if gcc supports -fno-rtti -fno-exceptions... no
    checking for gcc option to produce PIC... -fPIC -DPIC
    checking if gcc PIC flag -fPIC -DPIC works... yes
    checking if gcc static flag -static works... yes
    checking if gcc supports -c -o file.o... yes
    checking if gcc supports -c -o file.o... (cached) yes
    checking whether the gcc linker (/usr/bin/ld) supports shared libraries... yes
    checking whether -lc should be explicitly linked in... no
    checking dynamic linker characteristics... GNU/Linux ld.so
    checking how to hardcode library paths into programs... immediate
    checking whether stripping libraries is possible... yes
    checking if libtool supports shared libraries... yes
    checking whether to build shared libraries... yes
    checking whether to build static libraries... yes
    checking how to run the C++ preprocessor... g++ -E
    checking for ld used by g++... /usr/bin/ld
    checking if the linker (/usr/bin/ld) is GNU ld... yes
    checking whether the g++ linker (/usr/bin/ld) supports shared libraries... yes
    checking for g++ option to produce PIC... -fPIC -DPIC
    checking if g++ PIC flag -fPIC -DPIC works... yes
    checking if g++ static flag -static works... yes
    checking if g++ supports -c -o file.o... yes
    checking if g++ supports -c -o file.o... (cached) yes
    checking whether the g++ linker (/usr/bin/ld) supports shared libraries... yes
    checking dynamic linker characteristics... (cached) GNU/Linux ld.so
    checking how to hardcode library paths into programs... immediate
    checking whether to build kernel modules... yes
    checking for Linux kernel sources... 
    configure: error: Failed to extract Linux kernel version!
    .



    此致、
    去巴希

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Debashis、您好!

    将旧的 linux 头文件(linux-headers-6.6.32-k3-rt)复制到/usr/linux
    中更新的内核名称 src

    您表示"6.6.32-K3-RT"是"旧的 Linux 头文件"。 "6.6.32-K3-RT"源自何处? 它是从 TI SDK 构建 Linux 内核生成的吗?  

    命令
    ./配置 --with-linux-dir=/lib/modules ( uname -r )/ build --with-module-dir=/lib/modules ( uname -r )

    您是否在 Linux 主机 PC 上运行此命令? 为什么选择使用/lib/modules/..?来配置--with-linux-dir 和--with-module-dir 如果这是在主机 PC 上、则/lib/modules 的内容将与 DUT (SK-AM62P-LP)上的/lib/modules 不同。

    相反、您应该将--with-linux-dir 指向 /板支持/ 安装目录。

    此外、--with-modules-dir 应指向将要构建的内核模块应安装的位置。 一个选项是创建自己的目录并指向该目录、以便在其中安装模块。 之后、如果您使用 SD 卡、只需记住在 DUT 的 SD 卡上安装这些模块即可。

    -道林

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Daolin:
    为方便了解、请允许我在 SK-AM62P-LP 中构建 EtherCAT、而不是在我的主机系统中构建。
    我只使用一些配置标记构建内核以使 Docker 正常工作。

    这是默认内核随 Trixi SDK"6.6.32-K3-RT" 在该内核 EtherCAT 编译中也能很好地工作。
    如上所述、我做了一个提交、然后再次使用一些更新的标志(更新的内核6.6.32-rt32-g66c58b6a4a36)和 SD 卡中的转储来构建内核。


    我遵循的步骤:

    /*After the respective changes for kernel related flags*/ 
    
    make ARCH=arm64 CROSS_COMPILE="$CROSS_COMPILE_64" defconfig ti_arm64_prune.config ti_rt.config
    
    make ARCH=arm64 CROSS_COMPILE="$CROSS_COMPILE_64" Image
    
    make ARCH=arm64 CROSS_COMPILE="$CROSS_COMPILE_64" modules
    
    sudo cp arch/arm64/boot/Image /media/rootfs/boot
    
    sudo make ARCH=arm64 INSTALL_MOD_PATH=/media/rootfs modules_install



    复制映像和模块后、我们需要 Linux 标头用于更新的内核。 为此、我将文件与现有的 Linux 头文件夹进行比较、并将相同的结构从 Linux RT SDK 复制到 SD 卡中。

    为新内核头文件复制 ti sdk 的文件和文件夹:
    Makefile Module.symvers arch scripts .config

    包括 文件夹将随此命令生成
    sudo make ARCH=ARM64 INSTALL_HDR_PATH=/media/rootfs/usr src /linux-headers-6.6.32-rt32-g66c58b6a4a36 headers_install



    此致、
    去巴希

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Debashis、您好!

    如需了解相关信息、请告诉您、我是在 SK-AM62P-LP 中构建 EtherCAT、而不是在我的主机系统中。

    您是否能够改为尝试在主机系统中构建? 我认为直接在 DUT 中进行构建可能会引发一些冲突、从而导致您看到的 EtherCAT 构建问题。 在主机开发系统中构建内核模块、然后将它们复制/安装到 DUT 的 SD 卡中更符合标准。 这将包括从 IGH 构建 EtherCAT 模块。

    这是默认内核随附的 Trixi SDK"6.6.32-K3-RT"内核 在这个内核 EtherCAT 构建过程中运行良好。

    什么是"Trixi SDK"? 能够在同一 DUT 上完美地工作? 我不认为"6.6.6.6.6.32-K3-RT"是显示在 TI SDK 10.0默认映像中的 Linux 内核版本名称。 如前所述、我们的 TI SDK Linux 内核在 SDK 10.0中将遵循"6.6.32-6.6.32-rt32-g04a9ad081f0f"格式。

    -道林

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Daolin:

    什么是"Trixi SDK"? 能够在同一 DUT 上完美地工作? 我不认为"6.6.6.6.6.32-K3-RT"是显示在 TI SDK 10.0默认映像中的 Linux 内核版本名称。 如前所述、我们的 TI SDK Linux 内核在 SDK 10.0.[/QUOT]上将遵循"6.6.32-6.6.32-rt32-g04a9ad081f0f"格式

    这是 ti 给出的默认 SDK:  

    版本:10.00.07.04

    tisdk-Debian-Trixie-rt-am62pxx-evm.xz  link SDK-AM62P 软件开发套件(PROCESSOR-SDK-LINUX-RT)|德州仪器 TI.com


    "6.6.6.6.32-rt32-g04a9ad081f0f" 只有在构建内核和转储后才能看到该名称、但默认的 SDK 内核不会显示该名称。
    默认内核名称为"6.6.32-K3-RT"  

    但我不知道如何在主机系统中构建 EtherCAT、您能否指导我如何构建它。 到目前为止、我们仅在目标系统中执行该操作。

    或者、如果可能、请告诉我是否缺少新内核构建的任何步骤、因为在默认情况下内核 EtherCAT 正常工作、但 Docker 无法在其中工作。

    您能说明什么是 DUT 吗?


    此致、
    去巴希

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Debashis、您好!

    [报价 userid="571982" url="~/support/processors-group/processors/f/processors-forum/1432311/sk-am62p-lp-ethercat-build-error-in-new-kernel-build/5494215 #5494215"]但我不知道如何在主机系统中构建 EtherCAT 您能指导我如何实现它吗? 到目前为止、我们仅在目标系统中执行此操作。

    我将看到我是否能够在明天的目标系统上完成您之前共享的步骤、然后看看在重新构建内核后、我是否可以看到同样的问题。 我计划明天用最新消息进行回应。

    您能说出什么是 DUT 吗?

    受测的 DUT=器件或目标系统

    -道林

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Debashis、您好!

     https://gitlab.com/etherlab.org/ethercat/-/blob/stable-1.5/INSTALL.md?ref_type=heads#building-and-installing 文档中提供的说明介绍了在主机开发系统上构建 EtherCAT 主站、然后在目标系统上安装完全构建的软件的步骤。

    您采取了哪些具体步骤来直接在目标系统上成功构建?

    [报价 userid="571982" url="~/support/processors-group/processors/f/processors-forum/1432311/sk-am62p-lp-ethercat-build-error-in-new-kernel-build/5494215 #5494215"]但我不知道如何在主机系统中构建 EtherCAT 您能指导我如何实现它吗? 到目前为止、我们仅在目标系统中执行此操作。

    EtherCAT 主站是一个特定于应用的程序、TI 无法提供有关如何构建和安装应用特定软件的专业指导。 此外、IGH EtherCAT Master 是一种 TI 不提供直接支持的开源软件、我们主要支持 TI 硬件、并且 在 Linux、TI 特定的 Linux 驱动程序/内核方面。

    我们提供了一些在线资源、介绍如何在主机开发系统上构建 Linux 应用。 例如、 https://bootlin.com/doc/training/embedded-linux-beagleplay/embedded-linux-beagleplay-labs.pdf 的第43页 通过第三方 Linux 应用程序的示例构建运行、包括如何设置./configure 文件的选项。

    之前、我在第一次测试 IGH 时、曾在 SK-AM62x 上执行过以下步骤;但是、由于我使用的是较旧的内核版本、这可能对您有用、也可能不起作用。

    FROM HOST DEVELOPMENT PC
    Download the "ethercat-stable-1.6" branch
    Using master branch could result in some WARNINGS when building modules
    
    $sudo apt-get install autoconf
    $sudo apt-get install libtool
    $autoupdate
    
    $./bootstrap (Bootlin: similar to autoreconf to create configure and Makefile.in)
    
    ./configure --sysconfdir=/opt/etherlab --prefix=/opt/etherlab --with-linux-dir=<SDK install path>/board-support/ti-linux-kernel/ --with-module-dir=/opt/etherlab/ouput --enable-8139too=no --enable-eoe=no CC=<SDK install where this compiler can be found>/arm-gnu-toolchain-11.3.rel1-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc --host=aarch64-none-linux-gnu 
    
    $sudo su
    
    #export PATH=<PATH to cross-compiler toolchain>:$PATH
    //You can use the same toolchain as used for "CROSS_COMPILEE_64" in software-dl.ti.com/.../Foundational_Components_Kernel_Users_Guide.html
    
    #make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- modules
    
    Highly not recommended to run "make install" as it installs in host pc's /opt directory! Additionally, doesn't actually install the ethercat modules into /opt/etherlab/output
    
    Instead, follow the below steps
    1.After building the Image and modules from the SDK, install these to an SD already flashed with a default image
    	To install modules: sudo make ARCH=arm64 INSTALL_MOD_PATH=/media/<host PC user name>/root modules_install
    2.Make sure that the modules that were installed have the same name as the original (kernel version) name from the default image --> otherwise installing the IgH modules will not work

    -道林

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Daolin:

    我想向您通报最新情况、并征求您的建议。 大约30分钟前、我成功解决了这个问题、但感谢您的答复。

    我们已经在目标系统中直接构建内核(带有已更改标志的 ti 内核)并安装了这些模块。 之后 、我只需在/boot/目录中将更新后的内核重命名为"Image"、然后重新启动系统。

    目前、我已成功在带有更新内核的 Debian 上安装了 EtherCAT。 但是、当我运行 Ubuntu 22 Docker 容器时、我将更新的lib/modules和复制linux-headers到该容器中、并尝试在容器中再次安装 EtherCAT。 现在、我看到一个错误、表示 GCC 版本不匹配—Linux 标头是使用 GCC 14.0构建的、而 Docker 容器(Ubuntu 22)使用 GCC 11。

    我认为有两种方法可以解决这一问题:

    1. 将 Ubuntu Docker 容器(Ubuntu 22)中的 GCC 版本升级到14.0.2。
    2. 只需make在 Docker 容器内的 Linux 标头上运行命令、以便使用 Docker 环境构建标头。

    目前我正在尝试从 Docker 中的源代码构建 gcc 14、因为 Ubuntu 22没有提供 gcc14软件包。

    您建议使用哪种方法来解决此问题?

    此致、
    去巴希

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Daolin:

    我们已在 Docker 中成功安装 EtherCAT

    只需make在 Docker 容器内的 Linux 标头上运行命令、即可使用 Docker 环境构建标头

    我们采用了这个选项、因为它更简单。 然而、选项1也可以通过安装所有必需的依赖项来实现、就像我们在 Debian 上所做的那样。

    我要感谢 Daolin 和您的团队帮助我完成此问题。

    此致、
    去巴希