类似linux终端的行缓冲命令行
(1)行缓冲的意思就是:当我们向终端命令行输入命令的时候,这些命令没有立即被系统识别,而是被缓冲到一个缓存区(也就是系统认为我们还没有输入完),当我们按下回车键(换行)后系统就认为我们输入完了,然后将缓冲区中所有刚才输入的作为命令拿去分析处理。
(2)linux终端设计有3种缓冲机制:无缓冲、行缓冲、全缓冲
命令中的特殊符号(譬如单引号)
(1)uboot的有些命令带的参数非常长,为了告诉uboot这个非常长而且中间有好多个空格的东西是给他的一整个参数,所以用单引号将这个很长且中间有空格隔开的参数引起来。
(2)别的符号也许也有,而且有特定的意义。当碰到uboot的命令行有特殊符号时要注意不是弄错了,而是可能有特别的含义。
有些命令是一个命令族(譬如movi)
(1)命令族意思就是好多个命令开头都是用同一个命令关键字的,但是后面的参数不一样,这些命令的功能和作用也不同。这就叫一个命令族。
(2)同一个命令族中所有的命令都有极大的关联,譬如movi开头的命令族都和moviNand(EMMC、iNand)操作有关。
第一个命令:printenv/print
(1)print命令不用带参数,作用是打印出系统中所有的环境变量。
(2)环境变量就好像程序的全局变量一样。程序中任何地方都可以根据需要去调用或者更改环境变量(一般都是调用),环境变量和全局变量不同之处在于:全局变量的生命周期是在程序的一次运行当中,开始运行时诞生程序结束时死亡,下次运行程序时从头开始;但是环境变量被存储在Flash的另一块专门区域(Flash上有一个环境变量分区),一旦我们在程序中保存了该环境变量,那么下次开机时该环境变量的值将维持上一次更改保存后的值。
# print
arch=arm
baudrate=115200
board=ss928v100
board_name=ss928v100
bootargs=mem=1024M console=ttyAMA0,115200 clk_ignore_unused rw rootwait root=/dev/mmcblk0p3 rootfstype=ext4 blkdevparts=mmcblk0:1M(uboot),15M(kernel),63M(rootfs),1M(hwinfo),422M(app),512M(update),1024M(media),-(data)
bootcmd=emmcupdate;bootm 0x42000000
bootdelay=2
cpu=armv8
ethact=gmac0
soc=ss928v100
stderr=serial
stdin=serial
stdout=serial
vendor=vendor
verify=n
- arch=arm
:指定了架构为ARM。ARM是一种广泛使用的RISC(精简指令集计算机)架构,特别是在嵌入式系统和移动设备上。 - baudrate=115200
:设置了串行通信的波特率为115200。波特率是衡量数据传输速率的单位,115200波特意味着每秒可以传输115200比特的数据。 - board=ss928v100
和 board_name=ss928v100:这两行都指定了开发板的型号为SS928V100。这有助于系统识别并加载适用于该开发板的特定驱动程序或配置。 - bootargs=…
:这是一个很长的字符串,包含了传递给内核的启动参数。这些参数控制了内核的启动行为,包括内存大小、控制台设置(如串行端口和波特率)、分区布局、根文件系统类型和位置等。例如,mem=1024M指定了内存大小为1024MB,console=ttyAMA0,115200指定了控制台使用ttyAMA0串行端口和115200波特率,root=/dev/mmcblk0p3指定了根文件系统位于MMC(多媒体卡)的第三个分区上。 - bootcmd=emmcupdate;bootm 0x42000000
:指定了启动命令。emmcupdate可能是用于检查或更新EMMC(嵌入式多媒体卡)上固件的命令,而bootm 0x42000000指定了内核的启动地址。 - bootdelay=2
:设置了启动延迟时间为2秒。这允许用户在内核启动前按下某个键(如复位键)来中断启动过程并进入其他模式(如U-Boot命令行)。 - cpu=armv8
:指定了CPU类型为ARMv8,这是ARM架构的一个版本,支持64位操作,也向后兼容32位应用。 - ethact=gmac0
:指定了活动(或默认)的以太网接口为gmac0。gmac通常代表千兆媒体访问控制器,是一种高性能的网络接口。 - soc=ss928v100
:指定了系统芯片(SoC)的型号为SS928V100。SoC是一个集成了CPU、GPU、内存、外设等组件的单一芯片,是现代嵌入式系统和移动设备中常见的架构。 - stderr=serial
、stdin=serial、stdout=serial:这三行分别指定了标准错误、标准输入和标准输出的设备为串行端口。这意味着所有来自或发往控制台的数据都将通过串行端口传输。 - vendor=vendor
:这可能是一个占位符或默认值,用于指定供应商名称。在实际应用中,这里应该被替换为实际的供应商名称。 - verify=n
:这个参数的具体含义可能取决于使用的启动加载程序(如U-Boot)。在某些上下文中,它可能用于禁用某些验证步骤,如校验和的验证。然而,这里的n很可能意味着不执行验证(即,禁用验证)。 - ethact=gmac0
:指定了活动(或默认)的以太网接口为gmac0。gmac代表千兆媒体访问控制器,是一种高性能的网络接口。
设置(添加/更改)环境变量:setenv/set
(1)用法:set name value
保存环境变量的更改:saveenv/save
(1)saveenv/save命令不带参数,直接执行,作用是将内存中的环境变量的值同步保存到Flash中环境变量的分区。注意:环境变量的保存是整体的覆盖保存,也就是说内存中所有的环境变量都会整体的将Flash中环境变量分区中原来的内容整体覆盖。
网络测试指令:ping
(1)命令用法: ping ip地址
注意:ping是测试开发板和主机之间的网络链接,注意以下步骤:
1)首先要插上网线。
2)先试图ping通主机windows。注意Windows中有线网卡的地址设置(设置本地连接)。设置主机windows的本地连接IPv4地址为192.168.1.10
3)第三步确认开发板中uboot里几个网络相关的环境变量的值对不对。最重要的是ipaddr(这个环境变量表示当前开发板的IP地址),这个地址必须和主机windows的IP地址在同一个网段。
tftp下载指令:tftp
(1)uboot本身主要目标是启动内核,为了完成启动内核必须要能够部署内核,uboot为了部署内核就需要将内核镜像从主机中下载过来然后烧录到本地flash中。uboot如何从主机(windows或者虚拟机ubuntu)下载镜像到开发板上?有很多种方式,主流方式是:fastboot和tftp。
fastboot的方式是通过USB线进行数据传输。
tftp的方式是通过有线网络的。典型的方式就是通过网络,fastboot是近些年才新发展的。
(2)tftp方式下载时实际上uboot扮演的是tftp客户端程序角色,主机windows或虚拟机ubuntu中必须有一个tftp服务器,然后将要下载的镜像文件放在服务器的下载目录中,然后开发板中使用uboot的tftp命令去下载即可。
(3)有些人习惯在windows中搭建tftp服务器,一般是用一些软件来搭建(譬如tftpd32,使用起来比较简单);有些人习惯在linux下搭建tftp服务器,可以参考网盘中的虚拟机下载目录下的一个教程《嵌入式开发环境搭建-基于14.04.pdf》,这里面有ubuntu中搭建tftp服务器的教程,也可以自己上网搜索教程尝试。(如果你直接就用我的虚拟机,那就已经搭建好了,不用再搭建了;如果是自己新装的那就参考文档搭建;如果你的版本和我的不一样那搭建过程可能不一样)
(4)我的虚拟机搭建的时候设置的tftp下载目录是/tftpboot,将要被下载的镜像复制到这个目录下。
(5)检查开发板uboot的环境变量,注意serverip必须设置为虚拟机ubuntu的ip地址。(serverip这个环境变量的意义就是主机tftp服务器的ip地址)
(6)然后在开发板的uboot下先ping通虚拟机ubuntu,然后再尝试下载:tftp 0x30000000 zImage-qt(意思是将服务器上名为zImage-qt的文件下载到开发板内存的0x30000000地址处。)
(7)镜像下载到开发板的DDR中后,uboot就可以用movi指令进行镜像的烧写了。
注意:
1)如果你是用的windows下的tftp服务器,那uboot的serverip就要设置为和windwos下tftp服务器的ip地址一样(windows下的tftp服务器软件设置的时候就有个步骤是让你设置服务器的ip地址,这个ip地址和主机windows必须在一个网段)。
2)整个过程中间环节比较多,实际做的时候可能最后会下载不下来。这时候可能的问题非常多,不要问我,自己对照视频课程讲的思路来排查。(譬如:第一步应该先保证uboot和ubuntu可以ping通;第二步再保证ubuntu中tftp服务器搭建没错;第三步再实现tftp下载。如果第一步有问题参考网络设置部分,第二步有问题(tftp本地测试下载ok,但是开发板就是不行),有一个解决方案就是使用windows下的tftp服务器)
烧录相关配置:
setenv serverip 192.168.0.2
setenv ipaddr 192.168.0.123
setenv ethaddr 00:7B:D0:D0:D0:D0
setenv netmask 255.255.255.0
setenv gatewayip 192.168.0.1
1.setenv serverip 192.168.1.2
- 这条命令设置了服务器(通常指提供TFTP、NFS等服务的服务器)的IP地址为192.168.1.2。这个服务器将用于在启动过程中通过网络下载文件,如内核镜像、设备树等。
2.setenv ipaddr 192.168.1.123 - 这条命令设置了当前设备的IP地址为192.168.1.123。这是设备在网络中的唯一标识符,用于与其他设备(如服务器)进行通信。
3.setenv ethaddr 00:7B:D0:D0:D0:D0 - 这条命令设置了设备的以太网(Ethernet)MAC地址为00:7B:D0:D0:D0:D0。MAC地址是网络接口的唯一硬件标识符,用于在数据链路层进行通信。
4.setenv netmask 255.255.255.0 - 这条命令设置了网络掩码为255.255.255.0。网络掩码用于确定IP地址中哪些位代表网络部分,哪些位代表主机部分。这个掩码意味着网络部分占据了前24位(即前三个点分十进制数),剩下的8位用于主机编号。
5.setenv gatewayip 192.168.1.1 - 这条命令设置了默认网关的IP地址为192.168.1.1。默认网关是设备用于访问不同网络(例如,访问互联网)的出口点。所有发往非本地网络的数据包都会先被发送到默认网关。
DDR和EMMC了解
DDR(Double Data Rate)和eMMC(Embedded MultiMediaCard)在嵌入式系统和计算机系统中扮演着不同的角色,尽管它们都与数据存储和访问有关,但它们的本质和功能是有区别的。
1.DDR(Double Data Rate):
DDR实际上是一种内存技术,特别是针对随机访问存储器(RAM)的。DDR内存(如DDR3、DDR4等)是现代计算机和嵌入式系统中广泛使用的内存类型。它的主要特点是高速度和高带宽,允许CPU快速读取和写入数据。DDR内存是易失性的,意味着当电源关闭时,存储在其中的数据会丢失。
2.eMMC(Embedded MultiMediaCard):
eMMC是一种非易失性存储设备,类似于SSD(固态硬盘)的嵌入式版本。它结合了NAND闪存和闪存转换层(FTL),提供了一个类似于硬盘的接口,但具有更高的性能、更低的功耗和更小的尺寸。eMMC通常用于智能手机、平板电脑、嵌入式系统和某些类型的笔记本电脑中,作为长期存储解决方案。eMMC不是硬盘,而是固态存储设备的一种,但与传统的HDD(硬盘驱动器)相比,它更加轻便、抗震且节能。
简而言之,DDR是一种内存技术,用于快速读写数据,但数据在断电后会丢失;而eMMC是一种非易失性固态存储设备,用于长期存储数据,即使断电也不会丢失。在嵌入式系统和计算机系统中,DDR内存和eMMC(或其他类型的存储介质)通常会一起使用,以实现快速的数据处理和长期的数据存储。
SD卡/iNand操作指令movi
(1)开发板如果用SD卡/EMMC/iNand等作为Flash,则在uboot中操作flash的指令为movi(或mmc)
(2)movi指令是一个命令集,有很多子命令,具体用法可以help movi查看。
(3)movi的指令都是movi read和movi write一组的,movi read用来读取iNand到DDR上,movi write用来将DDR中的内容写入iNand中。理解这些指令时一定要注意涉及到的2个硬件:iNand和DDR内存。
(4)movi read {u-boot | kernel} {addr} 这个命令使用了一种通用型的描述方法来描述:movi 和 read外面没有任何标记说明每一次使用这个指令都是必选的;一对大括号{}括起来的部分必选1个,大括号中的竖线表是多选一。中括号[]表示可选参数(可以有也可以没有)
(5)指令有多种用法,譬如 movi read u-boot 0x30000000,意思就是把iNand中的u-boot分区读出到DDR的0x30000000起始的位置处。(uboot代码中将iNand分成了很多个分区,每个分区有地址范围和分区名,uboot程序操作中可以使用直接地址来操作iNand分区,也可以使用分区名来操作分区。);注意这里的0x30000000也可以直接写作30000000,意思是一样的(uboot的命令行中所有数字都被默认当作十六进制处理,不管你加不加0x都一样)。
# help mmc
mmc - MMC sub system
Usage:
mmc info - display info of the current MMC device
mmc reg [dev] - display register of the current MMC device
mmc read dev addr blk# cnt
mmc write dev addr blk# cnt
mmc erase blk# cnt
mmc rescan
mmc part - lists available partition on current mmc device
mmc dev [dev] [part] - show or set current mmc device [partition]
mmc list - lists available devices
mmc hwpartition [args...] - does hardware partitioning
arguments (sizes in 512-byte blocks):
[user [enh start cnt] [wrrel {on|off}]] - sets user data area attributes
[gp1|gp2|gp3|gp4 cnt [enh] [wrrel {on|off}]] - general purpose partition
[check|set|complete] - mode, complete set partitioning completed
WARNING: Partitioning is a write-once setting once it is set to complete.
Power cycling is required to initialize partitions after set to complete.
mmc bootbus dev boot_bus_width reset_boot_bus_width boot_mode
- Set the BOOT_BUS_WIDTH field of the specified device
mmc bootpart-resize <dev> <boot part size MB> <RPMB part size MB>
- Change sizes of boot and RPMB partitions of specified device
mmc partconf dev [boot_ack boot_partition partition_access]
- Show or change the bits of the PARTITION_CONFIG field of the specified device
mmc rst-function dev value
- Change the RST_n_FUNCTION field of the specified device
WARNING: This is a write-once field and 0 / 1 / 2 are the only valid values.
mmc setdsr <value> - set DSR register value
help mmc
mmc - MMC sub system
Usage:
mmc info - display info of the current MMC device
mmc reg [dev] - display register of the current MMC device
mmc read dev addr blk# cnt
mmc write dev addr blk# cnt
mmc erase blk# cnt
mmc rescan
mmc part - lists available partition on current mmc device
mmc dev [dev] [part] - show or set current mmc device [partition]
mmc list - lists available devices
mmc hwpartition [args…] - does hardware partitioning
arguments (sizes in 512-byte blocks):
[user [enh start cnt] [wrrel {on|off}]] - sets user data area attributes
[gp1|gp2|gp3|gp4 cnt [enh] [wrrel {on|off}]] - general purpose partition
[check|set|complete] - mode, complete set partitioning completed
WARNING: Partitioning is a write-once setting once it is set to complete.
Power cycling is required to initialize partitions after set to complete.
mmc bootbus dev boot_bus_width reset_boot_bus_width boot_mode
- Set the BOOT_BUS_WIDTH field of the specified device
mmc bootpart-resize - Change sizes of boot and RPMB partitions of specified device
mmc partconf dev [boot_ack boot_partition partition_access] - Show or change the bits of the PARTITION_CONFIG field of the specified device
mmc rst-function dev value - Change the RST_n_FUNCTION field of the specified device
WARNING: This is a write-once field and 0 / 1 / 2 are the only valid values.
mmc setdsr - set DSR register value
# mmc info
Device: bsp-sdhci
Manufacturer ID: 2c
OEM: 10e
Name: SBS3S
Bus Speed: 200000000
Mode: HS400 (200MHz)
Rd Block Len: 512
MMC version 5.1
High Capacity: Yes
Capacity: 7650410496
Bus Width: 8-bit DDR
Erase Group Size: 512 KiB
HC WP Group Size: 8 MiB
User Capacity: 7.1 GiB WRREL
Boot Capacity: 4 MiB ENH
RPMB Capacity: 4 MiB ENH
- Device: bsp-sdhci
:这表示MMC设备是通过名为bsp-sdhci的SDHCI(Secure Digital Host Controller Interface)接口连接的。SDHCI是一种用于SD卡和MMC卡的硬件接口标准。 - Manufacturer ID: 2c
:这是制造商的ID,2c是一个十六进制值,用于标识生产该MMC卡的制造商。不同的制造商有不同的ID。 - OEM: 10e
:OEM(原始设备制造商)ID,10e是另一个十六进制值,用于进一步标识或区分制造商的特定产品线或产品。 - Name: SBS3S
:这是MMC卡的名称或型号,SBS3S可能是制造商为该型号指定的标识符。 - Bus Speed: 200000000
:表示MMC卡与主机之间的总线速度为200MHz。 - Mode: HS400 (200MHz)
:HS400是MMC卡的一种高速模式,支持高达200MHz的数据传输速率,并且使用8位数据总线(在DDR模式下,实际数据传输速率加倍)。 - Rd Block Len: 512
:读取块长度为512字节,这是MMC卡进行数据传输时的一个基本单位。 - MMC version 5.1
:表示该MMC卡遵循MMC 5.1标准。 - High Capacity: Yes
:表示这是一张高容量MMC卡。 - Capacity: 7650410496
:这是MMC卡的原始容量,以字节为单位。转换为更常见的单位,大约是7.1GB(注意,由于文件系统和其他开销,用户可用的空间会少于这个值)。 - Bus Width: 8-bit DDR
:表示MMC卡使用8位数据总线,并且支持DDR(双倍数据速率)模式,这可以加倍数据传输速率。 - Erase Group Size: 512 KiB
:擦除组大小为512KiB,这是MMC卡进行擦除操作时的最小单位。 - HC WP Group Size: 8 MiB
:高容量写保护组大小为8MiB,这可能与写保护或安全功能相关。 - User Capacity: 7.1 GiB WRREL
:用户可用的容量为7.1GiB,WRREL可能是一个特定于制造商或产品的术语,但通常指的是某种形式的可靠写入容量。 - Boot Capacity: 4 MiB ENH
:表示MMC卡有一个增强的4MiB启动区域,用于存储启动代码或数据。 - RPMB Capacity: 4 MiB ENH
:RPMB(Replay Protected Memory Block)是一个安全存储区域,用于存储敏感数据,如密钥或加密数据。这里的4MiB ENH表示这个区域的大小为4MiB,并且具有增强的安全特性。
### 配置bootarg
setenv bootcmd 'mmc read 0 0x50000000 0x800 0x6000; bootm 0x50000000'
setenv bootargs 'mem=1024M console=ttyAMA0,115200 clk_ignore_unused rw rootwait root=/dev/mmcblk0p3 rootfstype=ext4 blkdevparts=mmcblk0:1M(uboot),15M(kernel),95M(rootfs),1M(version),1024M(update),1024M(app),-(data)'
sa
### 烧录内核
mw.b 0x42000000 0xff 0xf00000;tftp 0x42000000 uImage;mmc write 0 0x42000000 0x800 0x7800
### 烧录文件系统 95M
mw.b 0x42000000 0xff 0x6000000;tftp 0x42000000 rootfs.ext4;mmc write 0 0x42000000 0x8000 0x2F800
//烧录App 150M
mw.b 0x42000000 0xff 0x9600000;tftp 0x42000000 app.bin;mmc write 0 0x42000000 0x238000 0x4B000
mmc read 0 0x50000000 0x800 0x6000
mmc:指定命令是针对MMC设备的。
- read:指示这是一个读取操作。
- 0:这通常表示MMC设备的编号,如果你的系统中有多个MMC设备,这个数字可以用来指定哪一个。在很多情况下,如果只有一个MMC设备,这个数字就是0。
- 0x50000000:这是目标地址,即数据将被读取到的内存或地址空间的起始地址。在这个例子中,它是一个32位的十六进制数,表示一个相对较高的物理地址(这取决于系统的内存映射)。
- 0x800:这是MMC设备上的起始块地址(或扇区地址,具体取决于上下文)。MMC设备通常以块或扇区为单位进行读写操作,这个地址指定了从哪个块开始读取数据。
- 0x6000:这是要读取的块数或扇区数。在这个例子中,0x6000等于十进制的24576,意味着从指定的起始块开始,读取24576个块(或扇区)的数据。
配置bootarg - 设置启动命令 (
bootcmd): 这条命令定义了设备如何启动。在这个例子中,它首先使用mmc read命令从MMC的某个地址(0x50000000)读取启动代码(可能是U-Boot或其他引导加载程序),然后使用bootm命令跳转到该地址执行。 - 设置启动参数 (
bootargs): 这些参数用于内核启动时配置其行为。包括内存大小(mem=1024M),控制台设置(console=ttyAMA0,115200),忽略未使用的时钟(clk_ignore_unused),以及其他与根文件系统、分区等相关的参数。blkdevparts参数定义了MMC设备的分区布局。
烧录内核 - 擦除内存区域
: 使用mw.b 0x42000000 0xff 0xf00000命令将内存地址0x42000000开始的0xf00000(即15MB)区域填充为0xff(擦除或清零)。这是为了准备足够的空间来存放即将通过TFTP下载的U-Boot或内核镜像。 - 通过TFTP下载内核
: 使用tftp 0x42000000 uImage命令从TFTP服务器下载uImage(内核镜像)到内存地址0x42000000。 - 烧录内核到MMC
: 使用mmc write 0 0x42000000 0x800 0x7800命令将内存中的内核镜像(从0x42000000开始)写入到MMC的0x800地址,写入大小为0x7800(即30KB)。这里可能是一个简化的例子,因为内核镜像通常远大于30KB。实际使用时,可能需要根据内核镜像的实际大小调整写入大小。
烧录文件系统 - 擦除内存和下载文件系统
: 类似地,首先擦除内存区域,然后通过TFTP下载文件系统镜像(rootfs.ext4)到内存。 - 烧录文件系统到MMC
: 将文件系统镜像写入MMC的指定位置。在这个例子中,文件系统被写入到MMC的0x8000地址,大小为0x2F800(即190KB)。然而,对于一个95MB的文件系统来说,这个大小显然是不正确的。实际使用时,应该根据文件系统镜像的实际大小来设置写入大小。
烧录App - 擦除内存和下载App
: 再次擦除内存区域,并通过TFTP下载应用程序(app.bin)。 - 烧录App到MMC
: 将App烧录到MMC的0x238000地址,大小为0x4B000(即约300KB)。对于一个150MB的应用程序来说,这个大小同样是不正确的。这里需要根据app.bin的实际大小来调整写入大小。
mw.b 0x42000000 0xff 0xf00000
- mw.b
:这是“memory write byte”的缩写,意味着这是一个内存写入命令,并且是以字节(byte)为单位进行写入的。不过,具体的命令格式可能因不同的固件或引导加载程序而异;mw.b并不是所有环境都通用的命令,但它在这里用于说明目的。在一些环境中,可能使用类似的命令如mw或memset,并且可能需要额外的参数来指定写入的数据类型(如字节、半字、字等)。但是,基于你的命令格式,我们假设mw.b是意图以字节为单位进行写入。 - 0x42000000
:这是目标内存地址的起始点,即写入操作将从这个地址开始。这是一个32位的十六进制数,指向内存中的一个特定位置。 - 0xff
:这是要写入的数据。在这个例子中,0xff是十六进制表示法,等于十进制的255,意味着每个被写入的字节都将被设置为255(或者说,所有位都被设置为1)。 - 0xf00000
:这是写入操作要覆盖的内存区域的大小(以字节为单位)。0xf00000是十六进制表示法,等于十进制的15728640字节,即约15MB。
# help mw
mw - memory write (fill)
Usage:
mw [.b, .w, .l, .q] address value [count]
- [.b, .w, .l, .q]
:这是可选的前缀,用于指定写入数据的大小。 - .b 表示字节(Byte),即8位。
- .w 表示半字(Word),在大多数架构中通常是16位(但在某些架构中可能是其他大小,具体取决于架构)。
- .l 表示字(Long word),通常是32位。
- .q 表示四字(Quad word),通常是64位。
如果省略这个前缀,则默认的数据大小可能取决于你的固件或引导加载程序的实现。 - address
:要写入的内存地址的起始点。这是一个十六进制数(通常),指向你想要开始写入数据的内存位置。 - value
:要写入的数据值。这个值也是十六进制数(通常),表示要写入内存的数据。根据数据大小前缀(如果有的话),这个值将被解释为相应大小的数值。 - [count]
:这是一个可选参数,表示要写入的值的重复次数。如果指定了这个参数,那么从指定的地址开始,将连续写入count个相同的value值。如果省略这个参数,则可能只写入一个值(具体取决于实现)。
内存操作指令:mm、mw、md
(1)DDR中是没有分区的(只听说过对硬盘、Flash进行分区,没听说过对内存进行分区····),但是内存使用时要注意,千万不能越界踩到别人了。因为uboot是一个裸机程序,不像操作系统会由系统整体管理所有内存,系统负责分配和管理,系统会保证内存不会随便越界。然后裸机程序中uboot并不管理所有内存,内存是散的随便用的,所以如果程序员(使用uboot的人)自己不注意就可能出现自己把自己的数据给覆盖了。(所以你思考下我们为什么把uboot放在23E00000地址处)
(2)md就是memory display,用来显示内存中的内容。
(3)mw就是memory write,将内容写到内存中
(4)mm就是memory modify,修改内存中的某一块,说白了还是写内存(如果需要批量的逐个单元的修改内存,用mm最合适)
启动内核指令:bootm、go
(1)uboot的终极目标就是启动内核,启动内核在uboot中表现为一个指令,uboot命令行中调用这个指令就会启动内核(不管成功与否,所以这个指令是一条死路)。
(2)差别:bootm启动内核同时给内核传参,而go命令启动内核不传参。bootm其实才是正宗的启动内核的命令,一般情况下都用这个;go命令本来不是专为启动内核设计的,go命令内部其实就是一个函数指针指向一个内存地址然后直接调用那个函数,go命令的实质就是PC直接跳转到一个内存地址去运行而已。go命令可以用来在uboot中执行任何的裸机程序(有一种调试裸机程序的方法就是事先启动uboot,然后在uboot中去下载裸机程序,用go命令去执行裸机程序)
学习记录,侵权联系删除。
来源:朱老师物联网大课堂