S5PV210-uboot解析(二)-start.S解析

2023-05-16

start.S解析
首先是头文件包含
# include   <config.h>
# include   <version.h>
# if   defined(CONFIG_ENABLE_MMU)
# include   <asm/proc/domain.h>
#endif
# include   <regs.h>
 
#ifndef CONFIG_ENABLE_MMU
#ifndef CFG_PHY_UBOOT_BASE
#define CFG_PHY_UBOOT_BASE CFG_UBOOT_BASE
#endif
#endif
config.h是在配置时生成的文件,里面包含的是linux/autoconf.h,在mkconfig文件中可以看到生成的指令,内部包含板子的型号等参数。
version.h是uboot版本号,由Makefile生成。
asm/proc/domain.h不是uboot的原生目录,是配置时创建的符号链接,实际指向asm-arm/proc-armv/domain.h
regs.h也是配置时生成的,实际为s5pc110.h
上面两个目录这样配置是为了增强可移植性。
接着定义两个宏 CFG_PHY_UBOOT_BASE CFG_UBOOT_BASE 为uboot的物理地址,CFG_UBOOT_BASE地址为0x33e00000
# if   defined(CONFIG_EVT1) && !defined(CONFIG_FUSED)
     .word  0x2000
     .word  0x0
     .word  0x0
     .word  0x0
#endif
宏CONFIG_EVT1已经被定义了,后面定义4个字,由于210是32位,所以一个字就是4个字节。这里定义4个字是为了填充uboot前16字节,因为210sd卡启动时会有16B的校验头,所以这里预先填充16字节的数据,以后计算校验头的时候直接覆盖前16字节。
.globl _start
_start: b  reset
     ldr pc, _undefined_instruction
     ldr pc, _software_interrupt
     ldr pc, _prefetch_abort
     ldr pc, _data_abort
     ldr pc, _not_used
     ldr pc, _irq
     ldr pc, _fiq
start.S的开始,这里虽然定义了异常向量表,但是由于uboot主要是用作启动,运行过程很短,所以基本不会用到。
开头的 b reset 跳转到reset,reset就是代码真正有意义的起始位置。 构建异常向量表
.global _end_vect
_end_vect:
 
     .balignl  16 , 0xdeadbeef
这里定义了结束时候的动作, .balignl是为了字节对齐,后面第一个参数表示16字节对齐,第二个参数表示填充内容,当地址偏移4个地址就填充0xdeadbeef,直到地址16字节对齐为止。0xdeadbeef本身没有别的意思,只是十六进制的数刚好组成了两个单词,坏牛肉,意思就是没用的东西,用来填充内存的。
_TEXT_BASE:
     .word   TEXT_BASE
/*
  * Below variable is very important because we use MMU in U-Boot.
  * Without it, we cannot run code correctly before MMU is ON.
  * by scsuh.
  */
_TEXT_PHY_BASE:
     .word   CFG_PHY_UBOOT_BASE
 
.globl _armboot_start
_armboot_start:
     .word _start
 
/*
  * These are defined in the board-specific linker script.
  */
.globl _bss_start
_bss_start:
     .word __bss_start
 
.globl _bss_end
_bss_end:
     .word _end
定义TEXT_BASE,就是链接时的链接地址,0xc3e0_0000,随后又定义了CFG_PHY_UBOOT_BASE,之后定义了启动时的_start还有bss段。这些段的地址都是从链接脚本中得到的,这里相当于开辟空间存放这些地址。
/*
  * the actual reset code
  */
 
reset:
     /*
      * set the cpu to SVC32 mode and IRQ & FIQ disable
      */
     @;mrs   r0,cpsr
     @;bic   r0,r0,#0x1f
    @;orr   r0,r0,#0xd3
    @;msr   cpsr,r0
    msr cpsr_c, #0xd3       @ I & F disable, Mode:  0x13   - SVC
实际的reset代码。前面四行被注释掉了,实际代码只有一行 msr cpsr_c, #0xd3 msr传送数据到协处理器将#0xd3传送到cpsr寄存器的低八位(cpsr_c表示cpsr寄存器的低八位),0xd3就是11010011,禁止IRQ、FIQ,使处理器为ARM模式(即使用ARM指令而非Thumb指令),模式选择SVC模式。 设置处理器模式(SVC)
cpu_init_crit:
……
bl disable_l2cache
bl set_l2cache_auxctrl_cycle
bl enable_l2cache
        /*
         * Invalidate L1 I/D
         */
         mov r0, #0                  @  set  up  for  MCR
        mcr p15, 0, r0, c8, c7, 0   @ invalidate TLBs
        mcr p15, 0, r0, c7, c5, 0   @ invalidate icache
 
        /*
         * disable MMU stuff and caches
         */
         mrc p15, 0, r0, c1, c0, 0
        bic r0, r0, #0x00002000     @ clear bits 13 (--V-)
        bic r0, r0, #0x00000007     @ clear bits 2:0 (-CAM)
        orr r0, r0, #0x00000002     @  set  bit 1 (--A-) Align
        orr r0, r0, #0x00000800     @  set  bit 12 (Z---) BTB
        mcr    p15, 0, r0, c1, c0, 0
接着是cpu初始化的代码,随后是 关L2 cache,设置L2 cache,使能L2 cache,刷新L1 cache的 Icache和 Dcache,关闭MMU。
这部分都是和CPU的cache和mmu有关,大概知道即可。 初始化cpu cache,关闭mmu
         /* Read booting information */
         ldr r0, =PRO_ID_BASE
         ldr r1, [r0,#OMR_OFFSET]
         bic r2, r1, #0xffffffc1
/* NAND BOOT */
     cmp r2, # 0x0        @ 512B  4 -cycle
     moveq   r3, #BOOT_NAND
 
     cmp r2, # 0x2        @ 2KB  5 -cycle
     moveq   r3, #BOOT_NAND
 
     cmp r2, # 0x4        @ 4KB  5 -cycle 8 -bit ECC
     moveq   r3, #BOOT_NAND
 
     cmp r2, # 0x6        @ 4KB  5 -cycle 16 -bit ECC
     moveq   r3, #BOOT_NAND
 
     cmp r2, # 0x8        @ OneNAND Mux
     moveq   r3, #BOOT_ONENAND
 
     /* SD/MMC BOOT */
     cmp     r2, # 0xc
     moveq   r3, #BOOT_MMCSD
 
     /* NOR BOOT */
     cmp     r2, # 0x14
     moveq   r3, #BOOT_NOR 
/* Uart BOOTONG failed */
     cmp     r2, #( 0x1 << 4 )
     moveq   r3, #BOOT_SEC_DEV
      
     ldr r0, =INF_REG_BASE //0xE010F000
     str r3, [r0, #INF_REG3_OFFSET]  //0x0c
读取启动信息,根据PRO_ID_BASE和OMR_OFFSET得知寄存器地址为0xE0000004,这个寄存器中的值反映了OMpin的接法,也就是知道了启动介质是Nand还是SD还是别的东西。之后比较r2,将对应的启动介质的地址写入r3中。最后将r3的数据传入 INF_REG_BASE+INF_REG3_OFFSET中,查手册知这是INFORM3,用户定义数据的寄存器,这里用来存储启动介质的信息。
/*
  * Go setup Memory and board specific bits prior to relocation.
  */
 
ldr sp, =0xd0036000  /* end of sram dedicated to u-boot */
sub sp, sp, #12   /* set stack */
mov fp, #0
 
bl  lowlevel_init   /* go setup pll,mux,memory */
这里第一次初始化栈地址,栈地址在SRAM中。这里初始化栈,之后调用lowlevel_init函数去初始化各个硬件,lowlevel_init的详细分析在:http://blog.csdn.net/ldzq_sue/article/details/78354879
关看门狗 开发板供电置锁 恢复I/O状态 初始化时钟 DDR初始化 串口初始化并打印调试信息"OK"
/* To hold max8698 output before releasing power on switch,
  * set PS_HOLD signal to high
  */
ldr r0, = 0xE010E81C    /* PS_HOLD_CONTROL register */
ldr r1, = 0x00005301       /* PS_HOLD output high */
str r1, [r0]
 
这里又进行了一次开发板置锁操作,实际上在lowlevel_init函数里已经做过了。
/* get ready to call C functions */
ldr sp, _TEXT_PHY_BASE /* setup temp stack pointer */
sub sp, sp, # 12
mov fp, # 0          /* no previous frame, so fp=0 */
第二次设置栈,因为之前的代码都还在SRAM中运行,内存空间很小(只有96KB)。第二部分还在SD卡(启动介质)里,现在DDR已经初始化了,可以使用更多的空间,将整个代码都迁移到DDR中。。这次设置栈地址在DDR SDRAM中,虽然设置的栈地址和uboot代码链接地址相同,但是由于ARM中的栈是满减栈(FD),所以uboot代码向后执行,而栈则向前压栈,并不会冲突。
 
/* when we already run in ram, we don't need to relocate U-Boot.
  * and actually, memory controller must be configured before U-Boot
  * is running in ram.
  */
ldr r0, = 0xff000fff
bic r1, pc, r0        /* r0 <- current base addr of code */
ldr r2, _TEXT_BASE     /* r1 <- original base addr in ram */
bic r2, r2, r0        /* r0 <- current base addr of code */
cmp     r1, r2                   /* compare r0, r1                  */
beq     after_copy     /* r0 == r1 then skip flash copy   */
这里再次检查当前地址与链接地址(之前在lowlevel_init中检查过),判断是否需要重定位。冷启动的这个时候,这些代码还运行在SRAM中,需要进行重定位来将整个代码迁移到DDR中。
# if   defined(CONFIG_EVT1)
     /* If BL1 was copied from SD/MMC CH2 */
     ldr r0, = 0xD0037488
     ldr r1, [r0]
     ldr r2, = 0xEB200000
     cmp r1, r2
     beq     mmcsd_boot
#endif
0xD003_7488用户手册上没有,在iROM_ApplicationNote里,0xD0037488 V210_SDMMC_BASE Current boot channel. 0xEB20000是SDMA System Address register,用来为DMA transfer存储系统内存地址。r1和r2比较,如果相同就说明是通过SD卡从通道2启动,跳转去执行mmcsd_boot。
 
     ldr r0, =INF_REG_BASE //0xE010F000
     ldr r1, [r0, #INF_REG3_OFFSET] //0x0c
     cmp r1, #BOOT_NAND     /* 0x0 => boot device is nand */
     beq nand_boot
     cmp r1, #BOOT_ONENAND  /* 0x1 => boot device is onenand */
     beq onenand_boot
     cmp     r1, #BOOT_MMCSD
     beq     mmcsd_boot
     cmp     r1, #BOOT_NOR
     beq     nor_boot
     cmp     r1, #BOOT_SEC_DEV
     beq     mmcsd_boot
这里和上面代码的作用基本相同而且更全面,使用了之前读取OM pin后存储到INFORM的启动介质信息,可以看出上一段的代码有点重复了。
后面是各个启动介质boot的函数,这里只看mmcsd的:
mmcsd_boot:
# if   DELETE //这个宏没有被定义过
     ldr     sp, _TEXT_PHY_BASE      
     sub     sp, sp, # 12
     mov     fp, # 0
#endif
     bl      movi_bl2_copy
     b       after_copy
实际上的代码之后最后两行,movi_bl2_copy是在cpu/s5pc11x/movi.c文件里的一个C语言函数,功能是重定位代码到DDR中,之后跳转到 after_copy 去。 重定位代码到DDR
after_copy:
 
# if   defined(CONFIG_ENABLE_MMU)
enable_mmu:
     /* enable domain access */
     ldr r5, = 0x0000ffff
     mcr p15,  0 , r5, c3, c0,  0       @load domain access register
加载域访问寄存器。
 
     /* Set the TTB register */
     ldr r0, _mmu_table_base
     ldr r1, =CFG_PHY_UBOOT_BASE
     ldr r2, = 0xfff00000
     bic r0, r0, r2
     orr r1, r0, r1
     mcr p15,  0 , r1, c2, c0,  0
 
设置转换表(Translation Table Base), _mmu_table_base 是一个标号,里面的内容是
_mmu_table_base:
     .word mmu_table //.word 就表示在当前位置放一个值,值是mmu_table
意思就是把 _mmu_table_base地址的内容传递给r0,而 _mmu_table_base上的内容是mmu_table
     /* Enable the MMU */
mmu_on:
     mrc p15,  0 , r0, c1, c0,  0
     orr r0, r0, # 1
     mcr p15,  0 , r0, c1, c0,  0
     nop
     nop
     nop
     nop
#endif
使能MMU,这些设置内存相关的都是通过协处理器CP15来设置的。
建立虚拟地址映射物理地址的转换表并使能MMU
skip_hw_init:
     /* Set up the stack                         */
stack_setup:
# if   defined(CONFIG_MEMORY_UPPER_CODE) //定义了这个宏
     ldr sp, =(CFG_UBOOT_BASE + CFG_UBOOT_SIZE -  0x1000 )
# else
     ldr r0, _TEXT_BASE     /* upper 128 KiB: relocated uboot   */
     sub r0, r0, #CFG_MALLOC_LEN   /* malloc area                      */
     sub r0, r0, #CFG_GBL_DATA_SIZE  /* bdinfo                        */
# if   defined(CONFIG_USE_IRQ) //没有定义这个宏
     sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
     sub sp, r0, # 12        /* leave 3 words for abort-stack    */
 
#endif
第三次设置栈,这次设置栈的目的是为了调整栈的位置,使栈放在比较合适的地方(安全,紧凑而又不浪费内存)。
clear_bss:
     ldr r0, _bss_start     /* find start of bss segment        */
     ldr r1, _bss_end       /* stop here                        */
     mov    r2, # 0x00000000         /* clear                            */
 
clbss_l:
     str r2, [r0]       /* clear loop...                    */
     add r0, r0, # 4
     cmp r0, r1
     ble clbss_l
      
     ldr pc, _start_armboot
 
_start_armboot:
     .word start_armboot
清bss段,bss段的开头和结尾地址是从链接脚本u-boot.lds中得到的。之后长跳转到_start_armboot,即DDR中无缝衔接进行到启动第二阶段。
至此,uboot启动第一阶段完毕。回顾整个启动过程,首先上电后板子内部的iROM里的BL0根据OMpin来判断启动介质,随后将启动代码的BL1部分(前16KB部分,具体大小不太清楚,数据手册写的最大16KB,但实际代码都是16KB。总之16KB是肯定可以工作的。)读取到SRAM中去启动执行,启动过程中执行了很多工作,包括:
  1. 构建异常向量表
  2. 设置处理器模式(SVC)
  3. 初始化cpu cache,关闭mmu
  4. 关看门狗
  5. 开发板供电置锁
  6. 恢复I/O状态
  7. 初始化时钟
  8. 初始化DDR
  9. 初始化串口并打印调试信息"OK"
  10. 重定位代码到DDR
  11. 建立虚拟地址映射物理地址的转换表并使能MMU
  12. 跳转到第二阶段
之后的代码就从 start_armboot开始执行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

S5PV210-uboot解析(二)-start.S解析 的相关文章

  • frp错误,frp报错,[ssh] start error: proxy name [ssh] is already in use

    在linux开发板上 xff0c arm开发板上 xff0c 运行frp xff0c 报错 ssh start error proxy name ssh is already in use 原因是有其他的设备运行过 ssh 命名的子项 xf
  • Failed to start mysqld.service: Unit not found问题解决方案

    1 首先安装mariadb server yum install y mariadb server 2 启动服务 systemctl start mariadb service 3 添加到开机启动 systemctl enable mari
  • U-Boot相关命令开发板烧写问题及解决方案

    前言 最近在学习u boot命令在开发板的烧写 在进行该实验的过程中 出现了很多问题和错误 在这里我根据自己的开发历程 将我出现的几大问题进行了汇总 并附有相关解决办法 这些解决方案都经过我亲自验证有效 希望能让大家在开发过程中有所启发 问
  • imx6ul:uboot-2013.10启动过程解析

    1 源码结构分析 首先一个问题 老版本的u boot是没有SPL这个文件的 新版u boot开始包含SPL文件 原来u boot启动比如放到nand中 在cpu内部有一个stepping stone 可以拷贝nand中的u boot到ram
  • iMX6ULL-UBoot移植

    U Boot移植 文章目录 U Boot移植 1 获取源码 1 1 从u boot官网获取 1 2 从芯片厂商获取 1 3 从开发板厂商获取 2 移植 2 1 生成自己的配置文件 2 1 1 拷贝参考板的配置文件 2 1 2 生成修改配置文
  • ZYNQ平台在SDK下引导启动UBOOT

    ZYNQ芯片 Linux系统搭建完成后 希望通过QSPI Flash的方式来进行程序加载 QSPI Flash启动则需要烧录以下文件 BOOT bin fsbl elf uboot elf uImage linux内核 zynq board
  • S5PV210开发1.0.5----重定位relocate与SDRAM

    目录 1 5 1 关看门狗 1 5 2 设置栈 调用C语言 1 5 3 开iCache 1 5 4 重定位及其代码实战 1 5 5 SDRAM介绍 1 用汇编关看门狗 1 1 什么是看门狗 watch dog timer 定时器 Soc的内
  • S5PV210开发系列五_sd卡驱动实现

    S5PV210开发系列五 sd卡驱动实现 象棋小子 1048272975 SD卡 Secure Digital Memory Card 具有体积小 容量大 数据传输快 可插拔 安全性好等优点 被广泛应用于便携式设备上 例如作为数码相机的存储
  • 交叉编译Cubietruck的u-boot

    1 下载u boot源码 mkdir cubietruck cd cubietruck git clone https github com linux sunxi u boot sunxi git
  • linux的进程1:rootfs与linuxrc

    在内核启动的最后阶段启动了三个进程 进程0 进程0其实就是刚才讲过的idle进程 叫空闲进程 也就是死循环 进程1 kernel init函数就是进程1 这个进程被称为init进程 进程2 kthreadd函数就是进程2 这个进程是linu
  • GNU风格 汇编语法总结

    汇编源程序一般用于系统最基本的初始化 初始化堆栈指针 设置页表 操作 ARM的协处理器等 这些初始化工作完成后就可以跳转到C代码main函数中执行 1 GNU汇编语言语句格式 任何Linux汇编行都是如下结构
  • uboot以tag方式给内核传参

    1 tag方式传参 1 struct tag tag是一个数据结构 在uboot和linux kernel中都有定义tag数据机构 而且定义是一样的 2 tag header和tag xxx tag header中有这个tag的size和类
  • 自定义busybox文件系统存在的问题

    1 串口终端看不到命令行入口 只能在显示器端HDMI 看到 2 内核默认无法加载除了busybox openwrt文件系统 debian ubuntu无法加载
  • 海思芯片(hi3516dv300)uboot镜像生成过程详解

    1 前言 1 本文介绍的uboot编译过程是基于海思提供SDK包里的uboot源码进行编译 具体的编译参数是根据hi3516dv300芯片来设置的 编译生成的uboot烧录镜像也是用于hi3516dv300芯片的uboot镜像 2 对于Ma
  • Linux下uboot编译出错(/bin/bash: arm-none-linux-gnueabi-gcc: command not found )

    unboot压缩包解压 tar xz 在终端进入解压目录 xz d tar xz tar xvf tar 向Makefile添加编译路径 在makefile的开头添加本机的编译路径 ARCH arm CROSS COMPILE opt fs
  • 图像与 zImage 与 uImage

    它们之间有什么区别 我知道u boot需要uImage格式的内核 我使用的系统首先从第一阶段加载程序启动 然后调用 u boot 我想放弃 u boot 并直接从第一阶段加载程序启动 我必须使用哪种类型的内核映像 它们之间有什么区别 Ima
  • 嵌入式linux ARM启动地址

    我按照一些文档通过 sdcard 在 ARM 板 例如 Freescale Vybrid tower 上启动嵌入式 Linux 在文档中 有构建 uImage 并将 u boot 写入 sdcard 的步骤 如下所示 sudo dd if
  • 如何从 U-Boot 启动裸板二进制文件?

    我们如何从 U Boot 启动独立的裸板二进制文件 不是使用 U Boot 环境运行的独立二进制文件 而不是 Linux 内核 我的要求是使用我的二进制文件重新初始化主板和驱动程序 我可以用我的二进制文件替换启动介质 此处为 NOR 闪存
  • 实现自定义 u-boot 命令

    我想添加自定义命令命令u boot可以是一个简单的 hello world 命令 搜索后我发现了这个链接Yocto u boot 自定义命令它说看的地方timer命令输入cmd misc c作为起点 我怎么带这个timer命令到我的 u b
  • u-boot 可以支持多个以太网端口吗?

    我想从多个以太网端口执行 ping 操作 u boot 仅支持单个以太网端口是否存在固有限制 u boot 可以支持多个以太网端口吗 是的 在最近版本的 U Boot 中 至少可以追溯到 2012 10 突出的代码是eth current

随机推荐

  • UCOSII--操作系统家族中的麻雀 前言与自嘲

    平凡的2013年随风逝去 xff0c 泛起的波纹还未抚平 时间总是这样当还未到达时 xff0c 总给人时间充裕的假象 xff0c 而当望着它的背影是却不时地感叹白驹过隙 太多的记忆是那么的刻骨铭心 xff0c 太多的时间从指间流走 xff0
  • UCOSII中的任务切换原理介绍

    1 多任务的引入 之所以引入多任务 xff0c 主要在于提高程序运行的效率 多任务的过程 xff0c 能够有效地发挥交换式任务的运作效率 类似的 xff0c 由于一个任务里面也有瓶颈的地方 xff0c 为了把瓶颈的地方抠出来 xff0c 让
  • ADI公司器件Pspice模型导出原理图symbol

    用于仿真的Pspice模型 xff0c 需要从ADI公司网站下载模型文件 xff0c 格式为 cir 不同于 mod文件 xff0c cir文件导出的管脚与原理图管脚不匹配 xff0c 刚开始会有点无从下手 我自己也是纠结了很长时间 xff
  • Capture到Allegro按页摆放遇到的小问题以及解决办法

    笔者利用网上的方法 xff0c 一遍遍的尝试 xff0c 一遍遍的不行 xff0c 自己定义的user defined property始终在Allegro中找不出来 作为新手 xff0c 纠结了半天 xff0c 甚是郁闷 xff0c 最终
  • 自定义元件package时,元件的新建属性在原理图中无显示

    在制作元件package封装 xff0c 选择package type 封装为Heterogeneous xff0c 给元件新定义封装 xff0c 却在原理图中显示不了 在调出的编辑属性中没用选项 xff0c 无法更改数值 以至于自动分配标
  • 在Altium Designer中使用AUTOCAD快速制作元件封装

    笔者通过使用AutoCAD处理图形 xff0c 并将其导入Altium Designer中 xff0c 快速绘制元件封装 xff0c 省去算间距的时间 本例中以NPN管 B772 封装为SOT 89为例 xff1a 第一步 xff1a 使用
  • 飞思卡尔中出现NO TBDML Interface found

    1 xff0c 安装BDM的驱动器 xff0c 安装完成之后检查USBDM上的绿灯是否闪烁 xff0c 有时候驱承购安装之后 xff0c 但绿灯不亮 xff1b 2 xff0c 若绿灯不亮 xff0c 而且在电脑属性里面的驱动安装成功之后
  • ubuntu装RTL8111/8168B网卡驱动

    给本本装了ubuntu xff0c 结果被上网的问题搞疯了 表现为开机后有较小概率网卡能正常工作 xff08 这两天来N次能用的时候有2次 xff09 正常的时候网络连接信息显示都和win下一样 不能联网的时候网络信息上全部显示0 0 0
  • LabVIEW如何调用C#Winform

    界面交互并不是Labview的强项 xff0c 使用Labview创建UI时候总会受制于VI有限的控件 xff0c 有限的皮肤和有限的控件事件 而当需要实现UI的多文档的窗口 xff0c 窗口的浮动停靠 xff0c 动画等功能时还需要花很大
  • Intellij IDEA 社区版集成 Database Navigator 数据库管理工具

    Intellij IDEA 社区版集成 DB Navigator数据库管理工具 第一步 xff1a 打开IDEA xff0c Intellij IDEA gt Preferences gt Plugins 第二步 xff1a 在Plugin
  • LabVIEW类方法浏览器-Class Method Browser

    随着LabVIEW的类编程应用增多 xff0c 当打开较多的VI进行编辑时候 xff0c 添加该类对应的VI方法到程序后背板上操作显得繁琐 xff08 需要在Project浏览器或类浏览器或库浏览器中找到该类的方法VI xff0c 然后再拖
  • vue学习笔记—bootstrap+vue用户管理

    vue xff0c 读音view xff0c 简单易用的前端框架 特点如下 xff1a 1 一个mvvm的前端框架 xff0c 内部做好了html中dom对象和后台用js语言定义的变量的双向绑定 2 中国人尤雨溪维护的个人项目 xff0c
  • Mysql查询创建和导入操作

    如何安装 xff1a https www cnblogs com bigbrotherer p 7241845 html 登录 xff1a mysql uroot p 输入密码 xff1a xxxx 显示当前数据库 xff1a show d
  • Typescript日期Date如何做格式化字符串

    使用一个date fns format的库 安装npm i date fns save import format from 39 date fns format 39 const newdate 61 new Date console l
  • C#匿名类型和动态解析减少定义传输类模板

    C 作为强类型语言 xff0c 在序列化和反序列化 xff08 json xff09 场景中对字符串解析常常需要定义强类型模板 xff0c 造成编码上的繁琐 其实可以使用匿名类型和动态解析减少json序列化时候的数据模板定义 xff1b s
  • Sourcetree 克隆代码,将git@打头路径,写入URL显示无效路径的处理

    情景 xff1a 刚安装完sourceTree 点击 43 xff0c 进行Clone项目 xff0c 输入 git 64 195 178 10 181 datas sys git路径 xff0c 提示 无效路径 信息 处理方法 xff1a
  • docker安装samba,网络硬盘

    安装好docker之后可以安装 dperson samba 使用下面的语句 xff0c 创建默认的用户 docker run it name samba p 139 139 p 445 445 v home ftpserver smb mo
  • Linux下执行可执行文件提示:No such file or directory的解决方法

    最近在Linux下安装交叉编译链工具 xff0c 解压完成后执行却提示 xff1a No such file or directory 查了一下发现我是64位的Ubuntu系统但是执行的是32位程序 xff0c 缺少32位lib库所以无法执
  • C语言typeof详解

    typeof 是 GNU C 标准里特有的扩展 xff0c 标准的 ISO C 并没有这个关键字 xff0c 所以在编译的时候不能加任何 ISO 的 C 标准选项 xff0c 否则会报错 使用时加入 std 61 gnu90 即 GNU 的
  • S5PV210-uboot解析(二)-start.S解析

    start S解析 首先是头文件包含 include lt config h gt include lt version h gt if defined CONFIG ENABLE MMU include lt asm proc domai