完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 城东 于 2016-12-6 22:32 编辑
运行脚本gen_misc.sh后的打印信息和该脚本的内容请查看上一篇文章:https://bbs.elecfans.com/forum.ph ... &tid=1098343&extra= 下面开始对这个脚本进行分析: 开始两句话就是: echo "gen_misc.sh version 20150826" echo "" 这两句话的意思是向控制台输出"gen_misc.sh version 20150826"字符串和一个空字符串,我们看看输出的信息中 开始确实是输出和脚本里要求的信息 下来是定义变量: home_path=${PWD%et*} export SDK_PATH=${home_path} export BIN_PATH=${home_path}"bin" 第一个是主目录变量,${PWD%et*}代表目前目录除去et*(以et开头的字符串),例如目前脚本的目录在:~/Share/SDK/et_app/,那么经过上面的运算之后home_path=~/Share/SDK/也就是去掉了et_app/ 接下来声明了两个全局变量SDK_PATH=~/Share/SDK/,而BIN_PATH=~/Share/SDK/bin 下来首先有做的就是判断这两个全局变量(环境变量)是否存在: if [ $SDK_PATH ]; then echo "SDK_PATH:" echo "$SDK_PATH" echo "" else echo "ERROR: Please export SDK_PATH firstly, exit!!!" exit fi if [ $BIN_PATH ]; then echo "BIN_PATH:" echo "$BIN_PATH" echo "" else echo "ERROR: Please export BIN_PATH firstly, exit!!!" exit fi 从代码可以看出,如果这个全局变量存在的话就打印到控制台,下面是接下来控制台打印的内容: SDK_PATH: /home/esp8266/Share/SDK/ BIN_PATH: /home/esp8266/Share/SDK/bin 这里看到输出的目录确实是我们猜测的,~也是代表当前的用户目录:/home/esp8266,另外补充说明一点echo ""代表的是输出换行的意思,并不是输出空的意思 下来的内容是: echo "Please check SDK_PATH & BIN_PATH, enter (Y/y) to continue:" 提示我们输入y然后继续,但是我们并没有输入y,这里就很有意思了,说明下面的工作并不需要我们输入任何东西的,这里只有一个恶作剧而已。看看下面的语句: input=y if [[ $input != Y ]] && [[ $input != y ]]; then exit fi 这里自己等于了y,根本不需要做任何的输入,所以这里是一个没有任何作用的语句罢了,在这里我们可以试试让input=x看看脚本还会不会执行下面的代码,测试发现当把y改成x之后确实没有看到脚本后面的编译工作了。接下来输出一些说明语句: echo "" echo "Please follow below steps(1-5) to generate specific bin(s):" echo "STEP 1: use boot_v1.2+ by default" 接下来定义引导模式并且输出打印: boot=new echo "boot mode: $boot" echo "" boot这个变量在后面应该有用。接下来进行编译的第二步,如下: echo "STEP 2: choose bin generate(0=eagle.flash.bin+eagle.irom0text.bin, 1=user1.bin, 2=user2.bin)" echo "enter (0/1/2, default 0):" input=1 if [ -z "$input" ]; then if [ $boot != none ]; then boot=none echo "ignore boot" fi app=0 echo "generate bin: eagle.flash.bin+eagle.irom0text.bin" elif [ $input == 1 ]; then if [ $boot == none ]; then app=0 echo "choose no boot before" echo "generate bin: eagle.flash.bin+eagle.irom0text.bin" else app=1 echo "generate bin: user1.bin" fi elif [ $input == 2 ]; then if [ $boot == none ]; then app=0 echo "choose no boot before" echo "generate bin: eagle.flash.bin+eagle.irom0text.bin" else app=2 echo "generate bin: user2.bin" fi else if [ $boot != none ]; then boot=none echo "ignore boot" fi app=0 echo "generate bin: eagle.flash.bin+eagle.irom0text.bin" fi echo "" 这里可以说是选择生成的bin的种类,这里有三个种类0=eagle.flash.bin+eagle.irom0text.bin, 1=user1.bin, 2=user2.bin,下面的所有判断都是对这些种类的识别(是否真的支持)最终反映出来的是变量app的值,这算是一个返回值,在判断中的最重要的一句就是boot=none,这是我们之前就已经设置好的了,设置成了new,而这里input=1,所以最终执行的语句是elif [ $input == 1 ]; then的分支,设置app为1,注意这里有一个地方需要说明如果input不等于1或者2,那么这里又会从新设置boot这个变量 boot=none,这里要特别说明的是:-z 代表的是存在的意思,也就是说后面的变量是否存在的意思,注意这里的是否存在并不是代表是否为0,这里我们亦可以看到打印信息如下: STEP 2: choose bin generate(0=eagle.flash.bin+eagle.irom0text.bin, 1=user1.bin, 2=user2.bin) enter (0/1/2, default 0): generate bin: user1.bin 接下来就是执行编译的第三步,选择SPI的速度,如下: echo "STEP 3: choose spi speed(0=20MHz, 1=26.7MHz, 2=40MHz, 3=80MHz)" echo "enter (0/1/2/3, default 2):" input=2 if [ -z "$input" ]; then spi_speed=40 elif [ $input == 0 ]; then spi_speed=20 elif [ $input == 1 ]; then spi_speed=26.7 elif [ $input == 3 ]; then spi_speed=80 else spi_speed=40 fi echo "spi speed: $spi_speed MHz" echo "" 这里就写得比较乱了,直接去掉了$input == 2的分支,让他执行else分支,这是一个比较流氓的做法,这个代码写得不好,这样只要输入不是1和3,那么spi_speed=40,这里要特别说明的是:-z 代表的是存在的意思,也就是说后面的变量是否存在的意思,注意这里的是否存在并不是代表是否为0。这里可以看大打印的信息如下: STEP 3: choose spi speed(0=20MHz, 1=26.7MHz, 2=40MHz, 3=80MHz) enter (0/1/2/3, default 2): spi speed: 40 MHz 这里设置了spi_speed这个变量, 接下来是编译之前的第四步,选择spi模式,如下: echo "STEP 4: choose spi mode(0=QIO, 1=QOUT, 2=DIO, 3=DOUT)" echo "enter (0/1/2/3, default 0):" input=0 if [ -z "$input" ]; then spi_mode=QIO elif [ $input == 1 ]; then spi_mode=QOUT elif [ $input == 2 ]; then spi_mode=DIO elif [ $input == 3 ]; then spi_mode=DOUT else spi_mode=QIO fi echo "spi mode: $spi_mode" echo "" 至于这些模式目前我也暂时不明白他们的具体含义,我可以猜测0=QIO, 1=QOUT,是四线SPI,而后面两个就是三线的了,0=QIO就是我们最常见的SPI模型了,这里可以看到打印的语句如下: STEP 4: choose spi mode(0=QIO, 1=QOUT, 2=DIO, 3=DOUT) enter (0/1/2/3, default 0): spi mode: QIO 这里确实是选择QIO模型,接下来执行设置编译器的第五步,设置spi的size and map,如下: echo "STEP 5: choose spi size and map" echo " 0= 512KB( 256KB+ 256KB)" echo " 2=1024KB( 512KB+ 512KB)" echo " 3=2048KB( 512KB+ 512KB)" echo " 4=4096KB( 512KB+ 512KB)" echo " 5=2048KB(1024KB+1024KB)" echo " 6=4096KB(1024KB+1024KB)" echo "enter (0/2/3/4/5/6, default 0):" input=3 if [ -z "$input" ]; then spi_size_map=0 echo "spi size: 512KB" echo "spi ota map: 256KB + 256KB" elif [ $input == 2 ]; then spi_size_map=2 echo "spi size: 1024KB" echo "spi ota map: 512KB + 512KB" elif [ $input == 3 ]; then spi_size_map=3 echo "spi size: 2048KB" echo "spi ota map: 512KB + 512KB" elif [ $input == 4 ]; then spi_size_map=4 echo "spi size: 4096KB" echo "spi ota map: 512KB + 512KB" elif [ $input == 5 ]; then spi_size_map=5 echo "spi size: 2048KB" echo "spi ota map: 1024KB + 1024KB" elif [ $input == 6 ]; then spi_size_map=6 echo "spi size: 4096KB" echo "spi ota map: 1024KB + 1024KB" else spi_size_map=0 echo "spi size: 512KB" echo "spi ota map: 256KB + 256KB" fi echo "" 这里设置spi_size_map这个变量,这个变量在下面有用,我们可以看到这样的打印信息: STEP 5: choose spi size and map 0= 512KB( 256KB+ 256KB) 2=1024KB( 512KB+ 512KB) 3=2048KB( 512KB+ 512KB) 4=4096KB( 512KB+ 512KB) 5=2048KB(1024KB+1024KB) 6=4096KB(1024KB+1024KB) enter (0/2/3/4/5/6, default 0): spi size: 2048KB spi ota map: 512KB + 512KB 接下来就执行真正的编译工作了: echo "start..." echo "" make clean make BOOT=$boot APP=$app SPI_SPEED=$spi_speed SPI_MODE=$spi_mode SPI_SIZE_MAP=$spi_size_map 这里执行完make clean清除之前的编译工作后就执行make,同时把之前设置好的变量都传送了进来, 这里我们可以总结出各个变量的值如下: BOOT=new APP=1 SPI_SPEED=40 SPI_MODE=QIO SPI_SIZE_MAP=3 到了这里这个脚本的所有语句都已经分析完成,那么接下来的工作就是进行编译了,根据编译的原理,make之后编译器将去执行makefile里面的语句,下面的工作主要就是分析makefile了 未完待续 |
|
相关推荐
2 个讨论
|
|
是定义变量:
home_path=${PWD%et*} export SDK_PATH=${home_path} export BIN_PATH=${home_path}"bin" 第一个是主目录变量,${PWD%et*}代表目前目录除去et*(以et开头的字符串),例如目前脚本的目录在:~/Share/SDK/et_app/,那么经过上面的运算之后home_path=~/Share/SDK/也就是去掉了et_app/ 接下来声明了两个全局变量SDK_PATH=~/Share/SDK/,而BIN_PATH=~/Share/SDK/bin 下来首先有做的就是判断这两个全局变量(环境变量)是否存在: if [ $SDK_PATH ]; then echo "SDK_PATH:" echo "$SDK_PATH" echo "" else echo "ERROR: Please export SDK_PATH firstly, exit!!!" exit fi if [ $BIN_PATH ]; then echo "BIN_PATH:" echo "$BIN_PATH" echo "" else echo "ERROR: Please export BIN_PATH firstly, exit!!!" exit fi 从代码可以看出,如果这个全局变量存在的话就打印到控制台,下面是接下来控制台打印的内容: SDK_PATH: /home/esp8266/Share/SDK/ BIN_PATH: /home/esp8266/Share/SDK/bin 这里看到输出的目录确实是我们猜测的,~也是代表当前的用户目录:/home/esp8266,另外补充说明一点echo ""代表的是输出换行的意思,并不是输出空的意思 下来的内容是: echo "Please check SDK_PATH & BIN_PATH, enter (Y/y) to continue:" 提示我们输入y然后继续,但是我们并没有输入y,这里就很有意思了,说明下面的工作并不需要我们输入任何东西的,这里只有一个恶作剧而已。看看下面的语句: input=y if [[ $input != Y ]] && [[ $input != y ]]; then exit fi 这里自己等于了y,根本不需要做任何的输入,所以这里是一个没有任何作用的语句罢了,在这里我们可以试试让input=x看看脚本还会不会执行下面的代码,测试发现当把y改成x之后确实没有看到脚本后面的编译工作了。接下来输出一些说明语句: echo "" echo "Please follow below steps(1-5) to generate specific bin(s):" echo "STEP 1: use boot_v1.2+ by default" 接下来定义引导模式并且输出打印: boot=new echo "boot mode: $boot" echo "" boot这个变量在后面应该有用。接下来进行编译的第二步,如下: echo "STEP 2: choose bin generate(0=eagle.flash.bin+eagle.irom0text.bin, 1=user1.bin, 2=user2.bin)" echo "enter (0/1/2, default 0):" input=1 if [ -z "$input" ]; then if [ $boot != none ]; then boot=none echo "ignore boot" fi app=0 echo "generate bin: eagle.flash.bin+eagle.irom0text.bin" elif [ $input == 1 ]; then if [ $boot == none ]; then app=0 echo "choose no boot before" echo "generate bin: eagle.flash.bin+eagle.irom0text.bin" else app=1 echo "generate bin: user1.bin" fi elif [ $input == 2 ]; then if [ $boot == none ]; then app=0 echo "choose no boot before" echo "generate bin: eagle.flash.bin+eagle.irom0text.bin" else app=2 echo "generate bin: user2.bin" fi else if [ $boot != none ]; then boot=none echo "ignore boot" fi app=0 echo "generate bin: eagle.flash.bin+eagle.irom0text.bin" fi echo "" 这里可以说是选择生成的bin的种类,这里有三个种类0=eagle.flash.bin+eagle.irom0text.bin, 1=user1.bin, 2=user2.bin,下面的所有判断都是对这些种类的识别(是否真的支持)最终反映出来的是变量app的值,这算是一个返回值,在判断中的最重要的一句就是boot=none,这是我们之前就已经设置好的了,设置成了new,而这里input=1,所以最终执行的语句是elif [ $input == 1 ]; then的分支,设置app为1,注意这里有一个地方需要说明如果input不等于1或者2,那么这里又会从新设置boot这个变量 boot=none,这里要特别说明的是:-z 代表的是存在的意思,也就是说后面的变量是否存在的意思,注意这里的是否存在并不是代表是否为0,这里我们亦可以看到打印信息如下: STEP 2: choose bin generate(0=eagle.flash.bin+eagle.irom0text.bin, 1=user1.bin, 2=user2.bin) enter (0/1/2, default 0): generate bin: user1.bin 接下来就是执行编译的第三步,选择SPI的速度,如下: echo "STEP 3: choose spi speed(0=20MHz, 1=26.7MHz, 2=40MHz, 3=80MHz)" echo "enter (0/1/2/3, default 2):" input=2 if [ -z "$input" ]; then spi_speed=40 elif [ $input == 0 ]; then spi_speed=20 elif [ $input == 1 ]; then spi_speed=26.7 elif [ $input == 3 ]; then spi_speed=80 else spi_speed=40 fi echo "spi speed: $spi_speed MHz" echo "" 这里就写得比较乱了,直接去掉了$input == 2的分支,让他执行else分支,这是一个比较流氓的做法,这个代码写得不好,这样只要输入不是1和3,那么spi_speed=40,这里要特别说明的是:-z 代表的是存在的意思,也就是说后面的变量是否存在的意思,注意这里的是否存在并不是代表是否为0。这里可以看大打印的信息如下: STEP 3: choose spi speed(0=20MHz, 1=26.7MHz, 2=40MHz, 3=80MHz) enter (0/1/2/3, default 2): spi speed: 40 MHz 这里设置了spi_speed这个变量, 接下来是编译之前的第四步,选择spi模式,如下: echo "STEP 4: choose spi mode(0=QIO, 1=QOUT, 2=DIO, 3=DOUT)" echo "enter (0/1/2/3, default 0):" input=0 if [ -z "$input" ]; then spi_mode=QIO elif [ $input == 1 ]; then spi_mode=QOUT elif [ $input == 2 ]; then spi_mode=DIO elif [ $input == 3 ]; then spi_mode=DOUT else spi_mode=QIO fi echo "spi mode: $spi_mode" echo "" 至于这些模式目前我也暂时不明白他们的具体含义,我可以猜测0=QIO, 1=QOUT,是四线SPI,而后面两个就是三线的了,0=QIO就是我们最常见的SPI模型了,这里可以看到打印的语句如下: STEP 4: choose spi mode(0=QIO, 1=QOUT, 2=DIO, 3=DOUT) enter (0/1/2/3, default 0): spi mode: QIO 这里确实是选择QIO模型,接下来执行设置编译器的第五步,设置spi的size and map,如下: echo "STEP 5: choose spi size and map" echo " 0= 512KB( 256KB+ 256KB)" echo " 2=1024KB( 512KB+ 512KB)" echo " 3=2048KB( 512KB+ 512KB)" echo " 4=4096KB( 512KB+ 512KB)" echo " 5=2048KB(1024KB+1024KB)" echo " 6=4096KB(1024KB+1024KB)" echo "enter (0/2/3/4/5/6, default 0):" input=3 if [ -z "$input" ]; then spi_size_map=0 echo "spi size: 512KB" echo "spi ota map: 256KB + 256KB" elif [ $input == 2 ]; then spi_size_map=2 echo "spi size: 1024KB" echo "spi ota map: 512KB + 512KB" elif [ $input == 3 ]; then spi_size_map=3 echo "spi size: 2048KB" echo "spi ota map: 512KB + 512KB" elif [ $input == 4 ]; then spi_size_map=4 echo "spi size: 4096KB" echo "spi ota map: 512KB + 512KB" elif [ $input == 5 ]; then spi_size_map=5 echo "spi size: 2048KB" echo "spi ota map: 1024KB + 1024KB" elif [ $input == 6 ]; then spi_size_map=6 echo "spi size: 4096KB" echo "spi ota map: 1024KB + 1024KB" else spi_size_map=0 echo "spi size: 512KB" echo "spi ota map: 256KB + 256KB" fi echo "" 这里设置spi_size_map这个变量,这个变量在下面有用,我们可以看到这样的打印信息: STEP 5: choose spi size and map 0= 512KB( 256KB+ 256KB) 2=1024KB( 512KB+ 512KB) 3=2048KB( 512KB+ 512KB) 4=4096KB( 512KB+ 512KB) 5=2048KB(1024KB+1024KB) 6=4096KB(1024KB+1024KB) enter (0/2/3/4/5/6, default 0): spi size: 2048KB spi ota map: 512KB + 512KB 接下来就执行真正的编译工作了: echo "start..." echo "" make clean make BOOT=$boot APP=$app SPI_SPEED=$spi_speed SPI_MODE=$spi_mode SPI_SIZE_MAP=$spi_size_map 这里执行完make clean清除之前的编译工作后就执行make,同时把之前设置好的变量都传送了进来, 这里我们可以总结出各个变量的值如下: BOOT=new APP=1 SPI_SPEED=40 SPI_MODE=QIO SPI_SIZE_MAP=3 到了这里这个脚本的所有语句都已经分析完成,那么接下来的工作就是进行编译了,根据编译的原理,make之后编译器将去执行makefile里面的语句,下面的工作主要就是分析makefile了 未完待续 |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
[小e体验板] 【小体积大智慧】关于体验板的技术问题,看这一篇就够了
2855 浏览 4 评论
【小e1开发板试用体验】分析程序架构四~/Share/SDK/makefile分析
3613 浏览 1 评论
6706 浏览 19 评论
29081 浏览 59 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-28 02:07 , Processed in 0.450345 second(s), Total 43, Slave 36 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号