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运维过程中,配置的变更和管理是一件非常重要且必要的事,除了一般宏观层面的配置管理,还有应用配置参数的配置优化,本文手机整理常用应用组件配置项配置,尤其安全层面,以提供安全加固指导实践。…...
【C#】Microsoft C# 视频学习总结
一、文档链接 C# 文档 - 入门、教程、参考。| Microsoft Learn 二、基础学习 1、输出语法 Console.WriteLine() using System; namespace HelloWorldApplication {class HelloWorld{static void Main(string[] args){Console.WriteLine("Hello World!");}} }Hel…...
【已解决-实操篇】SaTokenException: 非Web上下文无法获取Request问题解决-实操篇
在上一篇《【理论篇】SaTokenException: 非Web上下文无法获取Request问题解决 -理论篇》中,凯哥(公众号:凯哥Java)介绍了了产生这个问题的源码在哪里,以及怎么解决的方案。没有给出实际操作步骤。 本文,凯哥就通过threadLocal方案…...
论文润色机构哪个好 快码论文
大家好,今天来聊聊论文润色机构哪个好,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧,可以借助此类工具: 标题:论文润色机构哪个好――专业、高效、可靠的学术支持 一…...
Idea执行bat使用maven打包springboot项目成docker镜像并push到Harbor
如果执行以下命令失败,先把mvn的-q参数去掉,让错误输出到控制台。 《idea配置优化、Maven配置镜像、并行构建加速打包、解决maven打包时偶尔几个文件没权限的问题》下面的使用company-repo私有仓库和阿里云镜像仓库同时使用的配置参考。 bat echo off …...
NCNN 源码学习【三】:数据处理
一、Topic:数据处理 这次我们来一段NCNN应用代码中,除了推理外最重要的一部分代码,数据处理: ncnn::Mat in ncnn::Mat::from_pixels_resize(bgr.data, ncnn::Mat::PIXEL_BGR, bgr.cols, bgr.rows, 227, 227);const float mean_v…...
RabbitMq基本使用
目录 SpringAMQP1.准备Demo工程2.快速入门1.1.消息发送1.2.消息接收1.3.测试 3.WorkQueues模型3.1.消息发送3.2.消息接收3.3.测试3.4.能者多劳3.5.总结 SpringAMQP 将来我们开发业务功能的时候,肯定不会在控制台收发消息,而是应该基于编程的方式。由于R…...
windows wsl2 ubuntu上部署 redroid云手机
Redroid WSL2部署文档 下载wsl内核源码 #文档注明 5.15和5.10 版本内核可以部署成功,这里我当前最新的发布版本 #下载wsl 源码 wget --progressbar:force --output-documentlinux-msft-wsl-5.15.133.1.tar.gz https://codeload.github.com/microsoft/WSL2-Linux-Ker…...
创维电视机 | 用当贝播放器解决创维电视机不能播放MKV视频的问题
小故事在下面,感兴趣可以看看,开头我就直接放解决方案 创维电视虽然是基于Android开发的,可以安装apk软件,但是基本不能用,一定要选择适配电视的视频播放器,或者使用本文中提供的创维版当贝播放器。 原软…...
【STM32】DMA直接存储器存取
1 DMA简介 DMA(Direct Memory Access)直接存储器存取 可以直接访问STM32的存储器的,包括运行SRAM、程序存储器Flash和寄存器等等 DMA可以提供外设寄存器和存储器或者存储器和存储器之间的高速数据传输,无须CPU干预,节…...
Vue3-09-条件渲染-v-show 的基本使用
v-show 的作用 v-show 可以根据条件表达式的值【展示】或【隐藏】html 元素。v-show 的特点 v-show 的实现方式是 控制 dom 元素的 css的 display的属性, 因此,无论该元素是否展示,该元素都会正常渲染在页面上, 当v-show 的 条件…...
网站建设公司谁家好/百度搜索关键词优化
今天突然注意到$ls -l显示文件时,权限列后面有个点。如:-rw-rw-r--. 1 user group 13767 12月 25 2014 index.html解释:开启了SELinux功能的Linux系统才会有这个点。那个点表示文件带有“SELinux的安全上下文”。CentOS7默认是开启SELinux的&…...
可以看网站的浏览器/2345网址大全下载到桌面
一、问题 在使用latex写英文论文时遇到一个问题,不知道如何输入藏文字符或者藏语字体,经过查询,实现了如何使用latex显示藏语文字,具体过程分享给大家参考。 二、实现步骤 导入两个包 \usepackage{fontspec} \setmainfont{Micro…...
网站手机端排名怎么做/个人网站制作
文章目录前言一、依赖关系是什么?二、支持的功能总结前言 终于更新一个小的python项目来一起动手学习了,今天想看看Redis源码,可惜太慢太多,思维太乱,于是想到看是否用Python可以分析出这个源码直接的依赖关系。 一、…...
北京网站设计优刻/东莞网络排名优化
操作系统(Operating System, OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口和环境的程序集合。计算机操作系统是随着计算机研究和应用的发展逐步形成并发展起来的&#…...
深圳免费做网站/网络运营seo是什么
7 月 12 日,Python 之父 Guido van Rossum 在 Python 邮件组里发邮称,他将退出 Python 核心决策层,而转居幕后。从 Guido van Rossum 的邮件内容可以看出,他已经厌倦了运营该组织。他在邮件开头写道,「我不想再为 PEP&…...
企业网站建设方案.doc/响应式网站 乐云seo品牌
elites alliance allies revert stewardship fringe orthodoxy creak incitement repudiate wrangle democrat credence filibuster petition disbar purge tumor ductal oncogenic mutant inflammation progenitor...