Linux第40步_移植ST公司的uboot

news2024/12/26 0:55:45

、查看ST公司的uboot源码包

ST公司的uboot源码包在虚拟机中的路径:

/home/zgq/linux/atk-mp1/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/u-boot-stm32mp-2020.01-r0

“u-boot-stm32mp-2020.01-r0”就是ST公司uboot源码包,它支持了STM32MP1家族全系列芯片。

打开终端

输入“ls回车”,列出当前目录下所有的文件和文件夹

输入“cd linux回车”,切换“linux”目录下

输入“ls回车”,列出当前目录下所有的文件和文件夹

输入“cd atk-mp1/回车”,切换“atk-mp1”目录下

输入“ls回车”,列出当前目录下所有的文件和文件夹

输入“cd stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/回车”,切换“stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24”目录下

输入“ls回车”,列出当前目录下所有的文件和文件夹

输入“cd sources/回车”,切换“sources”目录下

输入“ls回车”,列出当前目录下所有的文件和文件夹

输入“cd arm-ostl-linux-gnueabi/回车”,切换“arm-ostl-linux-gnueabi”目录下

输入“ls回车”,列出当前目录下所有的文件和文件夹

输入“cd u-boot-stm32mp-2020.01-r0/回车 ,切换“u-boot-stm32mp-2020.01-r0”目录下

输入“ls回车”,列出“u-boot-stm32mp-2020.01-r0”目录下所有的文件和文件夹

见下图:

、获取uboot软件包

1、输入“tar -vxf u-boot-stm32mp-2020.01-r0.tar.gz回车,解压

输入“ls回车”,列出“u-boot-stm32mp-2020.01-r0”目录下所有的文件和文件夹

见下图:

2输入“cd u-boot-stm32mp-2020.01/回车,切换“u-boot-stm32mp-2020.01”目录下

输入“ls回车”,列出“u-boot-stm32mp-2020.01”目录下所有的文件和文件夹。

见下图:

3输入“for p in `ls -1 ../*.patch`;do patch -p1 < $p;done回车”,打补丁;

 输入“ls回车”,列出“u-boot-stm32mp-2020.01”目录下所有的文件和文件夹。

见下图:

打完补丁以后的“u-boot-stmm32mp-2020.01”目录就是我们要移植的uboot源码。

“u-boot-stm32mp-2020.01”的目录路径有点长,不适合阅读和编译,所以我们新建一个名为“my_uboot”的目录来保存我们要移植的uboot源码,然后将 ST公司的uboot源码拷贝到“my uboot”目录下。

4另外打开一个终端

输入“ls回车”,列出当前目录下所有的文件和文件夹

输入“cd linux回车”,切换“linux”目录下

输入“ls回车”,列出当前目录下所有的文件和文件夹

输入“cd atk-mp1/回车”,切换“atk-mp1”目录下

输入“ls回车”,列出“atk-mp1”目录下所有的文件和文件夹

输入“cd uboot/回车”,切换“uboot”目录下

输入“ls回车”,列出“uboot”目录下所有的文件和文件夹

输入“mkdir my_uboot回车”,创建“my_uboot”目录

输入“ls回车”,列出“uboot”目录下所有的文件和文件夹

5、进入第1次打开的终端,将“/linux/atk-mp1/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/u-boot-stm32mp-2020.01-r0/u-boot-stm32mp-2020.01/”目录下的文件以及子目录中的文件全部拷贝到“/linux/atk-mp1/uboot/my-uboot/”目录中。

输入“cp * /home/zgq/linux/atk-mp1/uboot/my_uboot/ -rf回车

6、进入第2次打开的终端,

输入“cd my_uboot/回车”,切换“my_uboot”目录下

输入“ls回车”,列出“my_uboot”目录下所有的文件和文件夹

见下图:

三、修改“uboot/my_uboot/目录中的Makefile

1、输入“vim Makefile回车”,使用vim命令打开已有的“Makefile”文件,见下图:

2、输入“回车”,得到下图:

3、按“ESC”,输入“/CROSS_COMPILE ?=回车”,查找“CROSS_COMPILE ?=”所在的位置,见下图:

4、按一下“A”,然后移动光标键,添加“ARCH = arm”;

添加“CROSS_COMPILE = arm-none-linux-gnueabihf-”;

见下图:

修改“uboot/my_uboot/目录中的Makefile”的原因:

如果不修改,我们需要输入很长的命令,才可以实现编译,如下面的命令:

make distclean

make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- stm32mp157d_atk_defconfig

make V=1 ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- DEVICE_TREE=stm32mp157d-atk all

修改后,就很简化了,就可以输入下面的命令来实现编译了:

make distclean回车                            //清除

make stm32mp157d_atk_defconfig回车           //配置uboot

make V=1 DEVICE_TREE=stm32mp157d-atk all回车  //编译

5、按“ESC”+“:wq”,保存退出

四、在“uboot/my_uboot/configs”目录中创建“uboot的默认配置文件

以“stm32mp15_trusted_defconfig”为母版,复制一份命名为“stm32mp15_atk_trusted_defconfig”,这就是“uboot的默认配置文件”。

输入“cd configs回车”,进入uboot的configs目录;

输入“cp stm32mp15_trusted_defconfig stm32mp15_atk_trusted_defconfig回车” //将“stm32mp15_trusted_defconfig”拷贝到“stm32mp15_atk_trusted_defconfig

五、在“uboot/my_uboot/arch/arm/dts/”目录下创建“uboot的默认设备树”

1、以“stm32mp157d-ed1.dts”为母版,复制一份命名为“stm32mp157d-atk.dts”;

2、以“stm32mp15xx-edx.dtsi”为母版,复制一份命名为“stm32mp157d-atk.dtsi”;

3、以“stm32mp157a-ed1-u-boot.dtsi”为母版,复制一份命名为“stm32mp157d-atk-u-boot.dtsi”;

这三个文件就是“uboot的默认设备树”

4、输入“cd ..回车”,返回到“my_uboot”目录

输入“ls回车”,列出“my_uboot”目录下所有的文件和文件夹

输入“cd arch/回车”,进入“arch”目录

输入“ls回车”,列出“arch”目录下所有的文件和文件夹

输入“cd arm/回车”,进入“arm”目录

输入“ls回车”,列出“arm”目录下所有的文件和文件夹

输入“cd dts/回车”,进入“dts”目录

输入“ls回车”,列出“dts”目录下所有的文件和文件夹

见下图:

5、输入“cp stm32mp15xx-edx.dtsi stm32mp157d-atk.dtsi回车”,复制 .dtsi

输入“cp stm32mp157a-ed1-u-boot.dtsi stm32mp157d-atk-u-boot.dtsi回车”,复制 .dtsi

输入“cp stm32mp157d-ed1.dts stm32mp157d-atk.dts回车”,复制 .dts

见下图:

六、使用VSCode创建my_uboot工作区

1、点击“文件

点击“打开文件夹

找到“my_uboot”目录,点击“确定”。

得到下图:

2、点击“文件

点击“将工作区另存为

得到下图:

3、输入“my_uboot”,点击“保存”。

七、修改uboot的设备树文件“stm32mp157d-atk.dts

1、点击“arch”,然后点击“arm”,最后点击“dts”,点击“stm32mp157d-atk.dts”,打开该文件。

2、将第14行“stm32mp15xx-edx.dtsi”修改为“stm32mp157d-atk.dtsi”,见下图:

八、修改uboot设备树头文件“stm32mp125d-atk-u-boot.dtsi”中的“电源管理设置”

1、点击“arch”,然后点击“arm”,最后点击“dts”,点击“stm32mp125d-atk-u-boot.dtsi”,打开该文件。

2、删除“21~22”,删除“26~31”,见下图:

3、删除“51~53”,见下图:

修改后的代码如下:

// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause

/*

 * Copyright : STMicroelectronics 2018

 */

#include <dt-bindings/clock/stm32mp1-clksrc.h>

#include "stm32mp15-u-boot.dtsi"

#include "stm32mp15-ddr3-2x4Gb-1066-binG.dtsi"

/ {

    aliases {

       i2c3 = &i2c4;

       mmc0 = &sdmmc1;

       mmc1 = &sdmmc2;

    };

    config {

       u-boot,boot-led = "heartbeat";

       u-boot,error-led = "error";

       u-boot,mmc-env-partition = "ssbl";

    };

    led {

    };

};

#ifndef CONFIG_STM32MP1_TRUSTED

&clk_hse {

    st,digbypass;

};

&i2c4 {

    u-boot,dm-pre-reloc;

};

&i2c4_pins_a {

    u-boot,dm-pre-reloc;

    pins {

       u-boot,dm-pre-reloc;

    };

};

&rcc {

    st,clksrc = <

       CLK_MPU_PLL1P

       CLK_AXI_PLL2P

       CLK_MCU_PLL3P

       CLK_PLL12_HSE

       CLK_PLL3_HSE

       CLK_PLL4_HSE

       CLK_RTC_LSE

       CLK_MCO1_DISABLED

       CLK_MCO2_DISABLED

    >;

    st,clkdiv = <

       1 /*MPU*/

       0 /*AXI*/

       0 /*MCU*/

       1 /*APB1*/

       1 /*APB2*/

       1 /*APB3*/

       1 /*APB4*/

       2 /*APB5*/

       23 /*RTC*/

       0 /*MCO1*/

       0 /*MCO2*/

    >;

    st,pkcs = <

       CLK_CKPER_HSE

       CLK_FMC_ACLK

       CLK_QSPI_ACLK

       CLK_ETH_DISABLED

       CLK_SDMMC12_PLL4P

       CLK_DSI_DSIPLL

       CLK_STGEN_HSE

       CLK_USBPHY_HSE

       CLK_SPI2S1_PLL3Q

       CLK_SPI2S23_PLL3Q

       CLK_SPI45_HSI

       CLK_SPI6_HSI

       CLK_I2C46_HSI

       CLK_SDMMC3_PLL4P

       CLK_USBO_USBPHY

       CLK_ADC_CKPER

       CLK_CEC_LSE

       CLK_I2C12_HSI

       CLK_I2C35_HSI

       CLK_UART1_HSI

       CLK_UART24_HSI

       CLK_UART35_HSI

       CLK_UART6_HSI

       CLK_UART78_HSI

       CLK_SPDIF_PLL4P

       CLK_FDCAN_PLL4R

       CLK_SAI1_PLL3Q

       CLK_SAI2_PLL3Q

       CLK_SAI3_PLL3Q

       CLK_SAI4_PLL3Q

       CLK_RNG1_LSI

       CLK_RNG2_LSI

       CLK_LPTIM1_PCLK1

       CLK_LPTIM23_PCLK3

       CLK_LPTIM45_LSE

    >;

    /* VCO = 1066.0 MHz => P = 266 (AXI), Q = 533 (GPU), R = 533 (DDR) */

    pll2: st,pll@1 {

       compatible = "st,stm32mp1-pll";

       reg = <1>;

       cfg = < 2 65 1 0 0 PQR(1,1,1) >;

       frac = < 0x1400 >;

       u-boot,dm-pre-reloc;

    };

    /* VCO = 417.8 MHz => P = 209, Q = 24, R = 11 */

    pll3: st,pll@2 {

       compatible = "st,stm32mp1-pll";

       reg = <2>;

       cfg = < 1 33 1 16 36 PQR(1,1,1) >;

       frac = < 0x1a04 >;

       u-boot,dm-pre-reloc;

    };

    /* VCO = 594.0 MHz => P = 99, Q = 74, R = 74 */

    pll4: st,pll@3 {

       compatible = "st,stm32mp1-pll";

       reg = <3>;

       cfg = < 3 98 5 7 7 PQR(1,1,1) >;

       u-boot,dm-pre-reloc;

    };

};

&sdmmc1 {

    u-boot,dm-spl;

};

&sdmmc1_b4_pins_a {

    u-boot,dm-spl;

    pins1 {

       u-boot,dm-spl;

    };

    pins2 {

       u-boot,dm-spl;

    };

};

&sdmmc1_dir_pins_a {

    u-boot,dm-spl;

    pins1 {

       u-boot,dm-spl;

    };

    pins2 {

       u-boot,dm-spl;

    };

};

&sdmmc2 {

    u-boot,dm-spl;

};

&sdmmc2_b4_pins_a {

    u-boot,dm-spl;

    pins1 {

       u-boot,dm-spl;

    };

    pins2 {

       u-boot,dm-spl;

    };

};

&sdmmc2_d47_pins_a {

    u-boot,dm-spl;

    pins {

       u-boot,dm-spl;

    };

};

#endif

&uart4 {

    u-boot,dm-pre-reloc;

};

&uart4_pins_a {

    u-boot,dm-pre-reloc;

    pins1 {

       u-boot,dm-pre-reloc;

    };

    pins2 {

       u-boot,dm-pre-reloc;

       /* pull-up on rx to avoid floating level */

       bias-pull-up;

    };

};

4、点击“arch”,然后点击“arm”,最后点击“dts”,点击“stm32mp125d-atk.dtsi”,打开该文件。

5、删除“adc”节点,见下图:

6、删除“dac”节点,见下图:

7、删除“i2c4”节点,见下图:

删除上面的代码后,再继续修改“stm32mp125d-atk.dtsi

8、删除下面的“led”节点和“sd_switch”节点,见下图:

9、在下图的58处,添加自己的电源管理。

在上图的58处的电源管理程序如下:

         vddcore: regulator-vddcore {

        compatible = "regulator-fixed";

                   regulator-name = "vddcore";

                   regulator-min-microvolt = <1200000>;

                   regulator-max-microvolt = <1350000>;

                   regulator-always-on;

        regulator-boot-on;

         };

    v3v3: regulator-3p3v {

        compatible = "regulator-fixed";

        regulator-name = "v3v3";

        regulator-min-microvolt = <3300000>;

        regulator-max-microvolt = <3300000>;

        regulator-always-on;

        regulator-boot-on;

    };

    v1v8_audio: regulator-v1v8-audio {

        compatible = "regulator-fixed";

        regulator-name = "v1v8_audio";

        regulator-min-microvolt = <1800000>;

        regulator-max-microvolt = <1800000>;

        regulator-always-on;

        regulator-boot-on;

    };

    vdd: regulator-vdd {

        compatible = "regulator-fixed";

        regulator-name = "vdd";

        regulator-min-microvolt = <3300000>;

        regulator-max-microvolt = <3300000>;

        regulator-always-on;

        regulator-boot-on;

    };

    vdd_usb: regulator-vdd-usb {

        compatible = "regulator-fixed";

        regulator-name = "vdd_usb";

        regulator-min-microvolt = <3300000>;

        regulator-max-microvolt = <3300000>;

        regulator-always-on;

        regulator-boot-on;

};

至此,电源管理设置修改完成。

九、修改uboot设备树头文件“stm32mp125d-atk-u-boot.dtsi”中的“TF卡和EMMC设置”

1、用下面的代码替换“stm32mp125d-atk.dtsi”中的“sdmmc1”节点。

&sdmmc1 {

    pinctrl-names = "default", "opendrain", "sleep";

    pinctrl-0 = <&sdmmc1_b4_pins_a>;

    pinctrl-1 = <&sdmmc1_b4_od_pins_a>;

    pinctrl-2 = <&sdmmc1_b4_sleep_pins_a>;

    st,neg-edge;

    broken-cd;

    bus-width = <4>;

    vmmc-supply = <&v3v3>;

    status = "okay";

};

2、用下面的代码替换“stm32mp125d-atk.dtsi”中的“sdmmc2”节点。

&sdmmc2 {

    pinctrl-names = "default", "opendrain", "sleep";

    pinctrl-0 = <&sdmmc2_b4_pins_a &sdmmc2_d47_pins_a>;

    pinctrl-1 = <&sdmmc2_b4_od_pins_a &sdmmc2_d47_pins_a>;

    pinctrl-2 = <&sdmmc2_b4_sleep_pins_a &sdmmc2_d47_sleep_pins_a>;

    non-removable;

    st,neg-edge;

    bus-width = <8>;

    vmmc-supply = <&v3v3>;

    keep-power-in-suspend;

    status = "okay";

};

十、修改uboot设备树头文件“stm32mp125d-atk-u-boot.dtsi”中的“usbotg hs节点”

屏蔽usbotg hs节点,见下图:

十一、修改“uboot/my_uboot/arch/amn/dts/”目录中的“Makefile”文件

打开“uboot/my_uboot/arch/amn/dts/”目录中的“Makefile”文件,找到“dtb-$(CONFIG STM32MP15x)”配置项,然后在此配置项中加入“stm32mp157d-atk.dtb”,见下图:

十二、创建“stm32mp157d_alientek.sh”的shell脚本

在my_uboot源码根目录下新建一个名为“stm32mp157d_alientek.sh”的shell脚本,如下:

#!/bin/bash

make distclean  //清零uboot

make stm32mp15_atk_trusted_defconfig  //stm32mp15_atk_trusted_defconfig配置uboot

make DEVICE_TREE=stm32mp157d-atk all -j12 //给予stm32mp157d_alientek.sh可执行权限

1、点击“文件”,点击“另存为(A)”,选择“uboot/my_uboot”目录,点击“保存”。

见下图:

十三、使用脚本文件“stm32mp157d_alientek.sh”编译

1、在USCode中,打开终端

输入“chmod 777 stm32mp157d_alientek.sh回车//给予可执行权限,一次即可

输入“./stm32mp157d_alientek.sh回车”,//运行脚本编译uboot

2、查看编译结果:

3、输入“ls -l回车”,结果如下:

至此,ST公司的uboot移植结束。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1420460.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android MTE技术详解

1.MTE概念 MTE&#xff08;内存标记扩展&#xff09;是ARM v8.5-A新增的一项缓解内存安全的机制。在Android Linux现有的安全机制中&#xff0c;类似的机制有ASAN、HWSAN。但两者因为性能开销代价高昂&#xff0c;不适用于广泛部署&#xff08;仅调试使用&#xff09;。MTE当前…

springboot131企业oa管理系统

企业OA管理系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了企业OA管理系统的开发全过程。通过分析企业OA管理系统管理的不足&#xff0c;创建了一个计算机管理企业OA管理系统的方案。文章介绍了企业OA管…

定制红酒:为您的爱情、友情、亲情定制专属红酒

红酒&#xff0c;这种充满浪漫与情感的饮品&#xff0c;早已超越了单纯的味觉享受&#xff0c;成为人们表达情感、传递心意的载体。云仓酒庄洒派定制红酒&#xff0c;正是为那些珍视爱情、友情、亲情的人们提供了一种表达情感的新方式。 ① 爱情之酒 当你们即将步入婚姻的礼堂…

美国DDOS服务器:应对攻击的策略与技术

分布式拒绝服务(DDOS)攻击是一种常见的网络攻击手段&#xff0c;旨在通过大量无用的请求拥塞目标服务器&#xff0c;使其无法正常处理合法请求。美国作为全球互联网技术的领先者&#xff0c;其DDOS服务器在应对这类攻击时具有一系列先进的技术和策略。本文将详细介绍美国DDOS服…

浏览器内存泄漏排查指南

1、setTimeout执行原理 使用setInterval/setTimeOut遇到的坑 - 掘金 2、Chrome自带的Performance工具 当我们怀疑页面发生了内存泄漏的时候&#xff0c;可以先用Performance录制一段时间内页面的内存变化。 点击开始录制执行可能引起内存泄漏的操作点击停止录制 如果录制结束…

C# OpenCvSharp DNN Gaze Estimation 视线估计

目录 介绍 效果 模型信息 项目 代码 frmMain.cs GazeEstimation.cs 下载 C# OpenCvSharp DNN Gaze Estimation 介绍 训练源码地址&#xff1a;https://github.com/deepinsight/insightface/tree/master/reconstruction/gaze 效果 模型信息 Inputs ----------------…

利用牛顿方法求解非线性方程(MatLab)

一、算法原理 1. 牛顿方法的算法原理 牛顿方法&#xff08;Newton’s Method&#xff09;&#xff0c;也称为牛顿-拉弗森方法&#xff0c;是一种用于数值求解非线性方程的迭代方法。其基本思想是通过不断迭代来逼近方程的根&#xff0c;具体原理如下&#xff1a; 输入&#…

菜单栏应用管理 -- Bartender 4

Bartender 4是一款旨在优化和简化Mac菜单栏管理的强大工具。它具有以下特色功能&#xff1a; 组织和管理菜单栏图标&#xff1a;Bartender 4允许用户轻松组织和管理菜单栏中的图标&#xff0c;可以隐藏不常用的图标&#xff0c;保持菜单栏的整洁和简洁。同时&#xff0c;用户还…

RAG——应用——七个最常见的故障点

近日&#xff0c;国外研究者发布了一篇论文《Seven Failure Points When Engineering a Retrieval Augmented Generation System》&#xff0c;探讨了在实际工程落地RAG应用过程中容易出的七类问题。 论文地址&#xff1a;https://arxiv.org/pdf/2401.05856.pdf 一、丢失内容&…

MacOS安装反编译工具JD-GUI以及解决无法打开的问题

目录 一.下载地址 二.安装 三.问题 四.解决办法 1.显示包内容 2.找到Contents/MacOS/universalJavaApplicationStub.sh 3.修改sh文件 4.保存后再次打开即可 一.下载地址 Java Decompiler 二.安装 将下载下来的 jd-gui-osx-1.6.6.tar 解压&#xff0c;然后将 JD-GUI.a…

提升工作效率,畅享便捷PDF编辑体验——Adobe Acrobat Pro DC 2023

作为全球领先的PDF编辑软件&#xff0c;Adobe Acrobat Pro DC 2023将为您带来前所未有的PDF编辑体验。无论您是个人用户还是企业用户&#xff0c;Adobe Acrobat Pro DC 2023将成为您提高工作效率、简化工作流程的得力助手。 一、全面编辑功能 Adobe Acrobat Pro DC 2023提供了…

如何写出让用户身临其境的画面感文案?

许多小伙伴在写文案时经常会碰到这样的困境&#xff0c;就是自己写得文案用了大量辞藻但是没有效果。因为在信息爆炸的时代下&#xff0c;用户天生不喜欢抽象的东西&#xff0c;只有具象化的东西才能让人不费脑子&#xff0c;所以我们要尽可能的将文案视觉化&#xff0c;去写有…

分享外贸人的一些趣事

某日晚上突然失眠&#xff0c;然后就莫名地回忆起与一些客户沟通的过往&#xff0c;有时候感觉哭笑不得&#xff0c;有的时候又感觉无可奈何。 于是想总结一下在和客户沟通中的那种小惊喜&#xff0c;小惊讶&#xff0c;小郁闷&#xff0c;以及还有一些小小的感动。 先说一说…

数据防泄密方案公司(dlp数据防泄密厂商排名)

在当今数字化时代&#xff0c;数据已经成为了企业最重要的资产之一。然而&#xff0c;随着企业信息化的不断深入&#xff0c;数据泄露的风险也越来越大。为了保护企业的核心数据&#xff0c;越来越多的企业开始重视数据防泄密工作&#xff0c;并寻求专业的数据防泄密方案提供商…

Python入门到精通(五)——Python数据容器

Python数据容器 前言 一、list 列表 1、定义 2、列表的下标索引 3、常用操作 4、列表的遍历 二、tuple 元组 1、定义 2、常用操作 三、str 字符串 1、定义 2、常用操作 四、容器序列的切片 五、set 集合 1、定义 ​编辑 2、常用操作 六、dict 字典、映射 1、…

数据治理之路读书笔记

数据治理之路 一、数据治理的国际实践 美国——探索构建数据资产化管理体系&#xff08;奥巴马2012《数字政府战略》、2020年《美国国防部数据战略》&#xff09; 欧盟——从数据价值链到单一数据市场&#xff08;2013《欧洲数据价值链战略》、2015《欧洲数字单一市场战略》、…

【Python笔记-设计模式】单例模式

一、说明 单例是一种创建型设计模式&#xff0c;能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。 (一) 解决问题 维护共享资源&#xff08;数据库或文件&#xff09;的访问权限&#xff0c;避免多个实例覆盖同一变量&#xff0c;引发程序崩溃。 …

STM32入门教程-2023版【5-1】中断执行流程

关注 点赞 不错过精彩内容 大家好&#xff0c;我是硬核王同学&#xff0c;最近在做免费的嵌入式知识分享&#xff0c;帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作! 二、中断执行流程 &#xff08;1&#xff09;中断程序的执行流程 左边第一个图中&#xff0c;从上…

【MySQL 流浪之旅】 第六讲 浅谈 MySQL 锁

系列文章目录 【MySQL 流浪之旅】 第一讲 MySQL 安装【MySQL 流浪之旅】 第二讲 MySQL 基础操作【MySQL 流浪之旅】 第三讲 MySQL 基本工具【MySQL 流浪之旅】 第四讲 MySQL 逻辑备份【MySQL 流浪之旅】 第五讲 数据库设计的三个范式 目录 系列文章目录 一、什么是锁&#x…

网络安全|重大失误!微软被盗测试账号拥有公司Office 365管理员权限

微软网络近期遭黑客入侵&#xff0c;高管电子邮件被监视长达两个月。 一位研究员表示&#xff0c;黑客通过获取一个拥有管理员权限的老旧测试帐号的访问权限来实施入侵&#xff0c;这是微软犯下的重大失误。 微软在1月25日&#xff08;上周四&#xff09;发布第二篇公告&…