当前位置: 首页 > 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;可能在其他…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...