#!/bin/sh#
#   ti processor sdk linux am335x evm /bin/setup-uboot-env.sh hacking
# 说明:
#     本文主要对TI的sdk中的setup-uboot-env.sh脚本进行解读,是为了了解
# 其工作机制,另外了解到minicom原来是可以用脚本来和开发板进行交互的。
#
#                                      2016-4-16 深圳 南山平山村 曾剑锋# This distribution contains contributions or derivatives under copyright
# as follows:
#
# Copyright (c) 2010, Texas Instruments Incorporated
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# - Redistributions of source code must retain the above copyright notice,
#   this list of conditions and the following disclaimer.
# - Redistributions in binary form must reproduce the above copyright
#   notice, this list of conditions and the following disclaimer in the
#   documentation and/or other materials provided with the distribution.
# - Neither the name of Texas Instruments nor the names of its
#   contributors may be used to endorse or promote products derived
#   from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.cwd=`dirname $0`
. $cwd/common.shdo_expect() {echo "expect {" >> $3check_statusecho "    $1" >> $3check_statusecho "}" >> $3check_statusecho $2 >> $3check_statusecho >> $3
}echo
echo "--------------------------------------------------------------------------------"
echo "This step will set up the U-Boot variables for booting the EVM."
echo#
# Qt@aplex:~/ti-processor-sdk-linux-am335x-evm-01.00.00.00$ ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1 }'
# 192.168.236.130
# Qt@aplex:~/ti-processor-sdk-linux-am335x-evm-01.00.00.00$ ifconfig | grep 'inet addr:'
#           inet addr:192.168.236.130  Bcast:192.168.236.255  Mask:255.255.255.0
#           inet addr:127.0.0.1  Mask:255.0.0.0
# Qt@aplex:~/ti-processor-sdk-linux-am335x-evm-01.00.00.00$ ifconfig
# eth0      Link encap:Ethernet  HWaddr 00:0c:29:52:ca:98
#           inet addr:192.168.236.130  Bcast:192.168.236.255  Mask:255.255.255.0
#           inet6 addr: fe80::20c:29ff:fe52:ca98/64 Scope:Link
#           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
#           RX packets:4726 errors:0 dropped:0 overruns:0 frame:0
#           TX packets:2321 errors:0 dropped:0 overruns:0 carrier:0
#           collisions:0 txqueuelen:1000
#           RX bytes:6424263 (6.4 MB)  TX bytes:164155 (164.1 KB)
#           Interrupt:19 Base address:0x2024
#
# lo        Link encap:Local Loopback
#           inet addr:127.0.0.1  Mask:255.0.0.0
#           inet6 addr: ::1/128 Scope:Host
#           UP LOOPBACK RUNNING  MTU:16436  Metric:1
#           RX packets:88 errors:0 dropped:0 overruns:0 frame:0
#           TX packets:88 errors:0 dropped:0 overruns:0 carrier:0
#           collisions:0 txqueuelen:0
#           RX bytes:7092 (7.0 KB)  TX bytes:7092 (7.0 KB)
#
# Qt@aplex:~/ti-processor-sdk-linux-am335x-evm-01.00.00.00$ ifconfig | grep 'inet addr:'
#           inet addr:192.168.236.130  Bcast:192.168.236.255  Mask:255.255.255.0
#           inet addr:127.0.0.1  Mask:255.0.0.0
# Qt@aplex:~/ti-processor-sdk-linux-am335x-evm-01.00.00.00$ ifconfig | grep 'inet addr:'| grep -v '127.0.0.1'
#           inet addr:192.168.236.130  Bcast:192.168.236.255  Mask:255.255.255.0
# Qt@aplex:~/ti-processor-sdk-linux-am335x-evm-01.00.00.00$ ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2
# 192.168.236.130  Bcast
# Qt@aplex:~/ti-processor-sdk-linux-am335x-evm-01.00.00.00$ ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1 }'
# 192.168.236.130
# Qt@aplex:~/ti-processor-sdk-linux-am335x-evm-01.00.00.00$
#
ipdefault=`ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1 }'`
# platform=am335x-evm
platform=`grep PLATFORM= $cwd/../Rules.make | cut -d= -f2`echo "Autodetected the following ip address of your host, correct it if necessary"
# 采用自动获取的IP还是手动设置的IP
read -p "[ $ipdefault ] " ip
echo
if [ ! -n "$ip" ]; thenip=$ipdefault
fi# 设置NFS根文件目录
if [ -f $cwd/../.targetfs ]; thenrootpath=`cat $cwd/../.targetfs`
elseecho "Where is your target filesystem extracted?"read -p "[ ${HOME}/targetNFS ]" rootpathif [ ! -n "$rootpath" ]; thenrootpath="${HOME}/targetNFS"fiecho
fi# 设置kernel相关的变量
kernelimage="zImage-""$platform"".bin"
kernelimagesrc=`ls -1 $cwd/../board-support/prebuilt-images/$kernelimage`
kernelimagedefault=`basename $kernelimagesrc`# 设置Linux kernel位置,TFTP还是SD card中
echo "Select Linux kernel location:"
echo " 1: TFTP"
echo " 2: SD card"
echo
read -p "[ 1 ] " kernelif [ ! -n "$kernel" ]; thenkernel="1"
fi# 设置文件系统路径,NFS还是SD card中
echo
echo "Select root file system location:"
echo " 1: NFS"
echo " 2: SD card"
echo
read -p "[ 1 ] " fsif [ ! -n "$fs" ]; thenfs="1"
fiif [ "$kernel" -eq "1" ]; thenechoecho "Available kernel images in /tftproot:"for file in /tftpboot/*; dobasefile=`basename $file`echo "    $basefile"doneechoecho "Which kernel image do you want to boot from TFTP?"read -p "[ $kernelimagedefault ] " kernelimageif [ ! -n "$kernelimage" ]; thenkernelimage=$kernelimagedefaultfi
fiisBB="n"
isBBBlack="n"
isBBrevA3="n"
configBB="n"# 个人认为这里是Ubuntu PC机已经和开发板通过USB连接了,然后这里就可以自动检测出开发板的类型。
check_for_beaglebone() {# First check if there is a rev A3 board which uses the custom VID/PID# combinationlsusb -d 0403:a6d0 > /dev/nullif [ "$?" = "0" ]then# We found a beagleboneisBB="y"isBBrevA3="y"returnfi# Now let's check for a standard VID/PID like newer BeagleBones havesudo lsusb -vv -d 0403:6010 | grep "Product" | grep "BeagleBone" > /dev/nullif [ "$?" = "0" ]thenisBB="y"returnfi# Now let's check for EVM-SKsudo lsusb -vv -d 0403:6010 | grep "Product" | grep "EVM-SK" > /dev/nullif [ "$?" = "0" ]thenisBB="y"returnfi# Now let's check for BeagleBone Blacksudo lsusb -vv -d 0403:6001 > /dev/nullif [ "$?" = "0" ]thenisBB="y"isBBBlack="y"returnfi}#
# Qt@aplex:~/ti-processor-sdk-linux-am335x-evm-01.00.00.00/bin$ ls -al setupBoard.minicom
# -rw-rw-r-- 1 Qt Qt 601 Aug 14  2015 setupBoard.minicom
# Qt@aplex:~/ti-processor-sdk-linux-am335x-evm-01.00.00.00/bin$ cat setupBoard.minicom
# timeout 300
# verbose on
# expect {
#     "stop autoboot:"
# }
# send " "
#
# expect {
#     "U-Boot#"
# }
# send "env default -f -a"
#
# expect {
#     "U-Boot#"
# }
# send "saveenv"
#
# expect {
#     "U-Boot#"
# }
# send "reset"
#
# expect {
#     "stop autoboot:"
# }
# send " "
#
# expect {
#     "U-Boot#"
# }
# send "setenv ip_method none"
#
# expect {
#     "U-Boot#"
# }
# send "setenv bootfile zImage"
#
# expect {
#     "U-Boot#"
# }
# send setenv bootcmd 'mmc rescan; run loadimage; run findfdt; run loadfdt; run mmcargs; bootz ${loadaddr} - ${fdtaddr}'
#
# expect {
#     "U-Boot#"
# }
# send "saveenv"
#
# expect {
#     "U-Boot#"
# }
# send "boot"
#
# ! killall -s SIGHUP minicom
# Qt@aplex:~/ti-processor-sdk-linux-am335x-evm-01.00.00.00/bin$ echo "timeout 300" > $cwd/setupBoard.minicom
echo "verbose on" >> $cwd/setupBoard.minicomdo_expect "\"stop autoboot:\"" "send \" \"" $cwd/setupBoard.minicom
do_expect "\"U-Boot#\"" "send \"env default -f -a\"" $cwd/setupBoard.minicom
do_expect "\"U-Boot#\"" "send \"saveenv\"" $cwd/setupBoard.minicom
do_expect "\"U-Boot#\"" "send \"reset\"" $cwd/setupBoard.minicom
do_expect "\"stop autoboot:\"" "send \" \"" $cwd/setupBoard.minicom# 根据前面的配置,将相关参数设置到setupBoard.minicom对应的文件里。
if [ "$kernel" -eq "1" ]; thenif [ "$fs" -eq "1" ]; then#TFTP and NFS Bootdo_expect "\"U-Boot#\"" "send \"setenv serverip $ip\"" $cwd/setupBoard.minicomdo_expect "\"U-Boot#\"" "send setenv rootpath '$rootpath'" $cwd/setupBoard.minicomdo_expect "\"U-Boot#\"" "send \"setenv bootfile $kernelimage\"" $cwd/setupBoard.minicomdo_expect "\"U-Boot#\"" "send \"setenv ip_method dhcp\"" $cwd/setupBoard.minicomdo_expect "\"U-Boot#\"" "send setenv bootcmd 'run findfdt; setenv autoload no;dhcp ;tftp \${loadaddr} $kernelimage; tftp \${fdtaddr} \${fdtfile}; run netargs; bootz \${loadaddr} - \${fdtaddr}'" $cwd/setupBoard.minicomdo_expect "\"U-Boot#\"" "send \"saveenv\"" $cwd/setupBoard.minicomdo_expect "\"U-Boot#\"" "send \"boot\"" $cwd/setupBoard.minicomelse#TFTP and SD Bootdo_expect "\"U-Boot#\"" "send \"setenv serverip $ip\"" $cwd/setupBoard.minicomdo_expect "\"U-Boot#\"" "send \"setenv bootfile $kernelimage\"" $cwd/setupBoard.minicomdo_expect "\"U-Boot#\"" "send \"setenv ip_method none\"" $cwd/setupBoard.minicomdo_expect "\"U-Boot#\"" "send setenv bootcmd 'run findfdt; setenv autoload no; dhcp ; tftp \${loadaddr} $kernelimage; tftp \${fdtaddr} \${fdtfile}; run mmcargs; bootz \${loadaddr} - \${fdtaddr}'" $cwd/setupBoard.minicomdo_expect "\"U-Boot#\"" "send \"saveenv\"" $cwd/setupBoard.minicomdo_expect "\"U-Boot#\"" "send \"boot\"" $cwd/setupBoard.minicomfi
elseif [ "$fs" -eq "1" ]; then#SD and NFS Bootdo_expect "\"U-Boot#\"" "send \"setenv serverip $ip\"" $cwd/setupBoard.minicomdo_expect "\"U-Boot#\"" "send setenv rootpath '$rootpath'" $cwd/setupBoard.minicomdo_expect "\"U-Boot#\"" "send \"setenv bootfile zImage\"" $cwd/setupBoard.minicomdo_expect "\"U-Boot#\"" "send \"setenv ip_method dhcp\"" $cwd/setupBoard.minicomdo_expect "\"U-Boot#\"" "send setenv bootcmd 'setenv autoload no; mmc rescan; run loadimage; run findfdt; run loadfdt; run netargs; bootz \${loadaddr} - \${fdtaddr}'" $cwd/setupBoard.minicomdo_expect "\"U-Boot#\"" "send \"saveenv\"" $cwd/setupBoard.minicomdo_expect "\"U-Boot#\"" "send \"boot\"" $cwd/setupBoard.minicomelse#SD and SD boot.do_expect "\"U-Boot#\"" "send \"setenv ip_method none\"" $cwd/setupBoard.minicomdo_expect "\"U-Boot#\"" "send \"setenv bootfile zImage\"" $cwd/setupBoard.minicomdo_expect "\"U-Boot#\"" "send setenv bootcmd 'mmc rescan; run loadimage; run findfdt; run loadfdt; run mmcargs; bootz \${loadaddr} - \${fdtaddr}'" $cwd/setupBoard.minicomdo_expect "\"U-Boot#\"" "send \"saveenv\"" $cwd/setupBoard.minicomdo_expect "\"U-Boot#\"" "send \"boot\"" $cwd/setupBoard.minicomfi
fi
echo "! killall -s SIGHUP minicom" >> $cwd/setupBoard.minicomecho "--------------------------------------------------------------------------------"
echo "Would you like to create a minicom script with the above parameters (y/n)?"
read -p "[ y ] " minicom
echoif [ ! -n "$minicom" ]; thenminicom="y"
fiif [ "$minicom" = "y" ]; thenecho -n "Successfully wrote "# readlink是linux系统中一个常用工具,主要用来找出符号链接所指向的位置readlink -m $cwd/setupBoard.minicom
fi# 检查是否有设备已经连接上来了,如果有设备已经连接,那么设置对应的配置。
while [ yes ]
do# 检查开发板类型check_for_beagleboneif [ "$isBB" = "y" ]thenecho ""echo "A BeagleBone (Black) or StarterKit board has been detected"echo "Do you want to configure U-Boot for one of the boards mentioned"echo "above? An answer of 'n' will configure U-Boot for the"echo "General Purpose EVM instead"read -p "(y/n) " configBBechoif [ "$configBB" = "y" ] || [ "$configBB" = "n" ]thenbreakelseecho "Invalid response"echocontinuefielseecho ""echo "No BeagleBone (Black) or StarterKit detected. Assuming"echo "general purpose evm is being used. Is this correct?"read -p "(y/n) " validevmecho ""if [ "$validevm" = "y" ]thenconfigBB="n"breakelseif [ "$validevm" != "n" ]thenecho "Invalid response"echocontinuefiecho "Please connect the Beaglebone (Black) or StarterKit to the PC"echo "If your using the StarterKit board make sure it is turned on"read -p "Press any key to try checking again." tempfifi
done# 如果插入的是BB开发板
if [ "$configBB" = "y" ]
thenftdiInstalled=`lsmod | grep ftdi_sio`if [ -z "$ftdiInstalled" ]; then#Add the ability to regconize the BeagleBone as two serial portsif [ "$isBBrevA3" = "y" ]thenecho "Finishing install by adding drivers for Beagle Bone..."# 添加Beagle Bone USB驱动sudo modprobe -q ftdi_sio vendor=0x0403 product=0xa6d0#Create uDev rule# 添加Beagle Bone udev规则echo "# Load ftdi_sio driver including support for XDS100v2." > $cwd/99-custom.rulesecho "SYSFS{idVendor}=="0403", SYSFS{idProduct}=="a6d0", \\" >>  $cwd/99-custom.rulesecho "RUN+=\"/sbin/modprobe -q ftdi_sio vendor=0x0403 product=0xa6d0\"" >> $cwd/99-custom.rulessudo cp $cwd/99-custom.rules /etc/udev/rules.d/rm $cwd/99-custom.ruleselsesudo modprobe -q ftdi_siofifi#infinite loop to look for board unless user asks to stop# 循环检查开发板是否连接上PCwhile [ yes ]doecho "Detecting connection to board..."loopCount=0port=`dmesg | grep FTDI | grep "tty" | tail -1 | grep "attached" |  awk '{ print $NF }'`while [ -z "$port" ] && [ "$loopCount" -ne "10" ]do#count to 10 and timeout if no connection is foundloopCount=$((loopCount+1))sleep 1port=`dmesg  | grep FTDI | grep "tty" | tail -1 | grep "attached" |  awk '{ print $NF }'`done#check to see if we actually found a portif [ -n "$port" ]; thenbreak;fi#if we didn't find a port and reached the timeout limit then ask to reconnectif [ -z "$port" ] && [ "$loopCount" = "10" ]; thenecho ""echo "Unable to detect which port the board is connected to."echo "Please reconnect your board."echo "Press 'y' to attempt to detect your board again or press 'n' to continue..."read -p "(y/n)" retryBoardDetectionfi#if they choose not to retry, ask user to reboot manually and exitif [ "$retryBoardDetection" = "n" ]; thenecho ""echo "Please reboot your board manually and connect using minicom."exit;fidone#Change minicom to accurately reflect the bone# 重新配饰minicom参数minicomcfg=${HOME}/.minirc.dflecho "pu port             /dev/$portpu baudrate         115200pu bits             8pu parity           Npu stopbits         1pu minitpu mresetpu mdialprepu mdialsufpu mdialpre2pu mdialsuf2pu mdialpre3pu mdialsuf3pu mconnectpu mnocon1          NO CARRIERpu mnocon2          BUSYpu mnocon3          NO DIALTONEpu mnocon4          VOICEpu rtscts           No" | tee $minicomcfg > /dev/nullcheck_status
fiecho "Would you like to run the setup script now (y/n)? For the general purpose evm "
echo "you must now connect the RS-232 cable to your evm now. For the Beaglebone (Black)"
echo "or StarterKit this step should of already have been done. Also connect the ethernet"
echo "cable as described in the Quick Start Guide."
echo "**Important**"
echo "Once answering 'y' on the prompt below you will have 300 seconds to turn on the"
echo "board or if it was already on reboot the board before the setup times out"
echo
echo "After successfully executing this script, your board will be set up. You will be "
echo "able to connect to it by executing 'minicom -w' or if you prefer a windows host"
echo "you can set up Tera Term as explained in the Software Developer's Guide."
echo "If you connect minicom or Tera Term and power cycle the board Linux will boot."
echo
read -p "[ y ] " minicomsetupif [ ! -n "$minicomsetup" ]; then
minicomsetup="y"
fiif [ "$minicomsetup" = "y" ]; then
cd $cwd
# 这里相当于用minicom运行minicom脚本
sudo minicom -w -S setupBoard.minicom
cd -
fiecho "You can manually run minicom in the future with this setup script using: minicom -S $cwd/setupBoard.minicom"
echo "--------------------------------------------------------------------------------"

ti processor sdk linux am335x evm /bin/setup-uboot-env.sh hacking相关推荐

  1. ti processor sdk linux am335x evm /bin/setup-minicom.sh hacking

    #!/bin/sh# # ti processor sdk linux am335x evm /bin/setup-minicom.sh hacking # 说明: # 本文主要对TI的sdk中的se ...

  2. ti processor sdk linux am335x evm /bin/create-sdcard.sh hacking

    #!/bin/bash# # ti processor sdk linux am335x evm /bin/create-sdcard.sh hacking # 说明: # 本文主要对TI的sdk中的 ...

  3. ti linux 开发环境,Ti AM5728 SDK开发环境建立,Setup Linux build environment for Ti AM57xx

    参考:http://arago-project.org/wiki/index.php/Setting_Up_Build_Environment#Point_to_the_toolchain_to_us ...

  4. 【华为Hilink SDK Linux系统开发】第三章:华为hilink SDK Linux系统网关适配

    mark:https://blog.csdn.net/qq_24550925/article/details/107282773 关注嘉友创科技公众号 声明:文章只做技术交流,没有其他任何用途,侵权泄 ...

  5. 【BLE】TI CC2640R2F SDK结构以及一些概念解析

    一.概述 CC2640R2F作为BLE单SOC解决方案, TI的SDK将工程分为应用程序(APP)和协议栈(Stack)两部分 二.协议栈 协议栈包括:主机(Host)和控制器(Controller) ...

  6. Linux下的/bin、/sbin、/usr/bin、/usr/sbin目录

    Linux下的/bin./sbin./usr/bin./usr/sbin目录 在linux下我们经常用到的四个应用程序的目录是/bin./sbin./usr/bin./usr/sbin .而四者存放的 ...

  7. linux中的 bin sh,Linux-#!/bin/sh理解

    #!是一个特殊符号,/bin/sh是用来解释该脚本的的shell路径 #!/bin/sh指该脚本使用/bin/sh来执行 sh只是其中一种解释方式,通过如下命令可以查到支持的shell解释方式: xx ...

  8. Linux脚本开头#!/bin/bash和#!/bin/sh是什么意思以及区别

    Linux脚本开头#!/bin/bash和#!/bin/sh是什么意思以及区别 一.意思 #!/bin/sh是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面根的是此解释此脚本的she ...

  9. linux下安装bin格式的程序

    linux下安装*.bin程序的方式: 1.先切换到文件所在目录 2.执行命令 sudo chmod +x *.bin  (为文件添加可执行属性) 3.执行命令sudo ./*.bin (运行程序) ...

最新文章

  1. 安装discuz遇到的坑
  2. Android性能优化之启动优化实战篇,最终入职阿里
  3. python从基础到进阶_无需编程基础,Python从入门到进阶大法
  4. “读书”频道的一些链接错误
  5. Error creating bean with name 'adminUserController': Injection of autowired dependencies failed;
  6. Apache Spark 2.0: 机器学习模型持久化
  7. Windows XP系统超强支持工具全面接触
  8. 【学习笔记】第三章 python3核心技术与实践--Jupyter Notebook
  9. 【软件工程】构件化业务模型CBM
  10. wps vba宏插件_合并和拆分表格,告别VBA和插件,用WPS表格自带功能一键搞定,而且免费!...
  11. tp5命令行基础介绍
  12. python提取日志内容_Python正则提取日志内容
  13. 虚树详解+例子分析+模板
  14. 最新楚琳web打印控件下载 - 2019适配所有浏览器
  15. 迅为i.MX6Q开发板-红外 hs0038 测试
  16. java邮件数据库_javamail-demo(完整源码+数据库)
  17. PADS导入【ORCAD原理图文件】【导入ORCAD16.3原理图】 【layout如何进行“ECO对比更新”】【打开文件出错:*因为当前设计处于默认层模式下........】
  18. CPU性能参数:MIPS,频率,IPC,CPI,时钟周期,机器周期,指令周期,主频
  19. 15000 字的 SQL 语句大全!
  20. ListView 里面的checkBox,当其中一个被选中,其余全不被选中

热门文章

  1. 技术最全 知识图谱 - 2019年各行业知识图谱
  2. ios浏览器日期不生效
  3. 数模必备:利用ggplot2在地图上连线(不使用for循环)
  4. 基于Matlab使用到达时差 (TDOA) 跟踪对象仿真(附源码)
  5. Java 编程中,有哪些好的习惯应该从一开始就值得坚持?
  6. IPTV是什么 IPTV有什么功能
  7. 面向制造和装配的产品设计指南 Ch.2 学习笔记
  8. u盘安装kali linux英文,kali linux 安装至移动硬盘或U盘
  9. 从阿里QianKun看前端沙箱隔离
  10. 微前端之实践环境变量设置、快照沙箱隔离、代理沙箱隔离、css 样式隔离、父子应用间通信和子应用间通信