lv12 uboot移植深化 9
u-boot-2013.01移植
【实验目的】
了解u-boot 的代码结构及移植的基本方法
【实验环境】
- ubuntu 14.04发行版
- FS4412实验平台
- 交叉编译工具arm-none-linux-gnueabi-
【注意事项】
实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行
【实验步骤】
1 建立自己的平台
1.1 下载uboot源码
在uboot官网下载uboot源码(这里我们选择u-boot-2013.01.tar.bz2)
ftp://ftp.denx.de/pub/u-boot/
1.2解压uboot源码
拷贝uboot源码包到ubuntu的家目录下,解压并进入其顶层目录
$ tar xvf u-boot-2013.01.tar.bz2
$ cd u-boot-2013.01/
1.3 指定交叉编译工具信息
uboot源码并不知道我们使用的处理器架构及交叉编译工具是什么,这里我们需要自己 在Makefile中指定
$ vi Makefile
将
feq ($(HOSTARCH),$(ARCH))
CROSS_COMPILE ?=
endif
修改为如下内容(注意后边不要有多余的空格),然后保存退出
ifeq (arm,arm)
CROSS_COMPILE ?= arm-none-linux-gnueabi-
endif
1.4 添加Board信息
因为uboot源码并不支持我们的开发板,这里我们需要从源码支持的开发板中找一个硬 件与我们最类似的,在其基础上进行修改,这里我们参考的是samsung公司的origen
$ cp -rf board/samsung/origen/ board/samsung/fs4412$ mv board/samsung/fs4412/origen.c board/samsung/fs4412/fs4412.c
因为修改了文件名,所以对应的Makefile也要修改
$ vi board/samsung/fs4412/Makefile
将
ifndef CONFIG_SPL_BUILDCOBJS += origen.oendif
修改为如下内容,然后保存退出
ifndef CONFIG_SPL_BUILDCOBJS += fs4412.oendif
拷贝origen相关的头文件并将其重命名
$ cp include/configs/origen.h include/configs/fs4412.h
修改文件中的信息
$ vi include/configs/fs4412.h
将
#define CONFIG_SYS_PROMPT "ORIGEN #"
修改为如下内容
#define CONFIG_SYS_PROMPT "fs4412 #"
再将
#define CONFIG_IDENT_STRING " for ORIGEN"
修改为如下内容,然后保存退出
#define CONFIG_IDENT_STRING "for fs4412"
打开uboot源码顶层目录下的boards.cfg文件
$ vi boards.cfg
在
origen arm armv7 origen samsung exynos
后添加如下内容(FS4412的相关信息),然后保存退出
fs4412 arm armv7 fs4412 samsung exynos
至此我们在uboot源码中给我们的板子添加了“档案”,源码就支持我们的开发板了
1.5 编译uboot
在uboot源码顶层目录下执行如下命令,指定当前使用的Board信息
$ make fs4412_config
编译uboot
$ make
编译完成后会在源码顶层目录下生成u-boot.bin文件,但该文件还不能在我们的开发板 上运行,因为以上操作我们只是把origen相关的文件的名字改成了fs4412,使uboot能 识别fs4412开发板,但文件中的代码还是origen的,和我们的开发板不匹配,所以我 们还需要进一步进行修改和配置
2 添加三星加密引导方式
考虑芯片启动的安全性,Exynos4412需要三星提供的初始引导加密后我们的u-boot才 能被引导运行,所以我们需要在uboot源码中添加三星提供的加密处理代码
2.1 添加三星加密引导方式
将资料中“移植相关文件”下的sdfuse_q和CodeSign4SecureBoot目录拷贝到uboot源 码的顶层目录下(这之后不要执行make clean或make distclean,这会将加密文件清除)

因为添加的加密文件也要编译,所以对应的Makefile也要修改
$ vi Makefile
在
$(obj)u-boot.bin: $(obj)u-boot$(OBJCOPY)${OBJCFLAGS} -O binary $< $@$(BOARD_SIZE_CHECK)
后添加如下内容(添加的内容需要tab键缩进,否则编译报错),然后保存退出
@#./mkuboot@split -b 14336 u-boot.bin bl2@+make -C sdfuse_q/@#cp u-boot.bin u-boot-4212.bin@#cp u-boot.bin u-boot-4412.bin@#./sdfuse_q/add_sign@./sdfuse_q/chksum@./sdfuse_q/add_padding@rm bl2a*@echo
2.2 添加调试代码(点灯法)
很多时候我们不确定uboot是否已经在板子上运行,所以我们在uboot源码中添加一段 代码使板子上的LED点亮,这样如果看到LED亮的话就表示uboot已经在运行了
打开uboot启动后的第一段代码
$ vi arch/arm/cpu/armv7/start.S
在第134行后添加如下代码(即点亮LED2),然后保存退出
ldr r0, =0x11000c40ldr r1, [r0]bic r1, r1, #0xf0000000orr r1, r1, #0x10000000str r1, [r0]ldr r0, =0x11000c44mov r1, #0xffstr r1, [r0]
2.3 添加编译脚本
使用make命令编译时只链接uboot源码中的相关代码,而我们添加的初始引导加密的 代码不会被连接到u-boot.bin中,所以这里我们自己编写编译脚本build.sh,这个脚本 中除了对uboot源码进行配置和编译外还将初始引导加密代码链接到了u-boot.bin上, 最终生成一个完成的uboot镜像u-boot-fs4412.bin
将资料中“移植相关文件”下的build.sh拷贝到uboot源码的顶层目录下

给编译脚本添加可执行权限
$ chmod 777 build.sh
2.4 编译uboot
通过脚本编译uboot源码
$ ./build.sh
编译完成后在源码的顶层目录下会生成“u-boot-fs4412.bin”
2.5 测试uboot
参照之前的实验将生成的u-boot-fs4412.bin烧写到SD卡中,开发板选择SD卡启动, 然后上电查看现象,若LED2点亮则说明我自己移植的u-boot已经能够被加载运行
3 实现串口输出
虽然uboot已经能在开发板上加载运行,但是此时的uboot还不能在终端上打印信息, 原因在于uboot源码中对UART的配置与我们实际的硬件不匹配
3.1 修改UART源码
$ vi board/samsung/fs4412/lowlevel_init.S
在
lowlevel_init:
后添加如下内容(初始化临时栈)
dr sp,=0x02060000
在
beq wakeup_reset
后添加如下内容(关闭看门狗)
#if 1ldr r0, =0x1002330cldr r1, [r0]orr r1, r1, #0x300str r1, [r0]ldr r0, =0x11000c08ldr r1, =0x0str r1, [r0]/* Clear MASK_WDT_RESET_REQUEST */ldr r0, =0x1002040cldr r1, =0x00str r1, [r0]#endif
在
uart_asm_init:/* setup UART0-UART3 GPIOs (part1) */mov r0, r7ldr r1, =EXYNOS4_GPIO_A0_CON_VALstr r1, [r0, #EXYNOS4_GPIO_A0_CON_OFFSET]ldr r1, =EXYNOS4_GPIO_A1_CON_VALstr r1, [r0, #EXYNOS4_GPIO_A1_CON_OFFSET]
后添加如下内容(UART初始化)
ldr r0, =0x10030000ldr r1, =0x666666ldr r2, =CLK_SRC_PERIL0_OFFSETstr r1, [r0, r2]ldr r1, =0x777777ldr r2, =CLK_DIV_PERIL0_OFFSETstr r1, [r0, r2]
注释掉
bl uart_asm_init
后的一条语句,然后保存退出
#if 0bl tzpc_init#endif
3.2 编译uboot
通过脚本编译uboot源码
$ ./build.sh
3.3 测试uboot
参照之前的实验将生成的u-boot-fs4412.bin烧写到SD卡中,开发板选择SD卡启动, 然后上电查看现象,若终端有打印信息则说明UART移植成功

4 网卡移植
虽然可以通过终端输入命令,但此时的uboot还不能使用ping、tftp等命令,原因在于 命令都是操作网络的,而uboot源码中网卡的相关配置与我们当前的板子不匹配,所以 我们还要对网卡进行移植
4.1 修改网络初始化代码
$ vi board/samsung/fs4412/fs4412.c
在
struct exynos4_gpio_part2 *gpio2;
后添加如下内容
#ifdef CONFIG_DRIVER_DM9000#define EXYNOS4412_SROMC_BASE 0X12570000#define DM9000_Tacs (0x1)#define DM9000_Tcos (0x1)#define DM9000_Tacc (0x5)#define DM9000_Tcoh (0x1)#define DM9000_Tah (0xC)#define DM9000_Tacp (0x9) #define DM9000_PMC (0x1) struct exynos_sromc {unsigned int bw;unsigned int bc[6];};void exynos_config_sromc(u32 srom_bank, u32 srom_bw_conf, u32 srom_bc_conf){unsigned int tmp;struct exynos_sromc *srom = (struct exynos_sromc *)(EXYNOS4412_SROMC_BASE);/* Configure SMC_BW register to handle proper SROMC bank */tmp = srom->bw;tmp &= ~(0xF << (srom_bank * 4));tmp |= srom_bw_conf;srom->bw = tmp;/* Configure SMC_BC register */srom->bc[srom_bank] = srom_bc_conf;}static void dm9000aep_pre_init(void){unsigned int tmp;unsigned char smc_bank_num = 1;unsigned int smc_bw_conf=0;unsigned int smc_bc_conf=0;/* gpio configuration */writel(0x00220020, 0x11000000 + 0x120);writel(0x00002222, 0x11000000 + 0x140);/* 16 Bit bus width */writel(0x22222222, 0x11000000 + 0x180);writel(0x0000FFFF, 0x11000000 + 0x188);writel(0x22222222, 0x11000000 + 0x1C0);writel(0x0000FFFF, 0x11000000 + 0x1C8);writel(0x22222222, 0x11000000 + 0x1E0);writel(0x0000FFFF, 0x11000000 + 0x1E8); smc_bw_conf &= ~(0xf<<4);smc_bw_conf |= (1<<7) | (1<<6) | (1<<5) | (1<<4);smc_bc_conf = ((DM9000_Tacs << 28)| (DM9000_Tcos << 24)| (DM9000_Tacc << 16)| (DM9000_Tcoh << 12)| (DM9000_Tah << 8)| (DM9000_Tacp << 4)| (DM9000_PMC));exynos_config_sromc(smc_bank_num,smc_bw_conf,smc_bc_conf);}#endif
在
gd->bd->bi_boot_params = (PHYS_SDRAM_1 + 0x100UL);
后添加如下内容
#ifdef CONFIG_DRIVER_DM9000dm9000aep_pre_init();#endif
在文件末尾添加如下内容,然后保存退出
#ifdef CONFIG_CMD_NETint board_eth_init(bd_t *bis) { int rc = 0;#ifdef CONFIG_DRIVER_DM9000rc = dm9000_initialize(bis); #endif return rc; } #endif
4.2 修改网络配置代码
$ vi include/configs/fs4412.h
将
#undef CONFIG_CMD_PING
修改为
#define CONFIG_CMD_PING
再将
#undef CONFIG_CMD_NET
修改为
#define CONFIG_CMD_NET
在文件末尾
#endif /* __CONFIG_H */
前添加如下内容,然后保存退出
#ifdef CONFIG_CMD_NET#define CONFIG_NET_MULTI#define CONFIG_DRIVER_DM9000 1#define CONFIG_DM9000_BASE 0x05000000#define DM9000_IO CONFIG_DM9000_BASE#define DM9000_DATA (CONFIG_DM9000_BASE + 4)#define CONFIG_DM9000_USE_16BIT#define CONFIG_DM9000_NO_SROM 1#define CONFIG_ETHADDR 11:22:33:44:55:66#define CONFIG_IPADDR 192.168.9.200#define CONFIG_SERVERIP 192.168.9.120#define CONFIG_GATEWAYIP 192.168.9.1#define CONFIG_NETMASK 255.255.255.0#endif
4.3 编译uboot
通过脚本编译uboot源码
$ ./build.sh
4.4 测试uboot
参照之前的实验将生成的u-boot-fs4412.bin烧写到SD卡中,开发板选择SD卡启动, 然后上电查看现象;设置好相关的环境变量,使用网线连接开发板与开发主机,使用 ping命令连接ubuntu,若显示“host xxx.xxx.xxx.xxx is alive”则表示网卡移植成功

5 EMMC移植
因为uboot源码中对EMMC的配置与我们的板子不匹配,这里还需要对EMMC相关的 代码进行修改和配置
5.1 修改EMMC初始化代码
将资料中“移植相关文件”下的movi.c拷贝到uboot源码的arch/arm/cpu/armv7/exynos/ 目录下
因为添加的新文件也要编译,所以对应的Makefile也要修改
$ vi arch/arm/cpu/armv7/exynos/Makefile
将
COBJS += clock.o power.o soc.o system.o pinmux.o
修改为如下内容,然后保存退出
COBJS += clock.o power.o soc.o system.o pinmux.o movi.o
修改板级文件
$ vi board/samsung/fs4412/fs4412.c
在
#include <asm/arch/mmc.h>
后添加如下内容
#include <asm/arch/clk.h>#include "origen_setup.h"
在
#ifdef CONFIG_GENERIC_MMC
后添加如下内容
u32 sclk_mmc4; /*clock source for emmc controller*/#define __REGMY(x) (*((volatile u32 *)(x)))#define CLK_SRC_FSYS __REGMY(EXYNOS4_CLOCK_BASE + CLK_SRC_FSYS_OFFSET)#define CLK_DIV_FSYS3 __REGMY(EXYNOS4_CLOCK_BASE + CLK_DIV_FSYS3_OFFSET)int emmc_init(){u32 tmp;u32 clock;u32 i;/* setup_hsmmc_clock *//* MMC4 clock src = SCLKMPLL */tmp = CLK_SRC_FSYS & ~(0x000f0000);CLK_SRC_FSYS = tmp | 0x00060000;/* MMC4 clock div */tmp = CLK_DIV_FSYS3 & ~(0x0000ff0f);clock = get_pll_clk(MPLL)/1000000;for(i=0 ; i<=0xf; i++) {sclk_mmc4=(clock/(i+1));if(sclk_mmc4 <= 160) //200{CLK_DIV_FSYS3 = tmp | (i<<0);break;}}emmcdbg("[mjdbg] sclk_mmc4:%d MHZ; mmc_ratio: %d\n",sclk_mmc4,i);sclk_mmc4 *= 1000000;/** MMC4 EMMC GPIO CONFIG** GPK0[0] SD_4_CLK* GPK0[1] SD_4_CMD* GPK0[2] SD_4_CDn* GPK0[3:6] SD_4_DATA[0:3]*/writel(readl(0x11000048)&~(0xf),0x11000048); //SD_4_CLK/SD_4_CMD pull-down enablewritel(readl(0x11000040)&~(0xff),0x11000040);//cdn set to be outputwritel(readl(0x11000048)&~(3<<4),0x11000048); //cdn pull-down disablewritel(readl(0x11000044)&~(1<<2),0x11000044); //cdn output 0 to shutdown the emmc powerwritel(readl(0x11000040)&~(0xf<<8)|(1<<8),0x11000040);//cdn set to be outputudelay(100*1000);writel(readl(0x11000044)|(1<<2),0x11000044); //cdn output 1writel(0x03333133, 0x11000040);writel(0x00003FF0, 0x11000048);writel(0x00002AAA, 0x1100004C);#ifdef CONFIG_EMMC_8Bitwritel(0x04444000, 0x11000060);writel(0x00003FC0, 0x11000068);writel(0x00002AAA, 0x1100006C);#endif#ifdef USE_MMC4smdk_s5p_mshc_init();#endif}
将board_mmc_init函数中的内容修改为(之前的内容删除即可)如下内容
int board_mmc_init(bd_t *bis){int i, err;#ifdef CONFIG_EMMCerr = emmc_init();#endifreturn err;}
在文件的最末尾添加如下内容,然后保存退出
#ifdef CONFIG_BOARD_LATE_INIT#include <movi.h>int chk_bootdev(void)//mj for boot device check{char run_cmd[100];struct mmc *mmc;int boot_dev = 0;int cmp_off = 0x10;ulong start_blk, blkcnt;mmc = find_mmc_device(0);if (mmc == NULL){printf("There is no eMMC card, Booting device is SD card\n");boot_dev = 1;return boot_dev;}start_blk = (24*1024/MOVI_BLKSIZE);blkcnt = 0x10;sprintf(run_cmd,"emmc open 0");run_command(run_cmd, 0);sprintf(run_cmd,"mmc read 0 %lx %lx %lx",CFG_PHY_KERNEL_BASE,start_blk,blkcnt);run_command(run_cmd, 0);/* switch mmc to normal paritition */sprintf(run_cmd,"emmc close 0");run_command(run_cmd, 0);return 0;}int board_late_init (void){int boot_dev =0 ;char boot_cmd[100];boot_dev = chk_bootdev();if(!boot_dev){printf("\n\nChecking Boot Mode ... EMMC4.41\n");}return 0;}#endif
5.2 添加EMMC命令
将资料中“移植相关文件”下的cmd_movi.c、cmd_mmc.c、cmd_mmc_fdisk.c拷贝到uboot 源码的common/目录下

因为添加的新文件也要编译,所以对应的Makefile也要修改
$ vi common/Makefile
在
COBJS-$(CONFIG_CMD_MMC) += cmd_mmc.o
后添加如下内容,然后保存退出
COBJS-$(CONFIG_CMD_MMC) += cmd_mmc_fdisk.oCOBJS-$(CONFIG_CMD_MOVINAND) += cmd_movi.o
将资料中“移植相关文件”下的mmc.c、s5p_mshc.c拷贝到uboot源码的drivers/mmc/ 目录下

将资料中“移植相关文件”下的mmc.h、movi.h、s5p_mshc.h拷贝到uboot源码的include/ 目录下

因为添加的新文件也要编译,所以对应的Makefile也要修改
$ vi drivers/mmc/Makefile
在
COBJS-$(CONFIG_S5P_SDHCI) += s5p_sdhci.o
后添加如下内容,然后保存退出
COBJS-$(CONFIG_S5P_MSHC) += s5p_mshc.o
5.3 修改EMMC配置代码
$ vi include/configs/fs4412.h
在文件的末尾
#endif /* __CONFIG_H */
前添加如下内容,然后保存退出
#define CONFIG_EVT1 1 /* EVT1 */#ifdef CONFIG_EVT1#define CONFIG_EMMC44_CH4 //eMMC44_CH4 (OMPIN[5:1] = 4)#ifdef CONFIG_SDMMC_CH2#define CONFIG_S3C_HSMMC#undef DEBUG_S3C_HSMMC#define USE_MMC2 #endif#ifdef CONFIG_EMMC44_CH4#define CONFIG_S5P_MSHC#define CONFIG_EMMC 1#define USE_MMC4 /* #define CONFIG_EMMC_8Bit */#define CONFIG_EMMC_EMERGENCY/*#define emmcdbg(fmt,args...) printf(fmt ,##args) */#define emmcdbg(fmt,args...)#endif#endif /*end CONFIG_EVT1*/#define CONFIG_CMD_MOVINAND#define CONFIG_CLK_1000_400_200#define CFG_PHY_UBOOT_BASE CONFIG_SYS_SDRAM_BASE + 0x3e00000#define CFG_PHY_KERNEL_BASE CONFIG_SYS_SDRAM_BASE + 0x8000#define BOOT_MMCSD 0x3#define BOOT_EMMC43 0x6#define BOOT_EMMC441 0x7#define CONFIG_BOARD_LATE_INIT
5.4 编译uboot
通过脚本编译uboot源码
$ ./build.sh
5.5 测试uboot
参照之前的实验将生成的u-boot-fs4412.bin烧写到SD卡中,开发板选择SD卡启动, 然后上电查看现象;若显示EMMC的相关信息则表示EMMC移植成功

6 电源管理移植
因为uboot源码中对电源管理芯片的配置与我们的板子不匹配,后续有可能会导致内核 启动卡死,这里还需要对电源管理芯片相关的代码进行修改和配置
6.1 修改电源管理相关代码
将资料中“移植相关文件”下的pmic_s5m8767.c拷贝到uboot源码的drivers/power/pmic/ 目录下
因为添加的新文件也要编译,所以对应的Makefile也要修改
$ vi drivers/power/pmic/Makefile
在
COBJS-$(CONFIG_POWER_MAX77686) += pmic_max77686.o
后添加如下内容,然后保存退出
COBJS-$(CONFIG_POWER_S5M8767) += pmic_s5m8767.o
将添加的函数在头文件中声明
$ vi include/power/pmic.h
在
int pmic_set_output(struct pmic *p, u32 reg, int ldo, int on);
后添加如下内容,然后保存退出
void pmic_s5m8767_init(void);
修改配置文件
$ vi include/configs/fs4412.h
在文件末尾
#endif /* __CONFIG_H */
前添加如下内容,然后保存退出
#define CONFIG_POWER_S5M8767
修改板级文件
$ vi board/samsung/fs4412/fs4412.c
在board_init函数中
#ifdef CONFIG_DRIVER_DM9000dm9000aep_pre_init();#endif
后添加如下内容,然后保存退出
#ifdef CONFIG_POWER_S5M8767pmic_s5m8767_init();#endif
注释原有的代码
$ vi drivers/power/Makefile
将
COBJS-$(CONFIG_POWER) += power_core.o
修改为(即注释掉)
#COBJS-$(CONFIG_POWER) += power_core.o
修改架构文件
$ vi arch/arm/cpu/armv7/s5p-common/cpu_info.c
在
#include <asm/arch/clk.h>
后添加如下内容,然后保存退出
#include <power/pmic.h>
6.2 编译uboot
通过脚本编译uboot源码
$ ./build.sh
6.3 测试uboot
参照之前的实验将生成的u-boot-fs4412.bin烧写到SD卡中,开发板选择SD卡启动,然后上电查看现象

至此,uboot移植完成
相关文章:
lv12 uboot移植深化 9
u-boot-2013.01移植 【实验目的】 了解u-boot 的代码结构及移植的基本方法 【实验环境】 ubuntu 14.04发行版FS4412实验平台交叉编译工具arm-none-linux-gnueabi- 【注意事项】 实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行 【实验步骤】 1 建立自己的平台 1.…...
大数据与深度挖掘:如何在数字营销中与研究互动
数字营销最吸引人的部分之一是对数据的内在关注。 如果一种策略往往有积极的数据,那么它就更容易采用。同样,如果一种策略尚未得到证实,则很难获得支持进行测试。 数字营销人员建立数据信心的主要方式是通过研究。这些研究通常分为两类&…...
xtu oj 1327 字符矩阵
按照示例的规律输出字符矩阵。 比如输入字母D时,输出字符矩阵如下 ABCDCBA BBCDCBB CCCDCCC DDDDDDD CCCDCCC BBCDCBB ABCDCBA字符矩阵行首、尾都无空格。 输入 每行一个大写英文字母,如果字符为#,表示输入结束,不需要处理。 …...
讨论用于评估DREX的五种DR指标
概要 动态范围是已经使用了近一个世纪的用于评估接收机性能的参数。这里介绍五种动态有关指标的定义及测试方法,用于评估数字接收激励器(DREX,digital receiver exciters)。DREX是构成雷达的关键整部件,其瞬时带宽&am…...
基于SpringBoot的在线疫苗预防小程序
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的在线疫苗预防小程序,ja…...
Kafka使用总结
1、Kafka是何如做到高性能的? a、消息批处理减少网络通信开销,提升系统吞吐能力(先攒一波,消息以“批”为单位进行处理) 生产端:无论是同步发送还是异步发送,Kafka都不会立即就把这条消息发送出…...
2023 年山东省职业院校技能大赛(高等职业教育) “信息安全管理与评估”样题
2023 年山东省职业院校技能大赛(高等职业教育) “信息安全管理与评估”样题 目录 任务 1 网络平台搭建(50 分) 任务 2 网络安全设备配置与防护(250 分) 模块二 网络安全事件响应、数字取证调查、应用程序安…...
Apache Web 服务器监控工具
将Apache Web 服务器监控纳入 IT 基础架构管理策略有助于先发制人地识别性能瓶颈,这种主动监控方法提供必要的数据,以确保 Web 服务器能够胜任任务,并在需要时进行优化。保证客户获得流畅、无忧的用户体验可以大大有助于巩固他们对组织的信任…...
MySQL执行语句 Table ‘mysql.servers‘ doesn‘t exist
执行语句报错: mysql> flush privileges; ERROR 1146 (42S02): Table mysql.servers doesnt exist解决: 进入数据库 删除servers表 mysql> use mysql Database changed mysql> drop table if exists servers; Query OK, 0 rows affected, …...
在datagridview列显示下拉操作
DataGridViewComboBoxExColumn 设定好类型 需要设置的地方是: 绑定数据的操作: 因为此处绑定数据实际为数据 参数 显示的操作,不影响datasource的数据绑定 下一步 数据绑定: DGVCOrderZhuangtai.ValueType typeof(EOrderZhuan…...
基于人工智能 RL 算法的边缘服务器智能选择 模式研究
提出了一种基于人工智能深度强化学习算法的扩展性及智能性较高的智能选择模式。在人工智能深度强化学习 算法的基础上,引入了动作抑制、四重 Q 学习 (QQL) 及归一化 Q-value 等机制,研究并实现了在满足业务延迟要求及公平 性的原则下,物联终端…...
JavaScript流程控制语句
代码块: JS中,可以通过代码块来为代码进行分组, 在同一个代码块中的代码就属于一组代码 这组代码要么全都执行,要么都不执行 JS的代码块比较奇葩。 通常情况下,代码块对于外部来说应该是隔离的, 在代…...
01.Git分布式版本控制工具
一、Git简介 Git是一个开源的分布式版本控制系统,可以有效、高速地进行从很小到非常大的项目的版本管理。 Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。 二、版本控制器方式 1.集中式版本控制工具 版本库放在中央服务器中&…...
Hudi介绍
在数据不断写入 Hudi 期间,Hudi 会不断生成 commit、deltacommit、clean 等 Instant 记录每一次操作类型、状态及详细的元数据,这些 Instant 最终都会存到 .hoodie 元数据目录下,为了避免元数据文件数量过多,ActiveTimeline 越来越…...
MYSQl基础操作命令合集与详解
MySQL入门 先来个总结 SQL语言分类 DDL(Data Definition Language) - 数据定义语言: 用于定义和管理数据库结构,包括创建、修改和删除数据库对象。 示例:CREATE, ALTER, DROP等语句。 DML(Data Manipulation Lan…...
【Flink名称解释一】什么是cataLog
Catalog 提供了元数据信息,例如数据库、表、分区、视图以及数据库或其他外部系统中存储的函数和信息。 数据处理最关键的方面之一是管理元数据。 元数据可以是临时的,例如临时表、或者通过 TableEnvironment 注册的 UDF。 元数据也可以是持久化的&#x…...
ES如何提高准确率之【term-centric】
提高准确率的方法有很多,但是要在提高准确率的同时保证召回率往往比较困难,本文只介绍一种比较常见的情况。 问题场景 我们经常搜索内容,往往不止针对某个字段进行搜索,比如:标题、内容,往往都是一起搜索…...
DDD落地:爱奇艺打赏服务,如何DDD架构?
尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题: 谈谈你的DDD落地经验? 谈谈你对DDD的理解&#x…...
基于JavaWeb+SSM+Vue居住证申报系统小程序的设计和实现
基于JavaWebSSMVue居住证申报系统小程序的设计和实现 源码获取入口KaiTi 报告Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 KaiTi 报告 1.1题目背景 随着时代的发展,人口流动越来越频繁࿰…...
环境安全之配置管理及配置安全设置指导
一、前言 IT运维过程中,配置的变更和管理是一件非常重要且必要的事,除了一般宏观层面的配置管理,还有应用配置参数的配置优化,本文手机整理常用应用组件配置项配置,尤其安全层面,以提供安全加固指导实践。…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
