Linux第33步_TF-A移植的第1步_创建新的设备树

TF-A移植第1步就是创建新的设备树,并命名为“stm32mp157d-atk”。

和“TF-A移植”有关的知识点:

1)设备树英文名字叫做Device tree,用来描述板子硬件信息的,比如开发板上的 CPU有几个核 、每个CPU核主频是多少,IIC、SPI这些外设的寄存器范围是多少,IIC接口下都挂了哪些设备等等。

2)、TF-A移植主要是修改设备树

3)、DTC是设备树的编译器。“.dts”的设备树文件经过编译后,生成“.dtb”文件,有点类似C语言中的“.bin文件”

4)、设备树文件是一种文本格式的文件。

设备树文件后缀为“.dts”,类似于C语言中的“.c文件”

设备树头文件后缀为“.dtsi”,类似于C语言中的“.h文件”

因此“.dts”的设备树文件可以引用“.dtsi”的设备树头文件。

5)、设备树文件的位置:

linux/atk-mp1/atk-mp1/my-tfa/tf-a-stm32mp-2.2.r1\fdts

一、查看设备树文件

1、打开终端

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

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

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

输入“cd my-tfa回车”,切换my-tfa”目录下

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

输入“cd tf-a-stm32mp-2.2.r1/回车”,进入到tf-a-stm32mp-2.2.r1目录下;

输入“ls回车”,列出“tf-a-stm32mp-2.2.r1”目录下所有的文件和文件夹

输入“cd fdts/回车”,进入到fdts目录下;

2、输入“ls回车”,列出“fdts”目录下的所有设备树文件

3、使用VSCode打开my-tfa目录下tf-a.code-workspace”;

找到“tf-a-stm32mp-2.2.r1/fdts”目录,就是设备树文件所在的目录。

见下图:

4、点击“stm32mpl57d-ev1.dts”,打开该文件,见下图:

 5、“stm32mpl57d-ev1.dts”的文件内容见下图:

6、为正点原子STM32MP157开发板要准备的设备树

“stm32mp157d-ev1.dts”文件很简洁,主要原因是它引用了“stm32mp157d-ed1.dts”文件,主要工作是由“stm32mp157d-ed1.dts”文件来完成的。因此,我们要以“stm32mp157d-ed1.dts”为蓝本,复制一份,并命名为 “stm32mp157d-atk.dts”,这就是我们为正点原子STM32MP157开发板要准备的设备树。 

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

输入“ls回车”,列出“fdts”目录下的所有设备树文件

发现了“stm32mp157d-atk.dts”文件,这就是我们为正点原子STM32MP157开发板准备的设备树文件

见下图:

7、回到VSCode,打开设备树文件stm32mp157d-atk.dts”,见下图:

设备树文件stm32mp157d-atk.dts”文件内容如下:

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

/*

 * Copyright (C) STMicroelectronics 2019 - All Rights Reserved

 * Author: Alexandre Torgue <alexandre.torgue@st.com> for STMicroelectronics.

 */

/dts-v1/;

#include "stm32mp157.dtsi"

#include "stm32mp15xd.dtsi"

#include "stm32mp15-pinctrl.dtsi"

#include "stm32mp15xxaa-pinctrl.dtsi"

#include "stm32mp15xx-edx.dtsi"

#include <dt-bindings/soc/st,stm32-etzpc.h>

/ {

model = "STMicroelectronics STM32MP157D eval daughter";

compatible = "st,stm32mp157d-ed1", "st,stm32mp157";

chosen {

stdout-path = "serial0:115200n8";

};

aliases {

serial0 = &uart4;

};

};

&cpu1 {

cpu-supply = <&vddcore>;

};

&etzpc {

st,decprot = <

DECPROT(STM32MP1_ETZPC_USART1_ID, DECPROT_NS_RW, DECPROT_UNLOCK)

DECPROT(STM32MP1_ETZPC_SPI6_ID, DECPROT_NS_RW, DECPROT_UNLOCK)

DECPROT(STM32MP1_ETZPC_I2C4_ID, DECPROT_NS_RW, DECPROT_UNLOCK)

DECPROT(STM32MP1_ETZPC_I2C6_ID, DECPROT_NS_RW, DECPROT_UNLOCK)

DECPROT(STM32MP1_ETZPC_RNG1_ID, DECPROT_NS_RW, DECPROT_UNLOCK)

DECPROT(STM32MP1_ETZPC_HASH1_ID, DECPROT_NS_RW, DECPROT_UNLOCK)

DECPROT(STM32MP1_ETZPC_DDRCTRL_ID, DECPROT_S_RW, DECPROT_LOCK)

DECPROT(STM32MP1_ETZPC_DDRPHYC_ID, DECPROT_S_RW, DECPROT_LOCK)

DECPROT(STM32MP1_ETZPC_STGENC_ID, DECPROT_S_RW, DECPROT_LOCK)

DECPROT(STM32MP1_ETZPC_BKPSRAM_ID, DECPROT_S_RW, DECPROT_LOCK)

DECPROT(STM32MP1_ETZPC_IWDG1_ID, DECPROT_S_RW, DECPROT_LOCK)

>;

};

8、“stm32mp15xx-edx.dtsi”是edx系列开发板的设备树通用头文件。因此,

我们以stm32mp15xx-edx.dtsi为蓝本,创建正点原子STM32MP157开发板“设备树文件的头文件”

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

输入“ls回车”,列出“fdts”目录下的所有设备树文件

发现了“stm32mp157d-atk.dtsi”文件,这就是我们为正点原子STM32MP157开发板准备的设备树头文件

见下图:

9、回到VSCode,打开设备树头文件stm32mp157d-atk.dtsi”,见下图: 

设备树头文件stm32mp157d-atk.dtsi”文件内容如下:

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

/*

 * Copyright (C) STMicroelectronics 2017 - All Rights Reserved

 * Author: Ludovic Barre <ludovic.barre@st.com> for STMicroelectronics.

 */

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

#include <dt-bindings/power/stm32mp1-power.h>

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

/ {

memory@c0000000 {

device_type = "memory";

reg = <0xC0000000 0x40000000>;

};

vin: vin {

compatible = "regulator-fixed";

regulator-name = "vin";

regulator-min-microvolt = <5000000>;

regulator-max-microvolt = <5000000>;

regulator-always-on;

};

};

&bsec {

board_id: board_id@ec {

reg = <0xec 0x4>;

st,non-secure-otp;

};

};

&clk_hse {

st,digbypass;

};

&cpu0{

cpu-supply = <&vddcore>;

};

&hash1 {

status = "okay";

};

&i2c4 {

pinctrl-names = "default";

pinctrl-0 = <&i2c4_pins_a>;

i2c-scl-rising-time-ns = <185>;

i2c-scl-falling-time-ns = <20>;

clock-frequency = <400000>;

status = "okay";

secure-status = "okay";

pmic: stpmic@33 {

compatible = "st,stpmic1";

reg = <0x33>;

interrupts-extended = <&exti_pwr 55 IRQ_TYPE_EDGE_FALLING>;

interrupt-controller;

#interrupt-cells = <2>;

status = "okay";

secure-status = "okay";

regulators {

compatible = "st,stpmic1-regulators";

buck1-supply = <&vin>;

buck2-supply = <&vin>;

buck3-supply = <&vin>;

buck4-supply = <&vin>;

ldo1-supply = <&v3v3>;

ldo2-supply = <&v3v3>;

ldo3-supply = <&vdd_ddr>;

ldo4-supply = <&vin>;

ldo5-supply = <&v3v3>;

ldo6-supply = <&v3v3>;

vref_ddr-supply = <&vin>;

boost-supply = <&vin>;

pwr_sw1-supply = <&bst_out>;

pwr_sw2-supply = <&bst_out>;

vddcore: buck1 {

regulator-name = "vddcore";

regulator-min-microvolt = <1200000>;

regulator-max-microvolt = <1350000>;

regulator-always-on;

regulator-initial-mode = <0>;

regulator-over-current-protection;

lp-stop {

regulator-on-in-suspend;

regulator-suspend-microvolt = <1200000>;

};

lplv-stop {

regulator-on-in-suspend;

regulator-suspend-microvolt = <900000>;

};

standby-ddr-sr {

regulator-off-in-suspend;

};

standby-ddr-off {

regulator-off-in-suspend;

};

};

vdd_ddr: buck2 {

regulator-name = "vdd_ddr";

regulator-min-microvolt = <1350000>;

regulator-max-microvolt = <1350000>;

regulator-always-on;

regulator-initial-mode = <0>;

regulator-over-current-protection;

lp-stop {

regulator-suspend-microvolt = <1350000>;

regulator-on-in-suspend;

};

lplv-stop {

regulator-suspend-microvolt = <1350000>;

regulator-on-in-suspend;

};

standby-ddr-sr {

regulator-suspend-microvolt = <1350000>;

regulator-on-in-suspend;

};

standby-ddr-off {

regulator-off-in-suspend;

};

};

vdd: buck3 {

regulator-name = "vdd";

regulator-min-microvolt = <3300000>;

regulator-max-microvolt = <3300000>;

regulator-always-on;

st,mask-reset;

regulator-initial-mode = <0>;

regulator-over-current-protection;

lp-stop {

regulator-suspend-microvolt = <3300000>;

regulator-on-in-suspend;

};

lplv-stop {

regulator-suspend-microvolt = <3300000>;

regulator-on-in-suspend;

};

standby-ddr-sr {

regulator-suspend-microvolt = <3300000>;

regulator-on-in-suspend;

};

standby-ddr-off {

regulator-suspend-microvolt = <3300000>;

regulator-on-in-suspend;

};

};

v3v3: buck4 {

regulator-name = "v3v3";

regulator-min-microvolt = <3300000>;

regulator-max-microvolt = <3300000>;

regulator-always-on;

regulator-over-current-protection;

regulator-initial-mode = <0>;

standby-ddr-sr {

regulator-off-in-suspend;

};

standby-ddr-off {

regulator-off-in-suspend;

};

};

vdda: ldo1 {

regulator-name = "vdda";

regulator-min-microvolt = <2900000>;

regulator-max-microvolt = <2900000>;

standby-ddr-sr {

regulator-off-in-suspend;

};

standby-ddr-off {

regulator-off-in-suspend;

};

};

v2v8: ldo2 {

regulator-name = "v2v8";

regulator-min-microvolt = <2800000>;

regulator-max-microvolt = <2800000>;

standby-ddr-sr {

regulator-off-in-suspend;

};

standby-ddr-off {

regulator-off-in-suspend;

};

};

vtt_ddr: ldo3 {

regulator-name = "vtt_ddr";

regulator-min-microvolt = <500000>;

regulator-max-microvolt = <750000>;

regulator-always-on;

regulator-over-current-protection;

lp-stop {

regulator-off-in-suspend;

};

lplv-stop {

regulator-off-in-suspend;

};

standby-ddr-sr {

regulator-off-in-suspend;

};

standby-ddr-off {

regulator-off-in-suspend;

};

};

vdd_usb: ldo4 {

regulator-name = "vdd_usb";

regulator-min-microvolt = <3300000>;

regulator-max-microvolt = <3300000>;

regulator-always-on;

standby-ddr-sr {

regulator-on-in-suspend;

};

standby-ddr-off {

regulator-off-in-suspend;

};

};

vdd_sd: ldo5 {

regulator-name = "vdd_sd";

regulator-min-microvolt = <2900000>;

regulator-max-microvolt = <2900000>;

regulator-boot-on;

standby-ddr-sr {

regulator-off-in-suspend;

};

standby-ddr-off {

regulator-off-in-suspend;

};

};

v1v8: ldo6 {

regulator-name = "v1v8";

regulator-min-microvolt = <1800000>;

regulator-max-microvolt = <1800000>;

standby-ddr-sr {

regulator-off-in-suspend;

};

standby-ddr-off {

regulator-off-in-suspend;

};

};

vref_ddr: vref_ddr {

regulator-name = "vref_ddr";

regulator-always-on;

regulator-over-current-protection;

lp-stop {

regulator-on-in-suspend;

};

lplv-stop {

regulator-on-in-suspend;

};

standby-ddr-sr {

regulator-on-in-suspend;

};

standby-ddr-off {

regulator-off-in-suspend;

};

};

bst_out: boost {

regulator-name = "bst_out";

};

vbus_otg: pwr_sw1 {

regulator-name = "vbus_otg";

};

vbus_sw: pwr_sw2 {

regulator-name = "vbus_sw";

regulator-active-discharge = <1>;

};

};

};

};

&iwdg2 {

timeout-sec = <32>;

status = "okay";

secure-status = "okay";

};

&nvmem_layout {

nvmem-cells = <&cfg0_otp>,

      <&part_number_otp>,

      <&monotonic_otp>,

      <&nand_otp>,

      <&uid_otp>,

      <&package_otp>,

      <&hw2_otp>,

      <&pkh_otp>,

      <&board_id>;

nvmem-cell-names = "cfg0_otp",

   "part_number_otp",

   "monotonic_otp",

   "nand_otp",

   "uid_otp",

   "package_otp",

   "hw2_otp",

   "pkh_otp",

   "board_id";

};

&pwr_regulators {

system_suspend_supported_soc_modes = <

STM32_PM_CSLEEP_RUN

STM32_PM_CSTOP_ALLOW_LP_STOP

STM32_PM_CSTOP_ALLOW_LPLV_STOP

STM32_PM_CSTOP_ALLOW_STANDBY_DDR_SR

>;

system_off_soc_mode = <STM32_PM_CSTOP_ALLOW_STANDBY_DDR_OFF>;

vdd-supply = <&vdd>;

vdd_3v3_usbfs-supply = <&vdd_usb>;

};

&rcc {

st,hsi-cal;

st,csi-cal;

st,cal-sec = <60>;

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>;

};

/* 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>;

};

/* 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)>;

};

};

&rng1 {

status = "okay";

secure-status = "okay";

};

&rtc {

status = "okay";

secure-status = "okay";

};

&sdmmc1 {

pinctrl-names = "default";

pinctrl-0 = <&sdmmc1_b4_pins_a &sdmmc1_dir_pins_a>;

disable-wp;

st,sig-dir;

st,neg-edge;

st,use-ckin;

bus-width = <4>;

vmmc-supply = <&vdd_sd>;

sd-uhs-sdr12;

sd-uhs-sdr25;

sd-uhs-sdr50;

sd-uhs-ddr50;

sd-uhs-sdr104;

status = "okay";

};

&sdmmc2 {

pinctrl-names = "default";

pinctrl-0 = <&sdmmc2_b4_pins_a &sdmmc2_d47_pins_a>;

non-removable;

no-sd;

no-sdio;

st,neg-edge;

bus-width = <8>;

vmmc-supply = <&v3v3>;

vqmmc-supply = <&vdd>;

mmc-ddr-3_3v;

status = "okay";

};

&timers15 {

secure-status = "okay";

st,hsi-cal-input = <7>;

st,csi-cal-input = <8>;

};

&uart4 {

pinctrl-names = "default";

pinctrl-0 = <&uart4_pins_a>;

status = "okay";

};

&usbotg_hs {

vbus-supply = <&vbus_otg>;

};

&usbphyc_port0 {

phy-supply = <&vdd_usb>;

};

&usbphyc_port1 {

phy-supply = <&vdd_usb>;

};

10、在VSCode中,打开设备树文件stm32mp157d-atk.dts”将第12行的“stm32mp15xx-edx.dtsi”修改为“stm32mp157d-atk.dtsi”;

点击“文件”,再点击“保存(S)”;

见下图:

11、回到终端,

输入“cd ..回车”,退回到“tf-a-stm32mp-2.2.r1”目录;

输入“ls回车”,列出“tf-a-stm32mp-2.2.r1”目录下所有的文件和文件夹

输入“cd ..回车”,退回到“my-tfa”目录

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

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

 “Makefile.sdk”文件见下图:

12、创建新的设备树名字stm32mp157d-atk

将“stm32mp157d-atk”添加到TFA DEVICETREE 配置项中;

见下图:

13、按“ESC键”+“:wq键”,保存退出。

14、输入“cd tf-a-stm32mp-2.2.r1/回车”,进入到“tf-a-stm32mp-2.2.r1”目录下;

输入“ls回车”,列出“tf-a-stm32mp-2.2.r1”目录下所有的文件和文件夹;

输入“make -f ../Makefile.sdk all回车”, 执行编译, '-f'的意思是重新指定Makefile。

如果需要加快编译速度,可是使用多线程编译,线程数量最好和自己给虚拟机分配的物理核心保持一致,使用-j来指定线程数,命令如下:

make -f ../Makefile.sdk -j8 all //使用8线程编译

见下图:

14、输入“cd ..回车”返回到“my-tfa”目录

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

输入“cd build/回车”,切换到“build”目录下;

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

输入“cd trusted/回车”,切换到“trusted”目录下;

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

编译成功,在“/linux/atk-mp1/my-tfa/build/trusted/目录下,发现有以“tf-a-stm32mp157d-atk”开头的6个文件文件。

见下图:

 至此,我们完成了TF-A移植第1步,新的设备树“stm32mp157d-atk”创建好了,接下来,我们要修改设备树,在下一节再讲,文章太长了,吃多了会无法消化。

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

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

相关文章

单元测试、模块测试、web接口测试

单元测试与模块测试 什么是“单元测试”、“模块测试”&#xff1f; 然而在功能的实现代码中并没有“单元”&#xff0c;也没有“模块”&#xff1b;只有函数、类和方法。先来分别看看它们 的定义&#xff1a; 单元测试&#xff08;Unit testing&#xff09;&#xff0c;是指…

代码随想录算法训练营第三天 | 链表理论基础 203.移除链表元素 707.设计链表 206.反转链表

链表理论基础 链表是一种通过指针串连在一起的线性结构&#xff0c;每一个节点由两部分组成&#xff0c;一个是数据域&#xff0c;一个是指针域&#xff08;存放指向下一个节点的指针&#xff09;。最后一个节点的指针指向 null。链表的存储方式&#xff1a;数组在内存中是连续…

带POE网络变压器与2.5G/5G/10G网络变压器产品特点介绍

Hqst华轩盛(石门盈盛)电子导读&#xff1a;一起来了解带POE网络变压器与2.5G/5G/10G网络变压器产品特点&#xff1f; 一﹑带POE网络变压器与2.5G/5G/10G网络变压器产品特点介绍 首先、POE网络变压器产品与常规不带POE产品的区别&#xff1a; 带POE网络变压器主要要求是耐电流等…

(二)CarPlay集成开发之苹果的iAP协议

文章目录 概要协议格式鉴权流程CarPlay中的iAP2协议应用小结 概要 iAP2协议是由苹果公司定义的一种数据通信协议&#xff0c;主要用于苹果设备认证外设&#xff0c;以及与外设数据交换的一种协议 协议格式 协议格式一共分为三种类型&#xff0c;分别为握手包&#xff0c;链路…

42.接雨水 - 力扣(LeetCode)

问题描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。输入格式 height [0,1,0,2,1,0,1,3,2,1,2,1]输出格式 6解释 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图&#xff0c;在这种情况下…

「优选算法刷题」:查找总价格为目标值的两个商品

一、题目 购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况&#xff0c;返回任一结果即可。 示例 1&#xff1a; 输入&#xff1a;price [3, 9, 12, 15], target 18 输出&#xff1a;[3,15] 或者 [15,3]示例…

初始RabbitMQ(入门篇)

消息队列(MQ) 本质上就是一个队列,一个先进先出的队列,队列中存放的内容是message(消息),是一种跨进程的通信机制,用于上下游传递消息, 为什么使用MQ: 削峰填谷: MQ可以很好的做一个缓冲机制,例如在一个系统中有A和B两个应用,A是接收用户的请求的,然后A调用B进行处理. 这时…

【2023】java使用WebClient实现chatGPT调用建立web socket连接

&#x1f4bb;目录 一、介绍1、使用技术2、效果 二、代码1、前端代码2、后端代码2.1、maven依赖2.2、model2.2.1、请求接口的格式2.2.2、响应数据对象 2.3、工具类2.3.1、&#x1f534;使用WebClient调用chatgpt方法2.3.2、&#x1f7e0; webSocket连接对话方法 2.4、Controlle…

使用 OpenLLM 构建和部署大模型应用

原文&#xff1a;使用 OpenLLM 构建和部署大模型应用 - 知乎 分享主题为&#xff1a;使用 OpenLLM 快速构建和部署大语言模型的应用。OpenLLM 是一个开源的大语言模型&#xff08;LLM&#xff09;开发框架。它支持多种开源的 LLM 模型&#xff0c;并且具有内建的两个关键的 LL…

自然语言处理研究的内容

一.基础技术 1.1 词法分析 词法分析&#xff08;Lexical Analysis&#xff09;&#xff0c;也称为词法扫描或扫描器&#xff0c;是自然语言处理&#xff08;NLP&#xff09;中的基础步骤之一&#xff0c;用于将输入的文本分割成词法单元&#xff08;Token&#xff09;。词法单…

vulnhub-dc2靶场

DC2 配置环境vmware17 nat网络配置 下载地址:DC and Five86 Series Challenges - DC-1 &#xff08;似乎从2024/1/18左右找不到这个资源了&#xff09; 攻击机kali与其在同一网段下 ip:192.168.52.130 信息收集 arp-scan -l #内网探测&#xff0c;扫描目标ip发现目标ip1…

【服务器】搭建一台属于自己的服务器

​🌈个人主页:Sarapines Programmer🔥 系列专栏:【服务器】搭建网站⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 目录 1. 购买服务器和域名 1.1 购买服务器 1.1.1 阿里云服务器 1.1.2 香草云服务器 1.2 购买域名 2. 安装宝塔…

Blender——将模型及其所有纹理与材质导入unity

前期准备 参考视频&#xff1a;7分钟教会你如何将Blender的模型材质导入unity_哔哩哔哩_bilibili 实验模型官网下载地址&#xff1a;Hoi An Ancient House Model free VR / AR / low-poly 3D model CSDN下载链接&#xff1a; 【免费】Blender三维模型-古代房屋模型&#xff…

【Linux】第三十三站:日志

文章目录 一、实现一个简单的日志1.简介2.可变参数3.错误等级4.时间5.打印每一条参数6.与前面的一些代码搭配使用 二、完整代码 一、实现一个简单的日志 1.简介 我们运行代码的时候&#xff0c;我们希望有各种各样的运行时候的一些信息。这也就是日志 它一半有日志时间&…

【GitHub项目推荐--老照片变清晰】【转载】

先来看一个效果图&#xff0c;这个开源项目能把模糊爆浆的老照片 1 s 内变成清晰、高清的有色照片。 而以上这些效果&#xff0c;无需专业 PS 技能&#xff0c;只用一个网页端的 Demo、点点鼠标上传图片就能搞定。 这个修复神器&#xff0c;由腾讯 PCG ARC 实验室研发&#xf…

结构体大揭秘:代码中的时尚之选(上)

目录 结构结构的声明结构成员的类型结构体变量的定义和初始化结构体成员的访问结构体传参 结构 结构是一些值的集合&#xff0c;这些值被称为成员变量。之前说过数组是相同类型元素的集合。结构的每个成员可以是不同类型的变量&#xff0c;当然也可以是相同类型的。 我们在生活…

【系统调用IO】open、close、read、write、lseek

目录 3 系统调用IO3.1 文件描述符3.1.1 FILE结构体3.2.2 文件描述符 3.3 open、close、read、write、lseek3.3.1 文件权限3.3.2 open3.3.3 close3.3.4 read3.3.5 write3.3.6 lseek3.3.7 代码示例 文件io和标准io的区别 橙色 3 系统调用IO 3.1 文件描述符 3.1.1 FILE结构体 …

多线程编程1

一、线程的引入 上节&#xff0c;我们介绍了进程的概念&#xff0c;以及操作系统内核是如何管理进程的&#xff08;描述组织&#xff09;&#xff0c;PCB中的核心属性有哪些&#xff0c; 引入进程这个概念&#xff0c;最主要的目的&#xff0c;就是为了解决“并发编程”这样的…

JavaScript语法摘要

JavaScript语法摘要 JavaScript语法通过各种规则和组合&#xff0c;就能创建出丰富多彩的程序呢&#xff01;它包括了怎么声明和使用变量、如何定义和赋值&#xff0c;还有怎么用运算符和表达式等等。另外&#xff0c;我还发现了一些有趣的概念&#xff0c;比如关键字、注释、…

Python学习从0到1 day7 Python判断语句

路远殊途&#xff0c;祝你得偿所愿 ——24.1.21 前言 进行逻辑判断&#xff0c;是生活中常见的行为&#xff0c;同样&#xff0c;在程序中&#xff0c;进行逻辑判断也是最为基础的功能 一、布尔类型和比较运算符 1.布尔类型 进行判断&#xff0c;有两个结果&#xff0c;True、…