zephyr移植到STM32
Zephy如何移植到单片机
- 1. Window下搭建开发环境
- 1.1 安装Choncolatey
- 1.2 安装相关依赖
- 1.3创建虚拟python环境
- 1.4 安装west
- 1.4.1 使用 pip 安装 west
- 1.4.2 检查 west 安装路径
- 1.4.3 将 Scripts路径添加到环境变量
- 1.4.4 验证安装
- 1.5 获取zephyr源码和[安装python](https://so.csdn.net/so/search?q=安装python&spm=1001.2101.3001.7020)依赖
- 1.6 安装Zephyr SDK
- 2.编译构建程序(虚拟开发板)
- 3.在STM32H750上运行zephyr
- 3.1 新建boards相关文件
- 3.2 修改boards相关配置文件
- 4.测试
开发板:DshanMCUF407
官方开发文档:入门指南 — Zephyr Project Documentation
1. Window下搭建开发环境
1.1 安装Choncolatey
在 powershell 管理员下执行如下命令:
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
1.2 安装相关依赖
choco feature enable -n allowGlobalConfirmation
choco install cmake --installargs 'ADD_CMAKE_TO_PATH=System'
choco install ninja gperf python311 git dtc-msys2 wget 7zip
同样是在管理员模式下执行以上命令,使用cmd也是可以的;
1.3创建虚拟python环境
以普通用户身份打开终端窗口
cd %HOMEPATH%
python -m venv zephyrproject\.venv
激活虚拟环境:
cmd 下使用以下命令激活:
zephyrproject\.venv\Scripts\activate.bat
powershell 下使用以下命令激活:
zephyrproject\.venv\Scripts\Activate.ps1
退出虚拟环境:
(.venv)deactivate
1.4 安装west
1.4.1 使用 pip 安装 west
west是Zephyr自己的构建元工具,实际上Zephyr是基于Cmake编写的,west会根据当前环境去调用cmake去编译,这样为我们省去了许多编译步骤.
pip install west
1.4.2 检查 west 安装路径
完成安装后,执行以下命令验证 west
是否安装成功:
west --version
如果显示 west
的版本号,说明安装成功,可以继续使用 west
命令。如果仍然出现无法识别 west
命令的情况,尝试west
安装路径添加到环境变量:
默认情况下,pip
安装的包会放在 Scripts
目录中。请确认 Scripts
路径是否已添加到系统环境变量中。
west
的安装目录可能在以下路径中(假设 Python 安装在默认位置):
C:\Users\100ask\AppData\Roaming\Python\Python311\Scripts
1.4.3 将 Scripts路径添加到环境变量
- 打开 “环境变量” 设置(右键“此电脑” -> “属性” -> “高级系统设置” -> “环境变量”)。
- 在 “系统变量” 中找到
Path
变量并编辑。 - 添加
Scripts
文件夹路径,例如:
C:\Users\100ask\AppData\Roaming\Python\Python311\Scripts
- 确保更改后点击 “确定” 并重启 PowerShell。
1.4.4 验证安装
重启 PowerShell,然后运行以下命令验证 west
是否安装成功:
west --version
如果仍然出现无法识别 west
命令的情况,尝试直接使用以下命令执行:
python -m west ...
1.5 获取zephyr源码和安装python依赖
新建一个文件夹zephyrproject,执行以下操作:
west init zephyrproject // 初始化zephyr环境并获取源码
cd zephyrproject // 进入zephyrproject目录
west update // 更新zephyr源码
导出 Zephyr Cmake package
west zephyr-export
这个package可以让Cmake自动加载构建Zephyr应用程序需要的样本代码
安装 python依赖
pip install -r %HOMEPATH%\zephyrproject\zephyr\scripts\requirements.txt
-r是指定依赖文件;
%HOMEPATH%是哪个路径下。
1.6 安装Zephyr SDK
Zephyr 软件开发工具包 (SDK) 包含适用于 Zephyr 支持的每个架构的工具链,这些工具链 包括编译器、汇编器、链接器和其他构建所需的程序 Zephyr 应用程序。
使用 安装 Zephyr SDK
cd %HOMEPATH%\zephyrproject\zephyr
west sdk install
如果安装不成功,大多数是网络原因,可跟换网络重新进行,也可以进入官网直接获取,然后解压
最后运行文件夹下 setup.cmd,只需要运行一次就好,如果不更改SDK源码的情况下:
2.编译构建程序(虚拟开发板)
首先我们可以编译一个例程,Sample文件下有很多的示例,我这里编译一个Blinky,led闪烁的示例:
如果您不确定 west 为您的开发板使用什么名称,可以使用该名称来获取 Zephyr 支持的所有开发板的列表。west boards
使用 west 构建 Blinky,为您的板进行适当的更改:<your-board-name>
cd %HOMEPATH%\zephyrproject\zephyr
west build -p always -b <your-board-name> samples\basic\blinky
例如:我们采用qemu_cortex_m3,运行Blinky程序,编译结果如下:
打开cmd.exe,进入zephyr目录,启动虚拟环境:
运行Blinky程序:
在zephyr目录中有一个虚拟的qemu开发板类型,我们可以安装qemu使用虚拟开发板验证我们的环境:
cd zephyrproject\zephyr
west build -p always -b <qemu_cortex_m3> samples/hello_world
执行以下命令运行程序:
west build -t run
3.在STM32H750上运行zephyr
当你拿到一个板时可以在zephyr的boards目录下查看是否支持,根据你板子的核以及型号去查
比如我的是stm32h750系列的,这里我通过开发板上的板名去查
cd /scr/zephyrproject/zephyr/boards/st
dir
使用dir命令列出st目录下所有开发板,看一下有没有符合自己的开发板;
也可以使用vscode 打开zephyrproject工程文件,进入boards/st目录下手动找到符合我们的开发板,或者vscode搜索STM32h750,找到我们需要的:
注意:搜索时需要找到boards目录下的,如下图所示:
3.1 新建boards相关文件
我们需要在zephyr/boards/st/ 下新建一个我们的开发板的文件夹,如果官方支持的开发板里没有和我们板子主控相同的,需要找个相近的复制一下,这里我复制的是stm32h750b_dk
将我们复制下来的开发板文件夹改成我们自己开发板的名字,文件夹内与板子名称有关的文件同一样修改成对应的名字:
3.2 修改boards相关配置文件
我们从上往下一次查看并修改每个文件得内容:
修改openocd配置文件:
source [find interface/stlink-dap.cfg]
transport select "dapdirect_swd"set WORKAREASIZE 0x2000
set CHIPNAME STM32H750ZBTx
set BOARDNAME STM23H750ZBT6source [find target/stm32h7x.cfg]# Use connect_assert_srst here to be able to program
# even when core is in sleep mode
# reset_config srst_only srst_nogate connect_assert_srst$_CHIPNAME.cpu0 configure -event gdb-attach {echo "Debugger attaching: halting execution"#reset haltgdb_breakpoint_override hard
}$_CHIPNAME.cpu0 configure -event gdb-detach {echo "Debugger detaching: resuming execution"resume
}# Due to the use of connect_assert_srst, running gdb requires
# to reset halt just after openocd init.
rename init old_init
proc init {} {old_initreset halt
}
如果想使用openocd进行烧录,安装好openocd,按照如上配置既可。
修改board.cmake文件:
这里要指定我们使用那种方法进行烧录,这个支持使用stm32cubeprogrammer、Jlink、openocd
stm32cubeprogrammer和openocd我这里都是使用Stlink进行烧录
**修改board.yml文件 **
修改Kconfig.defconfig和Kconfig.stm32h750zbt6文件
仅修改名字,其他保持不变。
修改stm32h750zbt6_defconfig文件:
修改stm32h750zbt6.dts文件:
修改为对应头文件和开发板名称
修改配置文件:
修改led和串口
串口需要修改为usart1,TX->pa9,RX->pa10
完整dts的配置如下:
/** Copyright (c) 2023-2024 STMicroelectronics** SPDX-License-Identifier: Apache-2.0*//dts-v1/;
#include <st/h7/stm32h750Xb.dtsi>
#include <st/h7/stm32h750xbhx-pinctrl.dtsi>
#include "arduino_r3_connector.dtsi"
#include <zephyr/dt-bindings/input/input-event-codes.h>/ {model = "STMicroelectronics STM32H750ZBT6";compatible = "st,stm32h750zbt6";chosen {zephyr,console = &usart1;zephyr,shell-uart = &usart1;zephyr,sram = &sram0;zephyr,flash = &flash0;zephyr,flash-controller = &mt25ql512ab1;zephyr,display = <dc;};sdram2: sdram@d0000000 {compatible = "zephyr,memory-region", "mmio-sram";device_type = "memory";reg = <0xd0000000 DT_SIZE_M(16)>; /* 128Mbit */zephyr,memory-region = "SDRAM2";zephyr,memory-attr = <( DT_MEM_ARM(ATTR_MPU_RAM) )>;};ext_memory: memory@90000000 {compatible = "zephyr,memory-region";reg = <0x90000000 DT_SIZE_M(256)>; /* max addressable area */zephyr,memory-region = "EXTMEM";/* The ATTR_MPU_EXTMEM attribut causing a MPU FAULT */zephyr,memory-attr = <( DT_MEM_ARM(ATTR_MPU_IO) )>;};leds {compatible = "gpio-leds";led_1: led_1 {gpios = <&gpiof 9 GPIO_ACTIVE_LOW>;label = "User1 LD1";};led_2: led_2 {gpios = <&gpiof 10 GPIO_ACTIVE_LOW>;label = "User2 LD2";};};gpio_keys {compatible = "gpio-keys";user_button: button {label = "User";gpios = <&gpioc 13 GPIO_ACTIVE_HIGH>;zephyr,code = <INPUT_KEY_0>;};};aliases {led0 = &led_1;led1 = &led_2;sw0 = &user_button;die-temp0 = &die_temp;};
};&clk_hse {clock-frequency = <DT_FREQ_M(25)>;status = "okay";
};&clk_lse {status = "okay";
};<dc {pinctrl-0 = <<dc_r0_pi15 <dc_r1_pj0 <dc_r2_pj1 <dc_r3_ph9<dc_r4_pj3 <dc_r5_pj4 <dc_r6_pj5 <dc_r7_pj6<dc_g0_pj7 <dc_g1_pj8 <dc_g2_pj9 <dc_g3_pj10<dc_g4_pj11 <dc_g5_pi0 <dc_g6_pi1 <dc_g7_pk2<dc_b0_pj12 <dc_b1_pj13 <dc_b2_pj14 <dc_b3_pj15<dc_b4_pk3 <dc_b5_pk4 <dc_b6_pk5 <dc_b7_pk6<dc_de_pk7 <dc_clk_pi14 <dc_hsync_pi12 <dc_vsync_pi9>;pinctrl-names = "default";disp-on-gpios = <&gpiod 7 GPIO_ACTIVE_HIGH>;ext-sdram = <&sdram2>;status = "okay";clocks = <&rcc STM32_CLOCK_BUS_APB3 0x00000008>,<&rcc STM32_SRC_PLL3_R NO_SEL>;width = <480>;height = <272>;pixel-format = <PANEL_PIXEL_FORMAT_RGB_565>;display-timings {compatible = "zephyr,panel-timing";de-active = <1>;pixelclk-active = <0>;hsync-active = <0>;vsync-active = <0>;hsync-len = <1>;vsync-len = <10>;hback-porch = <43>;vback-porch = <12>;hfront-porch = <8>;vfront-porch = <4>;};def-back-color-red = <0xFF>;def-back-color-green = <0xFF>;def-back-color-blue = <0xFF>;
};&pll {div-m = <5>;mul-n = <192>;div-p = <2>;div-q = <2>;div-r = <5>;clocks = <&clk_hse>;status = "okay";
};&pll3 {div-m = <5>;mul-n = <192>;div-p = <2>;div-q = <20>;div-r = <99>;clocks = <&clk_hse>;status = "okay";
};&rcc {clocks = <&pll>;clock-frequency = <DT_FREQ_M(480)>;d1cpre = <1>;hpre = <2>;d1ppre = <2>;d2ppre1 = <2>;d2ppre2 = <2>;d3ppre = <2>;
};&usart1 {pinctrl-0 = <&usart1_tx_pa9 &usart1_rx_pa10>;pinctrl-names = "default";current-speed = <115200>;status = "okay";
};&quadspi {pinctrl-names = "default";pinctrl-0 = <&quadspi_clk_pf10 &quadspi_bk1_ncs_pg6&quadspi_bk1_io0_pd11 &quadspi_bk1_io1_pf9&quadspi_bk1_io2_pf7 &quadspi_bk1_io3_pf6&quadspi_bk2_io0_ph2 &quadspi_bk2_io1_ph3&quadspi_bk2_io2_pg9 &quadspi_bk2_io3_pg14>;dual-flash;status = "okay";mt25ql512ab1: qspi-nor-flash-1@90000000 {compatible = "st,stm32-qspi-nor";reg = <0x90000000 DT_SIZE_M(64)>; /* 512 Mbits */qspi-max-frequency = <72000000>;spi-bus-width = <4>;reset-cmd;status = "okay";partitions {compatible = "fixed-partitions";#address-cells = <1>;#size-cells = <1>;partition@0 {reg = <0x0 DT_SIZE_M(64)>;};};};mt25ql512ab2: qspi-nor-flash-2@90000000 {compatible = "st,stm32-qspi-nor";reg = <0x90000000 DT_SIZE_M(64)>; /* 512 Mbits */qspi-max-frequency = <72000000>;status = "okay";};
};&fmc {pinctrl-0 = <&fmc_nbl0_pe0 &fmc_nbl1_pe1&fmc_sdclk_pg8 &fmc_sdnwe_ph5 &fmc_sdcke1_ph7&fmc_sdne1_ph6 &fmc_sdnras_pf11 &fmc_sdncas_pg15&fmc_a0_pf0 &fmc_a1_pf1 &fmc_a2_pf2 &fmc_a3_pf3 &fmc_a4_pf4&fmc_a5_pf5 &fmc_a6_pf12 &fmc_a7_pf13 &fmc_a8_pf14&fmc_a9_pf15 &fmc_a10_pg0 &fmc_a11_pg1&fmc_a14_pg4 &fmc_a15_pg5 &fmc_d0_pd14 &fmc_d1_pd15&fmc_d2_pd0 &fmc_d3_pd1 &fmc_d4_pe7 &fmc_d5_pe8 &fmc_d6_pe9&fmc_d7_pe10 &fmc_d8_pe11 &fmc_d9_pe12 &fmc_d10_pe13&fmc_d11_pe14 &fmc_d12_pe15 &fmc_d13_pd8 &fmc_d14_pd9&fmc_d15_pd10>;pinctrl-names = "default";status = "okay";sdram {status = "okay";power-up-delay = <100>;num-auto-refresh = <8>;mode-register = <0x230>;refresh-rate = <0x603>;bank@1 {reg = <1>;st,sdram-control = <STM32_FMC_SDRAM_NC_8STM32_FMC_SDRAM_NR_12STM32_FMC_SDRAM_MWID_16STM32_FMC_SDRAM_NB_4STM32_FMC_SDRAM_CAS_3STM32_FMC_SDRAM_SDCLK_PERIOD_2STM32_FMC_SDRAM_RBURST_ENABLESTM32_FMC_SDRAM_RPIPE_1>;st,sdram-timing = <2 7 4 7 2 2 2>;};};
};&rtc {clocks = <&rcc STM32_CLOCK_BUS_APB4 0x00010000>,<&rcc STM32_SRC_LSE RTC_SEL(1)>;status = "okay";
};&die_temp {status = "okay";
};&adc3 {st,adc-clock-source = <SYNC>;st,adc-prescaler = <4>;status = "okay";
};/* Arduino Header pins: Tx:D1, Rx:D0 */
/* LPUART1 can also be used with this pins */
&usart1 {dma-names = "tx", "rx";pinctrl-0 = <&usart1_tx_pa9 &usart1_rx_pa10>;pinctrl-names = "default";current-speed = <115200>;status = "okay";
};
4.测试
修改好之后,我们编译一个zephyr自带的跑马灯demo试一下,使用指令:
west build -p always -b stm32h750zbt6 samples/basic/blinky
编译无问题,接好调试器后,我们使用以下命令进行下载:
west flash //使用stm32cubeprogrammer 进行下载
west flash -r openocd //使用openocd进行下载
west flash -r jlink //使用jlink进行下载
烧录完成后,我们可以看到开发板led1开始闪烁,并且也可以通过串口查看到打印出led的状态;
注意:
如果成功烧录没有反应,检查stm32h750zbt6_defconfig文件有没有配置系统时钟和外部HSE时钟
关闭HSE旁路模式
去掉hse-bypass,重新编译,烧录,板子就正常运行了。
相关文章:
zephyr移植到STM32
Zephy如何移植到单片机 1. Window下搭建开发环境1.1 安装Choncolatey1.2 安装相关依赖1.3创建虚拟python环境1.4 安装west1.4.1 使用 pip 安装 west1.4.2 检查 west 安装路径1.4.3 将 Scripts路径添加到环境变量1.4.4 验证安装 1.5 获取zephyr源码和[安装python](https://so.cs…...
Windows使用AutoHotKey解决鼠标键连击现象(解决鼠标连击、单击变双击的故障)
注:罗技鼠标,使用久了之后会出现连击现象,如果刚好过保了,可以考虑使用软件方案解决连击现象: 以下是示例AutoHotKey脚本,实现了调用XButton1用于关闭窗口(以及WinW,XButton2也导向…...
案例研究:UML用例图中的结账系统
在软件工程和系统分析中,统一建模语言(UML)用例图是一种强有力的工具,用于描述系统与其用户之间的交互。本文将通过一个具体的案例研究,详细解释UML用例图的关键概念,并说明其在设计结账系统中的应用。 用…...
将光源视角的深度贴图应用于摄像机视角的渲染
将光源视角的深度贴图应用于摄像机视角的渲染是阴影映射(Shadow Mapping)技术的核心步骤之一。这个过程涉及到将摄像机视角下的片段坐标转换到光源视角下,并使用深度贴图来判断这些片段是否处于阴影中。 1. 生成光源视角的深度贴图 首先&…...
安卓漏洞学习(十八):Android加固基本原理
APP加固技术发展历程 APK加固整体思路 加固整体思路:先解压apk文件,取出dex文件,对dex文件进行加密,然后组合壳中的dex文件(Android类加载机制),结合之前的apk资源(解压apk除dex以外…...
前端数据模拟器 mockjs 和 fakerjs
功能:帮助前端生成随机数据,独立于后端单独开发 一、mockjs 安装:npm install mockjs 优点:官网是中文。 缺点:目前该库已经无人维护,也没人解决github上的bug。 官网 github地址 二、fakerjs 安装…...
Ruby语言的软件开发工具
Ruby语言的软件开发工具概述 引言 Ruby是一种简单且功能强大的编程语言,它以优雅的语法和灵活性而闻名。自1995年首次发布以来,Ruby已经被广泛应用于各种开发领域,特别是Web开发。随着Ruby语言的普及,相关的开发工具也日益丰富。…...
P8772 [蓝桥杯 2022 省 A] 求和
题目描述 给定 𝑛 个整数 𝑎1,𝑎2,⋯ ,𝑎𝑛 求它们两两相乘再相加的和,即 𝑆𝑎1⋅𝑎2𝑎1⋅𝑎3⋯𝑎1⋅𝑎𝑛&…...
(七)Linux库的串口开发
文章目录 基于官方提供的串口测试代码部分解析代码部分1. usage 函数2. opt_parsing_err_handle 函数3. sig_handle 函数4. init_serial 函数5. serial_write 函数6. serial_read 函数7. run_read_mode 函数8. run_write_mode 函数9. run_loopback_test 函数 进行测试第一步编译…...
【git】在服务器使用docker设置了一个gogs服务器,访问和现实都不理想
以下问题应该都可以通过设置custom/conf/app.ini来解决 配置文档参考地址:https://www.bookstack.cn/read/gogs_zh/advanced-configuration_cheat_sheet.md domain显示的事localhost,实际上应该是一个IP地址。 关键字: DOMAIN ROOT_URL 因为是docker…...
ubuntu报错:没有在该文件夹中粘贴文件的权限
1 现象: 近期给ubuntu扩展了硬盘,但是在其中进行文件操作时提示“没有在该文件夹中粘贴文件的权限” 2 原因: 新增硬盘挂载地址为“/home/username/data/” 终端输入 ls -ld /home/username/data/输出 drwxr-xr-x 3 root root 4096 1月…...
JavaWeb开发(六)XML介绍
1. XML介绍 1.1. 什么是XML (1)XML 指可扩展标记语言(EXtensible Markup Language)XML 是一种很像HTML的标记语言。 (2)XML 的设计宗旨是传输数据(目前主要是作为配置文件),而不是显示数据。 (3&a…...
Vue 3 和 Electron 来构建一个桌面端应用
我们将使用 Vue 3 和 Electron 来构建一个桌面端应用,该应用可以通过 Websocket 与服务器进行通信,并实现心跳检测、客户端上线、获取资产信息以及修改资产状态的功能。以下是实现步骤的概述: 项目结构:创建一个 Vue 3 项目&…...
Python中的asyncio:高效的异步编程模型
随着互联网应用的快速发展,程序的响应性和处理效率成为衡量系统性能的重要指标。传统的同步编程模型在面对高并发和IO密集型任务时,常常显得捉襟见肘,难以满足现代应用的需求。Python的asyncio库作为一种高效的异步编程模型,为开发…...
《解锁鸿蒙系统AI能力,开启智能应用开发新时代》
在当今科技飞速发展的时代,鸿蒙系统以其独特的分布式架构和强大的AI能力,为开发者们带来了前所未有的机遇。本文将深入探讨开发者如何利用鸿蒙系统的AI能力开发更智能的应用,开启智能应用开发的新时代。 鸿蒙系统构筑了15系统级的AI能力&…...
安卓OCR使用(Google ML Kit)
OCR是一个很常用的功能,Google ML Kit提供了OCR能力,用起来也很简单,本文介绍一下使用方法。 1. 相关概念 名词概念解释TextBlock块一个段落Line行一行文本Element元素单词;对汉字来说,类似"开头 (分隔符)中间&…...
使用redis的5种常用场景
文章目录 1. 缓存热点数据2. 分布式锁3. 计数器和限流器4. 消息队列5. 会话管理总结 在日常开发工作中,Redis作为一款高性能的内存数据库,凭借其强大的功能特性和卓越的性能表现,已经成为了许多项目中不可或缺的组件。本文将详细介绍Redis在实…...
Extreme670和440的DHCP和vlan划分
1.网关配置 防火墙 USG 添加静态路由,也就是回指路由192.168.0.0 255.255.0.0 192.168.100.2 usg关闭DHCP192.168.100.0段的,usg接口的网关地址是192.168.100.1,防火墙策略启用192.168.100.0段到wan1段的内网和外网的NAT地址转换。 2…...
VTK知识学习(33)-交互问题2
1、前言 主要是针对前面有过实现不了交互的情况进行说明,经过一些尝试和分析调用API,总算实现RenderWindowControl函数回调正常串接,当然这个移动处理事件的效果目前也没有确认。 2、使用 vtkImageReslice reslice vtkImageReslice.New();p…...
c++ thread线程join、detach、joinable方法
(621条消息) 线程中断Thread的interrupt()方法_thread interrupt_萝卜阿咕咕的博客-CSDN博客 C/C编程:std::thread 详解-CSDN博客 #include <iostream> #include <thread>void do_some_work() {std::cout<<"Hello Concurrent World\n"…...
Transformer:深度学习的变革力量
深度学习领域的发展日新月异,在自然语言处理(NLP)、计算机视觉等领域取得了巨大突破。然而,早期的循环神经网络(RNN)在处理长序列时面临着梯度消失、并行计算能力不足等瓶颈。而 Transformer 的横空出世&am…...
【Python】__main__.py、__init__.py
文章目录 1. __init__.py作用:用法:示例:特点 2. __main__.py作用:用法:示例:特点: 3. 综合示例总结: 1. init.py 作用: __init__.py 文件的主要作用是标识一个目录是一…...
springboot集成整合工作流,activiti审批流,整合实际案例,流程图设计,流程自定义,表单配置自定义,代码demo流程
前言 activiti工作流引擎项目,企业erp、oa、hr、crm等企事业办公系统轻松落地,一套完整并且实际运用在多套项目中的案例,满足日常业务流程审批需求。 一、项目形式 springbootvueactiviti集成了activiti在线编辑器,流行的前后端…...
代码随想录算法【Day16】
Day16 513.找二叉树左下角的值 本题使用迭代法更简单,使用迭代法和递归法的区别是什么 递归法 目标就是找深度最大的叶子结点 无论前中后序遍历,都是左节点先被遍历到,所以一旦得到深度最大的节点,就是最后一行最靠左侧的节点…...
从光子到图像——相机如何捕获世界?
引言 你是否想过为何我们按一下相机快门就可以将眼前广袤多彩的世界显示于一个小小的相机屏幕上?本期推文中将带着大家重现从光子转换为电子、电子转换为图像中数字驱动值的整个流程。 ▲人们通过相机捕获眼前的场景 从光子到电子的转换 光线首先通过光学镜头进入相…...
Harmony开发【笔记1】报错解决(字段名写错了。。)
在利用axios从网络接收请求时,发现返回obj的code为“-1”,非常不解,利用console.log测试,更加不解,可知抛出错误是 “ E 其他错误: userName required”。但是我在测试时,它并没有体现为空,…...
Ubuntu 下载安装 elasticsearch7.17.9
参考 https://blog.csdn.net/qq_26039331/article/details/115024218 https://blog.csdn.net/mengo1234/article/details/104989382 过程 来到 Es 的版本发布列表页面:https://www.elastic.co/downloads/past-releases#elasticsearch 根据自己的系统以及要安装的…...
8. LINUX 用户和组
文章目录 8.1 密码文件:/etc/passwd1. 登录名(Login Name)2. 经过加密的密码(Encrypted Password)3. 用户 ID(User ID, UID)4. 组 ID(Group ID, GID)5. 注释(…...
vue监听中的watch监听(详解)
1、watch 选项用于监听数据的变化并执行相应的回调函数。watch 选项提供了两个重要的属性:deep 和 immediate。1.1、深度监听 (deep: true) 当你需要监听一个对象或数组内部的变化时,可以使用 deep: true。 这会使得 watch 监听器递归地监听对象或数组内…...
微信小程序中 隐藏scroll-view 滚动条 网页中隐藏滚动条
在微信小程序中隐藏scroll-view的滚动条可以通过以下几种方法实现: 方法一:使用CSS隐藏滚动条 在小程序的样式文件中(如app.wxss或页面的.wxss文件),添加以下CSS代码来隐藏滚动条: scroll-view ::-webkit…...
K8s Pod OOMKilled,监控却显示内存资源并未打满
1. 问题现象 pod一直重启,通过grafana查看,发现内存使用率并没有100%。 2. 排查过程 2.1 describe查看pod最新一次的状态 可以明显看到,最近一次的重启就是因为内存不足导致的。 2.2 describe 查看node节点状态 找到原因了,原来…...
对话|全年HUD前装将超330万台,疆程技术瞄准人机交互“第一屏”
2024年,在高阶智驾进入快速上车的同时,座舱人机交互也在迎来新的增长点。Chat GPT、AR-HUD、车载投影等新配置都在带来新增量机会。 高工智能汽车研究院监测数据显示,2024年1-10月,中国市场(不含进出口)乘用…...
【HTML+CSS+JS+VUE】web前端教程-10-列表标签之无序列表
无序列表实现 无序列表是一个项目的列表,此列项目使用粗体圆点(典型的小黑圆圈)进行标记 无序列表始于<ul>标签,每个列表项始于<li>标签。<ul><li>苹果...
基于V2X的无人机与特种车辆战地智能通信:技术融合与实战应用
一、引言 1.1 研究背景与意义 在现代战争的复杂环境中,通信系统的高效与可靠已然成为决定胜负的关键因素。随着军事技术的飞速发展,战争形态发生了深刻变革,作战空间不断拓展,从陆地、海洋、天空延伸至电磁、网络、太空等多维领…...
20250109下载JDK17的方法链接
20250109下载JDK17的方法&链接 2025/1/9 16:20 缘起:编译地面站应用程序QGC,需要安装QT和【旧版本的】JDK17。 当时在网上没有找到JDK17,就安装了比较接近的JDK21。反正最后的QT for Android最后就是没有编译通过。 到底是谁的问题&#…...
杭州铭师堂的云原生升级实践
作者:升学e网通研发部基建团队 公司介绍 杭州铭师堂,是一个致力于为人的全面发展而服务的在线教育品牌。杭州铭师堂秉持“用互联网改变教育,让中国人都有好书读”的使命,致力于用“互联网教育”的科技手段让更多的孩子都能享有优…...
chrome浏览器的更新提示弹窗无法更新Chrome解决方法
使用组策略编辑器 此方法适用于 Windows 系统且系统为专业版及以上版本,家庭版系统没有组策略功能。 按下Win R键,打开 “运行” 对话框,输入gpedit.msc并回车,打开组策略编辑器。 在组策略编辑器中,依次展开 “计算机…...
LLM prompt提示构造案例:语音回复内容;o1思维链
1、语音回复内容 目的: 语音聊天助手的prompt,让大模型来引导聊天内容,简短和友好,从而文字转语音时候也比较高效。 ## 角色设定与交互规则 ### 基本角色 你是用户的好朋友. 你的回答将通过逼真的文字转语音技术阅读. ### 回答规则…...
OceanBase 学习计划全攻略:开启分布式数据库探索之旅
《OceanBase 学习计划全攻略:开启分布式数据库探索之旅》 在当今数字化浪潮汹涌澎湃的时代,数据库作为企业信息存储与管理的核心基础设施,其性能、可靠性和扩展性至关重要。OceanBase 作为一款具有卓越分布式特性的国产数据库,正…...
Linux 虚拟机与windows主机之间的文件传输--设置共享文件夹方式
Linux 虚拟机与windows主机之间的文件传输 设置共享文件夹方式 在虚拟机中打开终端查看是否已经新建完成,到文件夹中找到它看一下,这个位置就能存储东西啦...
React Context用法总结
1. 基本概念 1.1 什么是 Context Context 提供了一种在组件树中共享数据的方式,而不必通过 props 显式地逐层传递。它主要用于共享那些对于组件树中许多组件来说是"全局"的数据。 1.2 基本用法 // 1. 创建 Context const ThemeContext React.createC…...
Linux好用软件
力荐软件 apt-fast:更快速的软件管理安装过程会进入一个图形界面,配置线程数等信息,全部默认即可 sudo add-apt-repository ppa:apt-fast/stable sudo apt-get update sudo apt-get -y install apt-fast 以后安装应用,把apt-get直接替换成apt-fast即可,例如安装vlc sudo…...
【MYSQL】
文章目录 1.DDL 1.DDL --添加字段 ALTER TABLE table_name add COLUMN embed_model VARCHAR(32) NOT NULL COMMENT 名称备注 COLLATE utf8mb4_bin AFTER config_code;--修改字段 ALTER TABLE table_name CHANGE COLUMN column_a column_b VARCHAR(500) NOT NULL COMMENT 配置信…...
webrtc之rtc::ArrayView<const uint8_t>
rtc::ArrayView<const uint8_t> 是 WebRTC(或其他基于 rtc 命名空间的库)中常见的一个类型,它通常用于表示一块 只读的内存区域,该内存区域由一系列 uint8_t 类型(无符号 8 位整数)元素组成。 1. rt…...
深入理解 MySQL 的 EXPLAIN 工具
1. 什么是 EXPLAIN 工具? EXPLAIN 是 MySQL 中用来分析 SQL 查询执行计划的命令,它能够显示查询在执行时会如何访问表、使用哪些索引、扫描多少行等信息。通过 EXPLAIN 工具,开发者可以直观地了解查询的执行过程,从而进行针对性的…...
谷歌Google、紫鸟浏览器插件开发
对于跨境电商行业的IT部门来说,经常需要获取各种店铺相关数据,但是仅靠官方提供的接口来获取数据远远不够,这个时候我们就需要插件或者RPA的方式来获取数据。 以下是关于自研紫鸟插件的简单demo,紫鸟浏览器使用的是火狐和谷歌的插…...
HTML 显示器纯色亮点检测工具
HTML 显示器纯色亮点检测工具 相关资源文件已经打包成html等文件,可双击直接运行程序,且文章末尾已附上相关源码,以供大家学习交流,博主主页还有更多Html相关程序案例,秉着开源精神的想法,望大家喜欢&#…...
Win32汇编学习笔记09.SEH和反调试
Win32汇编学习笔记09.SEH和反调试-C/C基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net SEH - structed exception handler 结构化异常处理 跟筛选一样都是用来处理异常的,但不同的是 筛选器是整个进程最终处理异常的函数,但无法做到比较精细的去处理异常(例如处理…...
计算机组成原理(九):乘法器
乘法器原理 乘法器的工作原理可以用二进制乘法来说明。二进制乘法和十进制乘法类似,通过部分积的累加得到结果。 部分积的生成 在二进制乘法中,每一位的乘积是两个二进制数位的 与运算(0 0 0,1 0 0,0 1 0&…...
前端开发中常用的插件库
ahooks 一个高质量且可靠的React Hooks库。class-variance-authority(CVA) 是一个专注于解决CSS类管理问题的库。classnames 是一个在React开发中非常流行的JavaScript工具库,它可以帮助开发者有条件地连接类名字符串。copy-to-clipboard 一个…...