当前位置: 首页 > news >正文

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 核心&#xff0c;用作 M4 核心的 Debug UART。如果这时候在 Cortex-A53 核心 Linux Devcie-tree 配置中使能 UART-4&#xff0c;就会出现 Kernel Oops 错…...

C#控制台程序中使用log4.net来输出日志

Apache log4net 库是一个帮助程序员将日志语句输出到各种输出目标的工具。log4net 是优秀的 Apache log4j™ 框架到 Microsoft .NE​​T 运行时的端口。 我喜欢他可以自定义输出&#xff0c;区分等级等特点。 导入库 我们在工程里添加NuGet的包。输入名称log4net &#xff0…...

用GPT干的18件事,能够真正提高学习生产力,建议收藏

用GPT干的18件事&#xff0c;能够真正提高学习生产力&#xff0c;建议收藏。 语法更正 文本翻译 语言转换 代码解释 修复代码错误 作为百科全书 信息提取 好友聊天 创意生成器 采访问题 论文大纲 故事创作 问题类比 创建 SQL 需求 情感分析 将产品描述转变为广告 关键字提取 闲…...

线性代数的本质(二)——线性变换与矩阵

文章目录 线性变换与矩阵线性变换与二阶方阵常见的线性变换复合变换与矩阵乘法矩阵的定义列空间与基矩阵的秩逆变换与逆矩阵 线性变换与矩阵 线性变换与二阶方阵 本节从二维平面出发学习线性代数。通常选用平面坐标系 O x y Oxy Oxy &#xff0c;基向量为 i , j \mathbf i,…...

JavaScript获取字符串的字节长度

概要 提示&#xff1a;大家都知道&#xff0c;获取字符串的长度可用length来获取。 那么获取这段字符串的字节数呢&#xff1f;英文字母肯定lenght和字节数都一样&#xff1a;都是1而中文lenght1&#xff0c;字节数2因此&#xff0c;需要作的就是把中文字符的字节数计算出来。 …...

[2023.09.13]: Rust Lang,避不开的所有权问题

Rust的所有权问题&#xff0c;在我学Rust的时候就跳过了&#xff0c;因为我知道这玩意儿没有场景就不好理解。没想到场景很快就出现了。 在开发Yew应用组件的时候&#xff0c;涉及到了事件&#xff0c;闭包&#xff0c;自然就引出了所有权问题。 话不多说&#xff0c;下面让我们…...

Redux中间件源码解析与实现

基本介绍 本文中涉及到的关键npm包的版本信息如下&#xff1a; react 的版本为18.2.0 redux的版本为4.1.2 redux-thunk版本为2.4.2 redux-promise版本为0.6.0 redux-logger版本为3.0.6 在Redux源码解析与实现&#xff08;一&#xff09;Redux源码解析与实现&#xff08;二&…...

关于rsync用不了之后

1.尝试找出rsync使用错误原因&#xff1a; 我遇见一个问题&#xff1a;rsync:read errors mapping&#xff1a;communication error on send &#xff08;70&#xff09;&#xff0c;我查了一下这个问题很大可能是网络链接导致的&#xff0c;然后我用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 下载题目附件得到&#xff1a; <?php error_reporting(0); header("HINT:POST n range(1,10)");$image $_GET[image]; echo "这里什么也没有&#xff0c;或许吧。"; $allow range(1, 10); shuffle($allow); if (($_POST[n] $allow[0])) …...

2-1 张量数据结构

张量概念 张量是什么&#xff1f; 单个元素叫标量&#xff08;scalar&#xff09;&#xff0c;一个序列叫向量&#xff08;vector&#xff09;&#xff0c;多个序列组成的平面叫矩阵&#xff08;matrix&#xff09;&#xff0c;多个平面组成的立方体叫张量&#xff08;tensor&…...

QSqlQuery查询语句

SqlQuery 封装了在 QSqlDatabase 上执行的 SQL 查询中创建、导航和检索数据所涉及的功能。 可用于执行 DML&#xff08;数据操作语言&#xff09;语句&#xff0c;如 SELECT、INSERT、UPDATE 和 DELETE&#xff0c; 以及 DDL&#xff08;数据定义语言&#xff09;语句&#xff…...

用c语言编写出三底模型

以下是一个用C语言实现三底模型的示例代码。这个程序通过循环遍历输入的股票数据&#xff0c;判断是否出现三底形态&#xff0c;如果是&#xff0c;则输出买入信号&#xff0c;否则输出卖出信号。 c语言 #include <stdio.h> #include <stdlib.h> // 判断是否出现…...

15 Python使用MySQL

概述 在上一节&#xff0c;我们介绍了如何在Python中使用网络&#xff0c;包括&#xff1a;套接字编程、socketserver等内容。在这一节&#xff0c;我们将介绍如何在Python中使用MySQL。MySQL是最流行的关系型数据库管理系统之一&#xff0c;由瑞典MySQL AB公司开发&#xff0c…...

3、Nginx 常用的命令和配置文件

文章目录 3、nginx 常用的命令和配置文件3.1 nginx 常用的命令&#xff1a;3.2 nginx.conf 配置文件3.2.1 地址3.2.2 内容3.2.2 vim不正常退出后再次打开信息提示解决方法 3.3 第一部分&#xff1a;全局块3.4 第二部分&#xff1a;events 块3.4 第三部分&#xff1a;http 块①、…...

python经典百题之兔子出生问题

这是一个经典的 Fibonacci 数列问题&#xff0c;可以通过递归或循环来解决。 递归方法&#xff1a; 由题意可知&#xff0c;第 n 个月的兔子数等于第 n-1 个月的兔子数加上第 n-2 个月的兔子数。设 f(n) 表示第 n 个月的兔子数&#xff0c;则有&#xff1a; f(n) f(n-1) f…...

不定积分的概念和性质

目录 原函数 不定积分 不定积分的几何意义 原函数的存在定理 不定积分的性质 不定积分是微积分的一个关键部分&#xff0c;它涉及到一个函数的不定积分的计算。不定积分可以理解为求一个函数的原函数&#xff0c;也被称为反导数。原函数是一个函数&#xff0c;使得该函数的…...

远程访问服务器JupyterLab的配置方法

远程访问服务器JupyterLab的配置方法 环境及工具注意 基本步骤生成密码生成并修改配置文件*错误&#xff1a;jupyter localhost 已拒绝连接*后台运行jupyter后台关闭 其实就是在服务器运行JupyterLab&#xff0c;然后在本地浏览器访问 环境及工具 服务器&#xff1a;Ubuntu 1…...

Java native 关键字

如你在看 JDK 的源代码的时候&#xff0c;大概率会看到很多方法使用了 native 关键字。 下面是 String 对象 JDK 中的源代码&#xff0c;就带有了一个 native 关键字。 native 是干什么用的 简单来说就是 Java 的 native 方法的实现不是用 Java 实现的&#xff0c;可能在其他…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...