x210开发板的BSP(其中使用buildroot文件夹建立rootfs)

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

参考博客:buildroot详解和分析_Alex-wu的博客-CSDN博客_buildroot

板级支持包(BSP,Board Support Package),是由引导程序(Bootload)、内核(  Kernel)、根文件系统(Rootfs)、工具链(Toolchain)等软件组成的资源包。x210开发板的BSP:下载地址

一、BSP的整体介绍

1、嵌入式linux产品的BSP介绍

芯片厂家或板卡厂家在交付时会提供BSP。

ARM+linux形式的BSP,其内容和结构都是相似的。

2、X210的linux+QT bsp整体介绍

文件或文件夹       描述
tslib_x210_qtopia.tgz用来支持QT的触摸屏操作的应用层库
xboot和uboot文件夹X210支持的2个bootloader源代码
kernel文件夹内核源代码
buildroot文件夹用来构建根文件系统的文件夹
tools文件夹一些有用工具
mk文件用来管理和编译整个bsp

二、mk文件

1、mk文件的内容

#!/bin/sh
#
# Description	: Build Qt Script.
# Authors		: jianjun jiang - jerryjianjun@gmail.com
# Version		: 0.01
# Notes			: None
#CPU_NUM=$(cat /proc/cpuinfo |grep processor|wc -l)
CPU_NUM=$((CPU_NUM+1))SOURCE_DIR=$(cd `dirname $0` ; pwd)RELEASE_DIR=${SOURCE_DIR}/release/
BOOTLOADER_XBOOT_CONFIG=arm32-x210ii
QT_KERNEL_CONFIG=x210ii_qt_defconfig
INITRD_KERNEL_CONFIG=x210ii_initrd_defconfig
BUILDROOT_CONFIG=x210_defconfigsetup_environment()
{cd ${SOURCE_DIR};mkdir -p ${RELEASE_DIR} || return 1;
}build_bootloader_xboot()
{if [ ! -f ${RELEASE_DIR}/zImage-initrd ]; thenecho "not found kernel zImage-initrd, please build kernel first" >&2return 1fiif [ ! -f ${RELEASE_DIR}/zImage-qt ]; thenecho "not found kernel zImage-qt, please build kernel first" >&2return 1fi# copy zImage-initrd and zImage-qt to xboot's romdisk directorycp -v ${RELEASE_DIR}/zImage-initrd ${SOURCE_DIR}/xboot/src/arch/arm32/mach-x210ii/romdisk/boot || return 1;cp -v ${RELEASE_DIR}/zImage-qt ${SOURCE_DIR}/xboot/src/arch/arm32/mach-x210ii/romdisk/boot || return 1;# compiler xbootcd ${SOURCE_DIR}/xboot || return 1make TARGET=${BOOTLOADER_XBOOT_CONFIG} CROSS=/usr/local/arm/arm-2012.09/bin/arm-none-eabi- clean || return 1;make TARGET=${BOOTLOADER_XBOOT_CONFIG} CROSS=/usr/local/arm/arm-2012.09/bin/arm-none-eabi- || return 1;# rm zImage-initrd and zImage-qtrm -fr ${SOURCE_DIR}/xboot/src/arch/arm32/mach-x210ii/romdisk/boot/zImage-initrdrm -fr ${SOURCE_DIR}/xboot/src/arch/arm32/mach-x210ii/romdisk/boot/zImage-qt# copy xboot.bin to release directorycp -v ${SOURCE_DIR}/xboot/output/xboot.bin ${RELEASE_DIR}echo "" >&2echo "^_^ xboot path: ${RELEASE_DIR}/xboot.bin" >&2return 0
}build_bootloader_uboot_nand()
{cd ${SOURCE_DIR}/uboot || return 1make distcleanmake x210_nand_configmake -j${CPU_NUM}mv u-boot.bin uboot_nand.binif [ -f uboot_nand.bin ]; thencp uboot_nand.bin ${RELEASE_DIR}/uboot.bincd ${RELEASE_DIR}${SOURCE_DIR}/tools/mkheader uboot.binecho "^_^ uboot_nand.bin is finished successful!"exitelseecho "make error,cann't compile u-boot.bin!"exitfi
}build_bootloader_uboot_inand()
{cd ${SOURCE_DIR}/uboot || return 1make distcleanmake x210_sd_configmake -j${CPU_NUM}mv u-boot.bin uboot_inand.binif [ -f uboot_inand.bin ]; then cp uboot_inand.bin ${RELEASE_DIR}/uboot.bincd ${RELEASE_DIR}${SOURCE_DIR}/tools/mkheader uboot.binecho "^_^ uboot_inand.bin is finished successful!"exitelseecho "make error,cann't compile u-boot.bin!"exitfi
}build_kernel()
{cd ${SOURCE_DIR}/kernel || return 1# make ${INITRD_KERNEL_CONFIG} || return 1# make -j${threads} || return 1# dd if=${SOURCE_DIR}/kernel/arch/arm/boot/zImage of=${RELEASE_DIR}/zImage-initrd bs=2048 count=8192 conv=sync;make ${QT_KERNEL_CONFIG} || return 1make -j${threads} || return 1dd if=${SOURCE_DIR}/kernel/arch/arm/boot/zImage of=${RELEASE_DIR}/zImage-qt bs=2048 count=8192 conv=sync;echo "" >&2# echo "^_^ initrd kernel path: ${RELEASE_DIR}/zImage-initrd" >&2echo "^_^ qt kernel path: ${RELEASE_DIR}/zImage-qt" >&2return 0
}build_rootfs()
{cd ${SOURCE_DIR}/buildroot || return 1make ${BUILDROOT_CONFIG} || return 1make || return 1# copy rootfs.tar to release directorycp -v ${SOURCE_DIR}/buildroot/output/images/rootfs.tar ${RELEASE_DIR} || { return 1; }
}# must root user
gen_qt_rootfs_ext3()
{if [ ! -f ${RELEASE_DIR}/rootfs.tar ]; thenecho "not found rootfs.tar, please build rootfs" >&2return 1fiecho "making ext3 qt4.8 rootfs now,wait a moment..."cd ${RELEASE_DIR}rm -rf rootfsmkdir -p rootfstar xf rootfs.tar -C rootfsrm rootfs_qt4.ext3rm -rf rootfs_imgmkdir -p rootfs_imgdd if=/dev/zero of=rootfs_qt4.ext3 bs=1024 count=262144mkfs.ext3 rootfs_qt4.ext3mount -o loop rootfs_qt4.ext3 ./rootfs_imgcp ./rootfs/* ./rootfs_img -arumount ./rootfs_imgecho "^_^ make rootfs_qt4.ext3 successful!"
}# must root user
gen_qt_rootfs_jffs2()
{if [ ! -f ${RELEASE_DIR}/rootfs.tar ]; thenecho "not found rootfs.tar, please build rootfs" >&2return 1fiecho "making jffs2 qt4.8 rootfs now,wait a moment..."cd ${RELEASE_DIR}rm -rf rootfsmkdir -p rootfstar xf rootfs.tar -C rootfs[ -e "rootfs" ] ||{ echo "error!can't find rootfs dir"; exit;}mkfs.jffs2 -r rootfs -o rootfs_qt4.jffs2 -e 0x20000 -s 0x800 --pad=0x5000000 -necho "^_^ make rootfs_qt4.jffs2 successful!"
}gen_qt_update_bin()
{# check image filesif [ ! -f ${RELEASE_DIR}/xboot.bin ]; thenecho "not found bootloader xboot.bin, please build bootloader" >&2return 1fiif [ ! -f ${RELEASE_DIR}/zImage-initrd ]; thenecho "not found kernel zImage-initrd, please build kernel first" >&2return 1fiif [ ! -f ${RELEASE_DIR}/zImage-qt ]; thenecho "not found kernel zImage-qt, please build kernel first" >&2return 1fiif [ ! -f ${RELEASE_DIR}/rootfs.tar ]; thenecho "not found rootfs.tar, please build rootfs" >&2return 1firm -fr ${RELEASE_DIR}/tmp || return 1;rm -fr ${RELEASE_DIR}/qt-update.bin || return 1;mkdir -p ${RELEASE_DIR}/tmp || return 1;# copy image filescp ${RELEASE_DIR}/xboot.bin ${RELEASE_DIR}/tmp/;cp ${RELEASE_DIR}/zImage-initrd ${RELEASE_DIR}/tmp/;cp ${RELEASE_DIR}/zImage-qt ${RELEASE_DIR}/tmp/;cp ${RELEASE_DIR}/rootfs.tar ${RELEASE_DIR}/tmp/;# create md5sum.txtcd ${RELEASE_DIR}/tmp/;find . -type f -print | while read line; doif [ $line != 0 ]; thenmd5sum ${line} >> md5sum.txtfidone# mkisofsmkisofs -l -r -o ${RELEASE_DIR}/qt-update.bin ${RELEASE_DIR}/tmp/ || return 1;cd ${SOURCE_DIR} || return 1 rm -fr ${RELEASE_DIR}/tmp || return 1;return 0;
}threads=4;
xboot=no;
uboot_inand=no;
uboot_nand=no;
kernel=no;
rootfs=no;
rootfs_ext3=no;
rootfs_jffs2=no;
update=no;if [ -z $1 ]; thenxboot=yesuboot_inand=no;uboot_nand=no;kernel=yesrootfs=yesrootfs_ext3=no;rootfs_jffs2=no;update=yes
fiwhile [ "$1" ]; docase "$1" in-j=*)x=$1threads=${x#-j=};;-x|--xboot)xboot=yes;;-ui|--uboot_inand)uboot_inand=yes;;-un|--uboot_nand)uboot_nand=yes;;-k|--kernel)kernel=yes;;-r|--rootfs)rootfs=yes;;-re|--rootfs_ext3)rootfs_ext3=yes;;-rj|--rootfs_jffs2)rootfs_jffs2=yes;;-U|--update)update=yes;;-a|--all)xboot=yeskernel=yesrootfs=yesupdate=yes;;-h|--help)cat >&2 <<EOF
Usage: mk [OPTION]
Build script for compile the source of telechips project.-j=n                 using n threads when building source project (example: -j=16)-x, --xboot          build bootloader xboot from source file-ui,--uboot_inand    build uboot for emmc-un,--uboot_nand     build uboot for nand flash-k, --kernel         build kernel from source file and using default config file-r, --rootfs         build root file system-re,--rootfs_ext3    build rootfs for emmc,used with uboot-rj,--rootfs_jffs2   build rootfs for nand,used with uboot-U, --update         gen update package update.bin,used with xboot-a, --all            build all, include anything-h, --help           display this help and exit
EOFexit 0;;*)echo "build.sh: Unrecognised option $1" >&2exit 1;;esacshift
donesetup_environment || exit 1if [ "${kernel}" = yes ]; thenbuild_kernel || exit 1
fiif [ "${xboot}" = yes ]; thenbuild_bootloader_xboot || exit 1
fiif [ "${uboot_inand}" = yes ]; thenbuild_bootloader_uboot_inand || exit 1
fiif [ "${uboot_nand}" = yes ]; thenbuild_bootloader_uboot_nand || exit 1
fiif [ "${rootfs}" = yes ]; thenbuild_rootfs || exit 1
fiif [ "${rootfs_ext3}" = yes ]; thengen_qt_rootfs_ext3 || exit 1
fiif [ "${rootfs_jffs2}" = yes ]; thengen_qt_rootfs_jffs2 || exit 1
fiif [ "${update}" = yes ]; thengen_qt_update_bin || exit 1
fiexit 0

2、mk文件的作用

mk脚本主要用来指导编译。BSP可以完整编译,也可以通过参数来指定想要编译的内容。

命令描述
mk -a编译所有的bsp源代码
mk -x只编译xboot
mk -ui只编译uboot针对inand版本开发板的源代码
mk -r只编译buildroot,得到文件夹形式的rootfs
mk -re编译buildroot并且制作得到ext3格式的rootfs镜像
mk -rj编译buildroot并且制作得到jffs2格式的rootfs镜像
mk -h查看mk的帮助信息

2、如何选择性地编译

用一个函数来完成某块内容的编译。比如编译内核用build_kernel函数,编译inand版本的uboot用build_bootloader_uboot_inand。

然后用相应的一些变量来控制这个函数要不要被编译。比如uboot_inand变量=yes,则表示要编译inand版本的uboot,=no则表示不编译。

编译时通过“./mk -xxx”来传参时,这些传参会影响这些变量的值=yes或者=no。

如果直接./mk并不传参,则$1为空,这时候按照一套默认的配置来编译。

三、buildroot文件夹

1、buildroot的作用

buildroot是一个集成包,集成了制作交叉编译工具链、构建rootfs等功能。

之前的交叉编译工具链arm-linux-gcc,都是从soc官方直接拿来使用的,但官方的工具链从何而来?实际上交叉编译工具链都是由gcc配置编译生成的。

在构建根文件系统中介绍了从零开始构建根文件系统,但是步骤麻烦。使用buildroot可以很简便的得到一个做好的文件夹形式的根文件系统。

buildroot移植了kernel的make xxx_defconfig、make menuconfig的2步配置法。在buildroot的配置界面下完成配置,然后直接make,最终可以得到文件夹形式的rootfs。

2、buildroot的目录

├── arch:   存放CPU架构相关的配置脚本,如arm/mips/x86,这些CPU相关的配置,在制作工具链时,编译uboot和kernel时很关键.
├── board   存放了一些默认开发板的配置补丁之类的
├── boot
├── CHANGES
├── Config.in
├── Config.in.legacy
├── configs:  放置开发板的一些配置参数. 
├── COPYING
├── DEVELOPERS
├── dl:       存放下载的源代码及应用软件的压缩包. 
├── docs:     存放相关的参考文档. 
├── fs:       放各种文件系统的源代码. 
├── linux:    存放着Linux kernel的自动构建脚本. 
├── Makefile
├── Makefile.legacy
├── output: 是编译出来的输出文件夹. 
│   ├── build: 存放解压后的各种软件包编译完成后的现场.
│   ├── host: 存放着制作好的编译工具链,如gcc、arm-linux-gcc等工具.
│   ├── images: 存放着编译好的uboot.bin, zImage, rootfs等镜像文件,可烧写到板子里, 让linux系统跑起来.
│   ├── staging
│   └── target: 用来制作rootfs文件系统,里面放着Linux系统基本的目录结构,以及编译好的应用库和bin可执行文件. (buildroot根据用户配置把.ko .so .bin文件安装到对应的目录下去,根据用户的配置安装指定位置)
├── package:下面放着应用软件的配置文件,每个应用软件的配置文件有Config.in和soft_name.mk,其中soft_name.mk(这种其实就Makefile脚本的自动构建脚本)文件可以去下载应用软件的包。
├── README
├── support
├── system
└── toolchain

3、配置与编译过程

配置编译

(1)make x210_defconfig

root@ubuntu:/home/xjh/iot/embedded_basic/bsp/buildroot/configs# ls
x210_defconfig        //由这里可以知道是make x210_defconfigroot@ubuntu:/home/xjh/iot/embedded_basic/bsp/buildroot# ls
arch   CHANGES           configs  docs   Makefile         package    system
board  Config.in         COPYING  fs     Makefile.legacy  S99qttest  toolchain
boot   Config.in.legacy  dl       linux  output           support
root@ubuntu:/home/xjh/iot/embedded_basic/bsp/buildroot# make x210_defconfig
//省略部分内容
#
# configuration written to /home/xjh/iot/embedded_basic/bsp/buildroot/.config
#
root@ubuntu:/home/xjh/iot/embedded_basic/bsp/buildroot# 

(2)make menuconfig

因为移植的时候已经配置好了,这个步骤可以省略。

(3)make

编译出错

直接make会遇到很多错误,这些错误原因都是因为ubuntu中缺乏一些必要软件包造成的。

解决方案是先安装这些必要的软件包。

编译过程会需要从网上下载一些软件包,因此整个编译过程需要在联网状态下进行

You must install 'bison' on your build machine
//sudo apt-get bisonYou must install 'flex' on your build machine
//sudo apt-get flexYou must install 'makeinfo' on your build machine
makeinfo is usually part of the texinfo package in your distribution
//sudo apt-get install makeinfo
//sudo apt-get install texinfoYou must install 'git' on your build machine
//sudo apt-get install gitYou must install 'hg' on your build machine
//sudo apt-get install hg
E: 无法定位软件包 hg
//sudo apt-get install hgsubversion //这个是由“apt-cache search hg”查询得知的You need the 'mkpasswd' utility to set the root password
(in Debian/ubuntu, 'mkpasswd' provided by the whois package)
//sudo apt-get install whois

编译结果

编译生成的文件夹格式的rootfs,位于buildroot/output/images/rootfs.tar。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461667.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android中Activity启动模式详解

在Android中每个界面都是一个Activity&#xff0c;切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity的启动模式决定了Activity的启动运行方式。 Android总Activity的启动模式分为四种&#xff1a; Activity启动模式设置&#xff1a; <activity and…

EDM的九大用途盘点

对于什么是EDM&#xff0c;前面博主的博文已经有所介绍。那么&#xff0c;EDM的九大用途是什么呢&#xff1f;本文博主就为大家介绍一下。 交叉营销交叉营销是通过把时间&#xff0c;金钱、构想、活动或演示空间等资源整合&#xff0c;为任何企业&#xff0c;包括家庭式小企业、…

分析根文件系统中的/etc/inittab文件

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 1、文件简介 &#xff08;1&#xff09;/etc/inittab文件属于运行时配置文件。 &#xff08;2&#xff09;这个文件是文本格式的&#xff0c;即内容由一系列遵照某格式的字符组成。 &#xff08;3&…

MySQL导入.sql文件及常用命令

MySQL导入.sql文件及常用命令 在MySQL Qurey Brower中直接导入*.sql脚本&#xff0c;是不能一次执行多条sql命令的&#xff0c;在mysql中执行sql文件的命令&#xff1a; mysql> source d:/myprogram/database/db.sql; 另附mysql常用命令&#xff1a; 一) 连接MYSQL&…

第一次软工作业展示——潘学

第一次软工作业完成啦&#xff01; 回首这个作业的完成过程&#xff0c;我是很有收获。这个作业有几个难点&#xff1a;1、在给定目录下读取TXT文件的内容&#xff1b;2、从读到的内容中分析出单词&#xff1b;3、统计单词的出现频率并输出。 我之前只学习过C和java&#xff0c…

【0802 | Day 7】Python进阶(一)

目 录 数字类型的内置方法 一、整型内置方法&#xff08;int&#xff09; 二、浮点型内置方法&#xff08;float&#xff09; 字符串类型内置方法 一、字符串类型内置方法&#xff08;str&#xff09; 二、常用操作和内置方法 优先掌握&#xff1a; 1.索引取值 2.切片 3.长度le…

bzoj 1084 DP

首先对于m1的情况非常容易处理&#xff08;其实这儿因为边界我错了好久。。。&#xff09;&#xff0c;直接DP就好了&#xff0c;设f[i][k]为这个矩阵前i个选k个矩阵的最大和&#xff0c;那么f[i][k]max(f[j][k-1]sum[j1][i])&#xff0c;那么对于m2的时候类似与m1的时候&#…

uboot源码——命令体系

以下内容源于朱有鹏嵌入式课程的学习&#xff0c;如有侵权&#xff0c;请告知删除。 参考资料&#xff1a;http://www.cnblogs.com/biaohc/p/6394710.html 一、uboot命令体系基础 1、使用uboot命令 uboot启动后进入命令行环境&#xff0c;在此输入命令按回车结束&#xff0…

RCP:如何移除Toolbar中的Quick Access

问题 自4.x开始&#xff0c;Quick Access搜索框成为Toolbar的“标准装备”&#xff0c;一般删除Actionset的方式似乎不起作用&#xff0c;通过Quick Access&#xff0c;用户很容易访问到RCP程序本来想隐藏的功能。 解决方法 在WorkbenchWindowAdvisor的openIntro中加入以下代码…

XMPP文件传输(XEP-0096协议说明)

XMPP XEP-0096协议是XMPP中的文件传输协议。 关于文件传输&#xff0c;在xmpp协议中有不少协议可以实现&#xff0c;而XEP-0096协议是其中非常简单的一个协议。由于邮件被删&#xff0c;我的代码demo丢失&#xff0c;因此只能在这里给大家讲一下其中的逻辑实现&#xff0…

[笔记]VI编辑器的学习

来源&#xff1a;http://team.youthol.cn/?p453 2013-03-22 09:20:00 在Vim中利用替换功能就可以将“^M”都删掉&#xff0c;键入如下替换命令行&#xff1a;:% s/\r//g 就可以类似的“&#xff5c;&#xff5c;”都删掉&#xff0c;键入如下替换命令行&#xff1a;%s/Tab键…

uboot源码——环境变量

以下内容源于朱有鹏嵌入式课程的学习&#xff0c;如有侵权&#xff0c;请告知删除。 参考资料&#xff1a;http://www.cnblogs.com/biaohc/p/6398515.html。 一、uboot的环境变量基础 1、环境变量的作用 在不改变源码、不用重新编译的情况下&#xff0c;可以通过设置环境变量…

Linq To Sql进阶系列 -目录导航

博客园CLR基础研究团队|CLR团队精品系列|C# 3.0专题 [Linq To Sql进阶系列] 目录导航 1 Linq To Sql进阶系列&#xff08;一&#xff09;-从映射讲起 本系列&#xff0c;或多或少&#xff0c;直接或间接依赖入门系列知识。但&#xff0c;依然追求独立成章。因本文作者水平有限&…

uboot源码——mmc驱动分析

以下内容源于朱有鹏《物联网大讲坛》课程的学习&#xff0c;以及博客http://www.cnblogs.com/biaohc/p/6409197.html的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 一、uboot与linux驱动 1、uboot是裸机程序 狭义的驱动的概念&#xff1a;操作系统中用来具体操控硬…

VB与Java颜色值的转换

正常的 RGB 颜色的有效范围&#xff0c;是从 0 到 16,777,215 (&HFFFFFF&)。每种颜色的设置值&#xff08;属性或参数&#xff09;都是一个四字节的整数。对于这个范围内的数&#xff0c;其高字节都是 0&#xff0c;而低三个字节&#xff0c;从最低字节到第三个字节&am…

Dreamweaver MX显示汉字为乱码的解决方法

推荐几种解决方法:a.在“编辑”&#xff0d;“首选参数”中设置“新建文档”->默认编码&#xff1a;utf-8或者gb2312&#xff08;取决于你的网页编码&#xff09;&#xff0c;并勾选“当打开未指定编码的现有文件时使用”;此时每次打开文件时都没有乱码了&#xff0c;也不额…

RDIFramework.NET(.NET快速开发框架) 答客户问(2014-02-23)

1、框架的部署安装&#xff0c;服务器端和客户端 答&#xff1a;开发版以上版本支持SOA模式&#xff0c;也即真正的面向服务端的模式&#xff0c;在实际使用过程中&#xff0c;可根据项目的实际需要&#xff0c;来选择性的进行部署&#xff08;直连模式或SOA模式&#xff09;&a…

I2C通信——I2C通信的基础介绍

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除 。 参考博客 SPI、I2C、UART&#xff08;即串口&#xff09;三种串行总线详解_天糊土的博客-CSDN博客_串口总线 s5pv210 I2C通信详解 - biaohc - 博客园 嵌入式常用技术概览之IIC(I2C)_C_XianRen的博…

IBM SOA[ESB,BPM,Portal等]基础架构图解

最近公司对众多的异构系统进行SOA化&#xff0c;产品选型为IBM的Websphere系列产品的WMB&#xff0c;BPM&#xff0c;Portal&#xff0c;LDAP等技术&#xff0c;根据具体的描述&#xff0c;连猜带蒙的画了个系统协作图&#xff0c;有不对的地方欢迎大家拍砖....谢谢。 SOA详细技…

高精度计算

多精度计算 许剑伟 2006-10-31 一、多&#xff08;高&#xff09;精度数据表示法&#xff1a; 用字符型数组表示一个高精度的数&#xff0c;以下示范数据结构&#xff0c;左边为数组底端&#xff08;或说内存底端&#xff09;&#xff0c;下表以底端高位&#xff08;或说高端…