知其然知其所以然,了解过程可以让你知道遇到问题该怎么做,所以这里从搭建环境到编译过程一步一步解释,
让新人在以后遇到类似问题可以尝试寻找原因或自己解决。
这是用到的仓库,以这个为例子,以及里面文档给的步骤。
搭建与编译步骤 - 一、克隆Ai-Thinker仓库
- 在linux的终端下输入
- git clone https://github.com/Ai-Thinker-Open/AiPi-Open-Kits.git
- 将整个开源硬件的DEMO仓库克隆下来
- 二、拉取子模块
- 首先进入AiPi-Open-Kits目录下
- cd AiPi-Open-Kits
- 在该目录下输入以下两条指令初始化及拉取子模块
- git submodule initgit submodule update
- 进入aithinker_Ai-M6X_SDK,拉取SDK子模块以及设置路径
- . install.sh. export.sh
- 三、编译和烧录
- 在AiPi-Open-Kits下可以看见各种小安派的Demo文件夹,使用cd命令进入到需要编译和烧录的Demo下
- cd 对应Demo目录文件夹make //编译命令make flash COMX=/dev/ttyUSB0 //烧录命令
复制代码
一、环境搭建过程:
是把源码从git克隆下来,相当于下载一份源码到自己电脑上。
常见的问题是github连不上,那么开魔法,或者从其它地方下载也一样,比如gitee,甚至可以让别人下载好了打包发你一份。
cd AiPi-Open-Kits
cd 是change directory的简写,把当前目录改为目标目录,就是进入到某个文件夹内。
这一步只是为下面操作做准备。
git submodule init
git submodule update
简单百度一下发现,这是初始化子仓库,更新子仓库。
那么其作用跟clone一样都是把源码下载到本地。为什么需要这个呢,因为AiPi-Open-Kits使用了子仓库,可以简单认为这个仓库引用了其它仓库,所以还要更新引用的其它仓库。
. install.sh
. export.sh
. install.sh(点空格)跟source install.sh 作用是一样的。
是在当前环境下执行脚本,正常执行脚本,退出后脚本内设置的环境变量,函数定义等,都会清掉。为了让脚本内定义的内容能保留到当前环境下,才使用这种方式。
举个简单的例子,某脚本内容为 cd /data && echo ”in data”,用source执行后当前所在目录应该是data目录,正常执行的话,则目录不会改变。
install.sh 的内容 判断当前是否存在toolchain/bin目录,存在则输出该目录, 不存在则执行初始化子仓库,更新子仓库。 cd ..是进入上一级目录,$PWD是当前目录。 先进入toolchain/bin,再把当前目录(就是toolchain/bin)赋值到PATH最后面,之后回到原来目录。
判断没有toolchain/bin目录就更新子仓库,很容易想到toolchain就是子仓库的内容。 也很容易想到这个install只需要操作一次,因为以后就会有toolchain/bin目录而跳过。 而把toolchain/bin添加到PATH目录的操作没有意义,是会直接跳过的,倘若后面的操作需要依赖这一步,那就只是埋雷。
export.sh内容 第1行,又是把toolchain/bin添加到PATH目录,所以又一次证明了install那边的添加操作无意义。 第2行,显示当前PATH 第3行,显示riscv64-unknown-elf-gcc 工具的版本号 后面就是给几个路径的文件添加权限。这里我们肯定不会去修改这些文件,所以实际上需要的主要是执行权限,用chmod +x 文件名,效果也是一样的。 添加执行权限后,下次不需要再次添加。 而这里的添加到PATH目录,只是个临时修改,所以下次还需要再次执行。Windows可以通过环境变量修改,自己把toolchain/bin加进去。Linux可以修改~/.bashrc文件把这行命令加进去,避免每次开机或打开terminate都要执行export.sh脚本。 添加的目的是可以直接通过文件名执行,如果后面出现找不到xx文件,有可能就是缺少了添加到PATH这一步。 如果出现权限不足,可能就是没有给执行权限。
总结下来,搭建环境只做了3件事: 1、拉代码 2、工具添加到PATH 3、工具添加执行权限 只要做到这几个事,用什么方法都是可以的。
搭建过程过于简单,所以再水一水编译过程吧
二、编译过程 cd 对应Demo目录文件夹 make //编译命令 make flash COMX=/dev/ttyUSB0 //烧录命令
进入demo文件夹 执行make命令,make命令是做什么的? 根据我们用到的,先来写一个例子
写一个Makefile文件如上,有3个分支。 在当前目录上打开cmd,添加好命令路径。
直接执行make,会输出 1 axk zdzq make不带参数时,会执行第1个分支的内容
由于第2个分支冒号后面加上了第一个分支名, 执行 make gouge FLAG="niu bi" 执行第2分支时,会先执行第1个分支的内容,第二个分支时使用了变量FLAG,是我们make时给的niu bi内容。
第3个分支,同样冒号后有分支2,所以会先执行分支2,递归下去就1、2、3逐个执行。而变量LABEL使用了默认值yuangzhang(拼错了)。
所以第4个命令,手动输入LABEL=”ai xiao”,之后,输出了新的内容。 简单总结下: make xx就会执行xx分支的内容,如果xx分支依赖其它分支,则会先执行其它分支。 不带参数就执行第一个分支。 make时可以带变量
再回到编译过程,例子执行了make和make flash,所以执行了第一个分支,之后又执行了flash分支。 通过makefile文件可以看出,第一个分支是build,而flash分支会执行一次build, 所以实际上如果你对代码有自信,可以直接执行flash,不用build。
未完待续... 如果有人看再更新吧
|