NXP iMX8MM 修改 UART4至 Cortex-A53 核心
By Toradex秦海
1). 简介
NXP iMX8MM SoC UART-4 接口在默认的 ATF(ARM Trusted Firmware) 中被 RDC 分配给了 Cortex-M4 核心,用作 M4 核心的 Debug UART。如果这时候在 Cortex-A53 核心 Linux Devcie-tree 配置中使能 UART-4,就会出现 Kernel Oops 错误,本文就简单示例如何通过修改 ATF 固件来将 UART-4 重新分配给 Cortex-A53 核心使用。
本文测试使用的是 Toradex 基于 iMX8MM SoC 的 Verdin iMX8MM 计算机模块。
2). 准备
a). Verdin iMX8MM Quad 2GB WB IT ARM核心版配合 Dahlia 载板,连接调试串口UART3(载板X18)到开发主机方便调试。
b). 本文测试 iMX8MM Linux基于 Toradex Ycoto Linux BSP 6.x,更多信息可以参考这里。
3). ATF 固件修改编译
a). ATF 固件是 iMX8MM Boot Container Image的一部分,其中多核心资源管理分配就在这部分固件实现,因此这里先对其进行修改编译,来将 uart4 由默认的 Cortex-M4 重新分配给 Cortex-A53 核心使用。
b). 获取ATF源代码
-------------------------------
$ cd ~/workdir
$ git clone https://github.com/nxp-imx/imx-atf.git -b lf_v2.6
-------------------------------
c). 应用保证 Verdin iMX8MM 正常工作的 patches
./ 从这里下载如下两个 patches,或者也可以从 Ycoto 编译环境下 eta-toradex-nxp/recipes-bsp/imx-atf/files/ 位置获取。
0001-Revert-Add-NXP-s-SoCs-partition-reboot-support.patch 0002-imx8m-hab.c-work-around-gcc-12.1-false-positives.patch
./ 将补丁应用到 ATF 源码
-------------------------------
$ cd ~/workdir/imx-atf
$ git am 0001-Revert-Add-NXP-s-SoCs-partition-reboot-support.patch \
0002-imx8m-hab.c-work-around-gcc-12.1-false-positives.patch
-------------------------------
d). 参考这里说明配置编译toolchain,因为ATF运行于Cortex-A核心,因此需要使用GCC ARM针对Coretx-A核心的GNU-A toolchain,这里使用了9.2 aarch64 64bit版本。
-------------------------------
$ cd ~/workdir/toolchain/
### 解压下载的toolchain压缩包
$ tar xvf gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz
$ ls gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu
9.2-2019.12-x86_64-aarch64-none-linux-gnu-manifest.txt bin lib libexec
aarch64-none-linux-gnu include lib64 share
### export 编译环境变量
$ export ARCH=arm
$ export CROSS_COMPILE=aarch64-none-linux-gnu-
$ export PATH=$PATH:~/workdir/toolchain/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin
### 测试toolchain
$ aarch64-none-linux-gnu-gcc --version
aarch64-none-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture 9.2-2019.12 (arm-9.10)) 9.2.1 20191025
Copyright © 2019 Free Software Foundation, Inc.
......
-------------------------------
e). 参考如下Patch文件修改 ATF 源码
-------------------------------
diff --git a/plat/imx/imx8m/imx8mm/imx8mm_bl31_setup.c b/plat/imx/imx8m/imx8mm/imx8mm_bl31_setup.c
index 8702d5160..c5bb66040 100644
--- a/plat/imx/imx8m/imx8mm/imx8mm_bl31_setup.c
+++ b/plat/imx/imx8m/imx8mm/imx8mm_bl31_setup.c
@@ -61,7 +61,7 @@ static const struct imx_rdc_cfg rdc[] = {
RDC_MDAn(RDC_MDA_M4, DID1),
/* peripherals domain permission */
- RDC_PDAPn(RDC_PDAP_UART4, D1R | D1W),
+ RDC_PDAPn(RDC_PDAP_UART4, D0R | D0W),
RDC_PDAPn(RDC_PDAP_UART2, D0R | D0W),
RDC_PDAPn(RDC_PDAP_UART1, D0R | D0W),
@@ -108,7 +108,7 @@ static const struct imx_rdc_cfg rdc[] = {
RDC_MDAn(RDC_MDA_M4, DID1),
/* peripherals domain permission */
- RDC_PDAPn(RDC_PDAP_UART4, D1R | D1W),
+ RDC_PDAPn(RDC_PDAP_UART4, D0R | D0W),
RDC_PDAPn(RDC_PDAP_UART2, D0R | D0W),
RDC_PDAPn(RDC_PDAP_UART1, D0R | D0W),
-------------------------------
f). 编译ATF
-------------------------------
$ cd ~/workdir/imx-atf
$ make PLAT=imx8mm IMX_BOOT_UART_BASE=0x30860000 bl31
### 编译出 bl31.bin 再后续组装Boot Container Image中会需要
$ ls build/imx8mm/release/bl31.bin
build/imx8mm/release/bl31.bin
-------------------------------
4). Boot Container Image编译组装
a). 本文以下编译流程都是基于当前Toradex 最新Linux BSP V6.3版本操作,其他版本以及后续更新版本和不同硬件平台 (比如 Verdin iMX8MP) 差异可以参考这里说明修改适配。
b). 首先获取 DDR Training firmware
----------------------------------
$ cd ~/workdir
$ wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-imx-8.17.bin
$ chmod u+x firmware-imx-8.17.bin
$ ./firmware-imx-8.17.bin
$ ls firmware-imx-8.17/firmware/ddr/synopsys/
----------------------------------
Verdin iMX8MM 需要的是如下 DDR Training firmware 文件
----------------------------------
lpddr4_pmu_train_1d_dmem.bin
lpddr4_pmu_train_2d_dmem.bin
lpddr4_pmu_train_1d_imem.bin
lpddr4_pmu_train_2d_imem.bin
----------------------------------
c). U-boot编译
./ 参考这里说明进行U-boot源代码下载以及编译,这个就是比较常规的bootloader修改编译过程了,针对iMX8MM/iMX8MP平台,如果只是需要修改U-boot(ATF不做修改)的话也需要参考本文流程重新组装Boot Container Image文件后再进行部署。
./ 下载对应BSP版本U-boot源代码
-------------------------------
$ cd ~/workdir
$ git clone -b toradex_imx_lf_v2022.04 git://git.toradex.cn/u-boot-toradex.git
-------------------------------
./ 编译toolchain和上一章节编译ATF是同样toolchain配置,这里不再赘述。
./ 编译,生成 u-boot-nodtb.bin/u-boot-spl.bin/imx8mm-verdin.dtb用于后续Boot Container Image组装
-------------------------------
$ cd ~/workdir/u-boot-toradex
$ make verdin-imx8mm_defconfig
$ make -j$(nproc) 2>&1 | tee build.log
$ ls u-boot-nodtb.bin
u-boot-nodtb.bin
$ ls spl/u-boot-spl.bin
spl/u-boot-spl.bin
$ ls arch/arm/dts/imx8mm-verdin.dtb
arch/arm/dts/imx8mm-verdin.dtb
-------------------------------
d). Boot Container Image组装
./ 首先下载 imx-mkimage 工具
-------------------------------
$ cd ~/workdir/
$ git clone -b lf-5.15.32_2.0.0 https://github.com/nxp-imx/imx-mkimage.git
-------------------------------
./ 将上述章节准备好的DDR Training Firmware、ATF、U-boot binary等文件复制到imx-mkimage对应目录
-------------------------------
$ cd ~/workdir/imx-mkimage/
$ cp ~/workdir/firmware-imx-*/firmware/ddr/synopsys/lpddr4_pmu_train_1d_dmem.bin iMX8M
$ cp ~/workdir/firmware-imx-*/firmware/ddr/synopsys/lpddr4_pmu_train_2d_dmem.bin iMX8M
$ cp ~/workdir/firmware-imx-*/firmware/ddr/synopsys/lpddr4_pmu_train_1d_imem.bin iMX8M
$ cp ~/workdir/firmware-imx-*/firmware/ddr/synopsys/lpddr4_pmu_train_2d_imem.bin iMX8M
$ cp ~/workdir/imx-atf/build/imx8mm/release/bl31.bin iMX8M
$ cp ~/workdir/u-boot-toradex/spl/u-boot-spl.bin iMX8M
$ cp ~/workdir/u-boot-toradex/u-boot-nodtb.bin iMX8M
$ cp ~/workdir/u-boot-toradex/arch/arm/dts/imx8mm-verdin.dtb iMX8M/fsl-imx8mm-evk.dtb
$ cp ~/workdir/u-boot-toradex/tools/mkimage iMX8M/mkimage_uboot
-------------------------------
./ 组装Boot Container Image,最终生成 flash.bin 文件
-------------------------------
$ make clean; make SOC=iMX8MM flash_evk_emmc_fastboot
$ ls iMX8M/flash.bin
-------------------------------
5). Linux 内核设备树 (Device-Tree) 修改
a). 除了上面 ATF 固件的修改,由于uart4 接口默认 Linux Device Tree 配置是关闭的,这里需要修改打开后重新编译生成新的 Device Tree 文件。
b). 参考这里说明下载 Verdin iMX8MM Ycoto Linux BSP 6.3对应的Linux Kernel branch (toradex_5.15-2.1.x-imx),并配置相应的编译环境,参考如下 patch 修改 device tree源文件后,重新编译生成新的device tree binary 文件 imx8mm-verdin-wifi-dev.dtb
-------------------------------
diff --git a/arch/arm64/boot/dts/freescale/imx8mm-verdin-dev.dtsi b/arch/arm64/boot/dts/freescale/imx8mm-verdin-dev.dtsi
index a8a906e18d1e..59977b8a3698 100644
--- a/arch/arm64/boot/dts/freescale/imx8mm-verdin-dev.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8mm-verdin-dev.dtsi
@@ -141,6 +141,11 @@
status = "okay";
};
+/* Verdin UART_4, used by M4 by default need corresponding ATF firmware modification to active */
+&uart4 {
+ status = "okay";
+};
+
/* Verdin USB_1 */
&usbotg1 {
disable-over-current;
-------------------------------
6). 部署测试
a). 从这里下载Toradex Ycoto Linux BSP Multimedia Image Quarterly 6.3.0+build.7版本,默认image通过Toradex Easy Installer安装后,将 /boot 目录下的默认 imx8mm-verdin-wifi-dev.dtb device-tree 文件替换为章节6 生成的文件后启动测试,由于没有修改 ATF (默认版本是v2.6(release):lf_v2.6-g3c1583ba0a),会报出 kernel Oops 错误。
-------------------------------
U-Boot SPL 2022.04-6.3.0+git.c71ae7141f30 (May 15 2023 - 16:20:01 +0000)
DDRINFO: start DRAM init
DDRINFO: DRAM rate 3000MTS
DDRINFO:ddrphy calibration done
DDRINFO: ddrmix config done
Normal Boot
WDT: Started watchdog@30280000 with servicing (60s timeout)
Trying to boot from MMC1
NOTICE: BL31: v2.6(release):lf_v2.6-g3c1583ba0a
NOTICE: BL31: Built : 11:00:38, Nov 21 2022
......
......
0.795948] Internal error: synchronous external abort: 96000210 [#1] PREEMPT SMP
[ 0.803445] Modules linked in:
[ 0.806510] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 5.15.77-6.3.0+git.ddc6ca4d76ea #1
[ 0.814525] Hardware name: Toradex Verdin iMX8M Mini WB on Verdin Development Board (DT)
[ 0.822624] pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[ 0.829593] pc : imx_uart_probe+0x31c/0x7d0
[ 0.833791] lr : imx_uart_probe+0x30c/0x7d0
[ 0.837984] sp : ffff800009c1bb60
[ 0.841300] x29: ffff800009c1bb60 x28: 0000000000000000 x27: ffff8000096904c0
[ 0.848452] x26: ffff000000a9de00 x25: 00000000fffffffa x24: 00000000fffffffa
[ 0.855603] x23: ffff000000394810 x22: 0000000000000032 x21: ffff000000394800
[ 0.862754] x20: 0000000000000000 x19: ffff000000889880 x18: ffffffffffffffff
[ 0.869904] x17: 647561625f657361 x16: 62202c3534203d20 x15: ffff000000a9da8a
[ 0.877051] x14: ffffffffffffffff x13: 0000000000000018 x12: 0101010101010101
[ 0.884202] x11: 0000000000000030 x10: 0101010101010101 x9 : 0000000000000000
[ 0.891356] x8 : ffff000000a9df00 x7 : 0000000000000000 x6 : ffff000000088000
[ 0.898504] x5 : 00000000000000c0 x4 : 0000000000000000 x3 : 0000000000000000
[ 0.905652] x2 : 0000000000000000 x1 : ffff80000a320080 x0 : 0000000000000000
[ 0.912805] Call trace:
[ 0.915256] imx_uart_probe+0x31c/0x7d0
[ 0.919103] platform_probe+0x68/0xe0
[ 0.922771] really_probe+0xbc/0x46c
[ 0.926356] __driver_probe_device+0x114/0x190
[ 0.930813] driver_probe_device+0x40/0x100
[ 0.935005] __driver_attach+0xac/0x210
[ 0.938850] bus_for_each_dev+0x70/0xd0
[ 0.942694] driver_attach+0x24/0x30
[ 0.946275] bus_add_driver+0x144/0x244
[ 0.950119] driver_register+0x78/0x130
[ 0.953964] __platform_driver_register+0x28/0x34
[ 0.958673] imx_uart_init+0x3c/0x64
[ 0.962259] do_one_initcall+0x50/0x1b0
[ 0.966102] kernel_init_freeable+0x20c/0x290
[ 0.970468] kernel_init+0x24/0x12c
[ 0.973968] ret_from_fork+0x10/0x20
[ 0.977556] Code: 2a0003f4 35001820 f9400a61 91020021 (b9400021)
[ 0.983674] ---[ end trace 600c5e6ad38c2c3e ]---
[ 0.988366] Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
[ 0.996030] SMP: stopping secondary CPUs
[ 0.999963] Kernel Offset: disabled
[ 1.003454] CPU features: 0x00002001,20000846
[ 1.007817] Memory Limit: none
[ 1.010875] ---[ end Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000
00b ]---
-------------------------------
b). 用上述章节4生成的 flash.bin文件替换掉刚才下载的BSP 6.3.0 image压缩包里面的imx-boot文件
-------------------------------
$ cd ~/workdir/
$ tar xvf Verdin-iMX8MM_Reference-Multimedia-Image-Tezi_6.3.0+build.7.tar
$ cd Verdin-iMX8MM_Reference-Multimedia-Image-Tezi_6.3.0+build.7/
$ rm imx-boot
$ cp imx-mkimage/iMX8QM/flash.bin imx-boot
-------------------------------
c). 将上述修改后的image重新通过Toradex Easy Installer更新到Verdin iMX8MM模块后,查看 ATF 版本变化(v2.6(release):lf-6.1.1-1.0.0-2-gc9c586a62-dirty),然后可以成功进入Linux并查看到 UART4 端口 (/dev/ttymxc3)。
-------------------------------
U-Boot SPL 2022.04-21601-g7bd2074193 (Sep 04 2023 - 15:51:26 +0800)
DDRINFO: start DRAM init
DDRINFO: DRAM rate 3000MTS
DDRINFO:ddrphy calibration done
DDRINFO: ddrmix config done
Normal Boot
WDT: Started watchdog@30280000 with servicing (60s timeout)
Trying to boot from MMC1
NOTICE: BL31: v2.6(release):lf-6.1.1-1.0.0-2-gc9c586a62-dirty
NOTICE: BL31: Built : 14:49:42, Sep 6 2023
...
...
TDX Wayland with XWayland 6.3.0+build.7 (kirkstone) verdin-imx8mm-07276322 ttymxc0
Verdin-iMX8MM_Reference-Multimedia-Image
root@verdin-imx8mm-07276322:~# ls /dev/ttymxc*
/dev/ttymxc0 /dev/ttymxc1 /dev/ttymxc2 /dev/ttymxc3
-------------------------------
d). 可以参考这里说明进行 UART4 串口的测试,UART4 通过 Dahlia载板 X18 USBC 引出。
-------------------------------
root@verdin-imx8mm-07276322:~# echo Test_From_Verdin_iMX8MM > /dev/ttymxc3
root@verdin-imx8mm-07276322:~# cat < /dev/ttymxc3
Test_From_Host_PC
-------------------------------
7). 总结
本文基于NXP iMX8M Mini嵌入式平台简单介绍了修改 ATF 固件来将 UART4 从 Cortex-M4 核心连接到 Cortex-A53以及组装 Boot Container Image 的流程。
相关文章:
NXP iMX8MM 修改 UART4至 Cortex-A53 核心
By Toradex秦海 1). 简介 NXP iMX8MM SoC UART-4 接口在默认的 ATF(ARM Trusted Firmware) 中被 RDC 分配给了 Cortex-M4 核心,用作 M4 核心的 Debug UART。如果这时候在 Cortex-A53 核心 Linux Devcie-tree 配置中使能 UART-4,就会出现 Kernel Oops 错…...
C#控制台程序中使用log4.net来输出日志
Apache log4net 库是一个帮助程序员将日志语句输出到各种输出目标的工具。log4net 是优秀的 Apache log4j™ 框架到 Microsoft .NET 运行时的端口。 我喜欢他可以自定义输出,区分等级等特点。 导入库 我们在工程里添加NuGet的包。输入名称log4net ࿰…...
用GPT干的18件事,能够真正提高学习生产力,建议收藏
用GPT干的18件事,能够真正提高学习生产力,建议收藏。 语法更正 文本翻译 语言转换 代码解释 修复代码错误 作为百科全书 信息提取 好友聊天 创意生成器 采访问题 论文大纲 故事创作 问题类比 创建 SQL 需求 情感分析 将产品描述转变为广告 关键字提取 闲…...
线性代数的本质(二)——线性变换与矩阵
文章目录 线性变换与矩阵线性变换与二阶方阵常见的线性变换复合变换与矩阵乘法矩阵的定义列空间与基矩阵的秩逆变换与逆矩阵 线性变换与矩阵 线性变换与二阶方阵 本节从二维平面出发学习线性代数。通常选用平面坐标系 O x y Oxy Oxy ,基向量为 i , j \mathbf i,…...
JavaScript获取字符串的字节长度
概要 提示:大家都知道,获取字符串的长度可用length来获取。 那么获取这段字符串的字节数呢?英文字母肯定lenght和字节数都一样:都是1而中文lenght1,字节数2因此,需要作的就是把中文字符的字节数计算出来。 …...
[2023.09.13]: Rust Lang,避不开的所有权问题
Rust的所有权问题,在我学Rust的时候就跳过了,因为我知道这玩意儿没有场景就不好理解。没想到场景很快就出现了。 在开发Yew应用组件的时候,涉及到了事件,闭包,自然就引出了所有权问题。 话不多说,下面让我们…...
Redux中间件源码解析与实现
基本介绍 本文中涉及到的关键npm包的版本信息如下: react 的版本为18.2.0 redux的版本为4.1.2 redux-thunk版本为2.4.2 redux-promise版本为0.6.0 redux-logger版本为3.0.6 在Redux源码解析与实现(一)Redux源码解析与实现(二&…...
关于rsync用不了之后
1.尝试找出rsync使用错误原因: 我遇见一个问题:rsync:read errors mapping:communication error on send (70),我查了一下这个问题很大可能是网络链接导致的,然后我用nslookup指令查看了/train2…...
由一个多线程并发保存而引发的思考
1. 问题描述 问题描述,现A表(用户查看实验的次数)有user_id和exp_id两个字段,其中user_id加exp_id不唯一。B表有user_id,exp_id以及exp_num三个字段,其中user_id加exp_id唯一(表中未建唯一索引)。 现需要将A表的数据同步到B表,单机模式通过定时任务同步。A表的数据有…...
python-vlc
文章目录 关于 python-vlc安装使用关于 python-vlc Python vlc bindings github : https://github.com/oaubert/python-vlcPython bindings (ctypes-based) for VLC http://olivieraubert.net/vlc/python-ctypes/关于 VLC 可参考 macOS - 安装使用 VLC https://blog.csdn.net/…...
2023长城杯 web部分题目(seekingeasy_extension)
seeking 下载题目附件得到: <?php error_reporting(0); header("HINT:POST n range(1,10)");$image $_GET[image]; echo "这里什么也没有,或许吧。"; $allow range(1, 10); shuffle($allow); if (($_POST[n] $allow[0])) …...
2-1 张量数据结构
张量概念 张量是什么? 单个元素叫标量(scalar),一个序列叫向量(vector),多个序列组成的平面叫矩阵(matrix),多个平面组成的立方体叫张量(tensor&…...
QSqlQuery查询语句
SqlQuery 封装了在 QSqlDatabase 上执行的 SQL 查询中创建、导航和检索数据所涉及的功能。 可用于执行 DML(数据操作语言)语句,如 SELECT、INSERT、UPDATE 和 DELETE, 以及 DDL(数据定义语言)语句ÿ…...
用c语言编写出三底模型
以下是一个用C语言实现三底模型的示例代码。这个程序通过循环遍历输入的股票数据,判断是否出现三底形态,如果是,则输出买入信号,否则输出卖出信号。 c语言 #include <stdio.h> #include <stdlib.h> // 判断是否出现…...
15 Python使用MySQL
概述 在上一节,我们介绍了如何在Python中使用网络,包括:套接字编程、socketserver等内容。在这一节,我们将介绍如何在Python中使用MySQL。MySQL是最流行的关系型数据库管理系统之一,由瑞典MySQL AB公司开发,…...
3、Nginx 常用的命令和配置文件
文章目录 3、nginx 常用的命令和配置文件3.1 nginx 常用的命令:3.2 nginx.conf 配置文件3.2.1 地址3.2.2 内容3.2.2 vim不正常退出后再次打开信息提示解决方法 3.3 第一部分:全局块3.4 第二部分:events 块3.4 第三部分:http 块①、…...
python经典百题之兔子出生问题
这是一个经典的 Fibonacci 数列问题,可以通过递归或循环来解决。 递归方法: 由题意可知,第 n 个月的兔子数等于第 n-1 个月的兔子数加上第 n-2 个月的兔子数。设 f(n) 表示第 n 个月的兔子数,则有: f(n) f(n-1) f…...
不定积分的概念和性质
目录 原函数 不定积分 不定积分的几何意义 原函数的存在定理 不定积分的性质 不定积分是微积分的一个关键部分,它涉及到一个函数的不定积分的计算。不定积分可以理解为求一个函数的原函数,也被称为反导数。原函数是一个函数,使得该函数的…...
远程访问服务器JupyterLab的配置方法
远程访问服务器JupyterLab的配置方法 环境及工具注意 基本步骤生成密码生成并修改配置文件*错误:jupyter localhost 已拒绝连接*后台运行jupyter后台关闭 其实就是在服务器运行JupyterLab,然后在本地浏览器访问 环境及工具 服务器:Ubuntu 1…...
Java native 关键字
如你在看 JDK 的源代码的时候,大概率会看到很多方法使用了 native 关键字。 下面是 String 对象 JDK 中的源代码,就带有了一个 native 关键字。 native 是干什么用的 简单来说就是 Java 的 native 方法的实现不是用 Java 实现的,可能在其他…...
【线性代数】沉浸式线性代数在线学习网站
地址:http://immersivemath.com/ila/index.html 这是全球第一本带交互式图形的线性代数教材,作者是 J. Strm, K. strm, and T. Akenine-Mller。 全书一共十章,各章节内容如下: 接下来我将对各章节进行简单的总结,另外…...
Kotlin中特性、数据类、伴生对象、顶层函数
Kotlin中的函数参数和属性声明 在 Kotlin 中,函数参数和属性有不同的声明方式和行为。这些特性使得 Kotlin 代码更加安全、易于理解和维护。 函数参数的只读性 fun sum(a: Int, b: Int): Int {var modifiedA aif (modifiedA > 0) {modifiedA 1}//三元表达式v…...
《PostgreSQL物化视图:创建、维护与应用》
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🐅🐾猫头虎建议程序员必备技术栈一览表📖: 🛠️ 全栈技术 Full Stack: 📚…...
shell脚本之test命令
shell脚本之test命令 数值比较:2. 字符串比较:3. 文件测试:4. 逻辑操作:5. 其他测试: test命令在Shell脚本中用于进行条件测试和条件判断。它用于检查文件、字符串和数值的各种条件,并返回一个状态码&#…...
JAVA设计模式8:装饰模式,动态地将责任附加到对象上,扩展对象的功能
作者主页:Designer 小郑 作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN博客专家,阿里云社区专家博主,蓝桥云课讲师。 目录 一、什么是装饰模式二、…...
Linux学习之MySQL备份
xtrabackup资源下载 完全备份与恢复 # 1.物理备份与恢复 # 冷备份,需停止数据库服务 适合线下服务器。 [rootmysql50 ~]# systemctl stop mysqld [rootmysql50 ~]# mkdir /bakdir [rootmysql50 ~]# cp -r /var/lib/mysql /bakdir/mysql.bak [rootmysql50 ~]# cd /…...
时序分解 | MATLAB实现北方苍鹰优化算法NGO优化VMD信号分量可视化
时序分解 | MATLAB实现北方苍鹰优化算法NGO优化VMD信号分量可视化 目录 时序分解 | MATLAB实现北方苍鹰优化算法NGO优化VMD信号分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 北方苍鹰优化算法NGO优化VMD,对其分解层数,惩罚因子数做优化…...
分类预测 | Matlab实现RBF-Adaboost多特征分类预测
分类预测 | Matlab实现RBF-Adaboost多特征分类预测 目录 分类预测 | Matlab实现RBF-Adaboost多特征分类预测效果一览基本介绍研究内容程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于RBF-Adaboost数据分类预测(Matlab完整程序和数据) 2.多特征输入…...
【Java代码规范】阿里编码规约 VS CheckStyle
全文速览: 1、关于代码编码质量2、如何小成本有效管理企业内的编码规范 2.1 阿里编码规约IDE插件2.2 CheckStyle IDE插件 3、如何在代码提交中检验规范 3.1 阿里编码规约配置git precommit check3.2 CheckStyle配置git precommit check3.3 实践 1、关于代码编码质…...
iPhone苹果15手机圆点怎么设置让屏幕上显示出来圆形图标?
iPhone苹果15手机圆点怎么设置让屏幕上显示出来圆形图标? 1、在iPhone苹果手机上找到「设置」并点击打开; 2、在苹果iPhone设置内找到「辅助功能」并点击打开; 3、在苹果iPhone手机辅助功能内的动作交互内找到「触控」并点击打开;…...
烟台展厅设计公司/开封网站优化公司
1.1认识什么是纯文本文件 Window 自带的一个软件,叫做记事本,记事本保存的格式就是TXT,就是英文text的缩写,术语上称呼为”纯文本文件“。 注意: TXT文件,只能保存文本内容,是无法记录文本样式发…...
360关键词推广/泰安seo排名
有许多情况下,我们需要查看一个进程当前打开了哪些文件,反过来我们也希望知道某一个文件正在被哪些进程所读写。在Linux下有许多有用的工具可以帮我们完成这两个工作,下面介绍这两个工具:lsof与fuser。 fuser find files or socke…...
ps做网站教程/如何申请百度竞价排名
国科创(北京)信息技术有限公司-高光谱卫星与多光谱卫星的区别在于,高光谱卫星可以在电磁波谱的紫外、可见光、近红外和中红外区域,以数十至数百个连续且细分的光谱波段对目标区域同时成像,在获得地表图像信息的同时&am…...
国外最新创意产品网站有哪些方面/信阳seo优化
zabbix模板是做什么的? 平时工作中,我们需要监控web、mysql、redis、nginx这些服务器,众多服务器的业务都是一样的,所以我们只要事先创建好模板,然后所有服务器链接这个模板即可,如果后续有修改、新增功能,…...
wordpress 历史上今天/产品软文案例
-未处理异常 异常过滤返回EXCEPTION_CONTINUE_SEARCH,向上搜索,但无法搜索到处理部分,产生未处理异常。 // 负责处理未处理异常 // 进程初始化时,设置处理未处理异常过滤函数 PTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptio…...
网站型跟商城型/百度网页版链接地址
MongoDB的c#驱动有两种,官方驱动和samus驱动,不过我更喜欢samus驱动,因为samus驱动提供了丰富的linq操作。 官方驱动:https://github.com/mongodb/mongo-csharp-driver/downloads。下载后,还提供了一个酷似msdn的帮助文…...