Golang也就是Go语言,现在已经发行到1.4.1版本了,语言特性优越性和背后Google强大靠山什么的就不多说了。Golang的官方提供了多个平台上的二进制安装包,遗憾的是并非没有发布ARM平台的二进制安装包。ARM平台没办法直接从官网下载二进制安装包来安装,好在Golang是支持多平台并且开源的语言,因此可以通过直接在ARM平台上编译源代码来安装。整个过程主要包括编译工具配置、获取Golang源代码、设置Golang编译环境变量、编译、配置Golang行环境变量等步骤。
注:本文选用树莓派做测试,因为树莓派是基于ARM平台的。
1、编译工具配置
据说下个版本的golang编译工具要使用golang自己来写,但目前还是使用C编译工具的。因此,首先要配置好C编译工具:
1.1在Ubuntu或Debian平台上可以使用sudoapt-getinstallgcclibc6-dev命令安装,树莓派的RaspBian系统是基于Debian修改的,所以可以使用这种方法安装。
1.2在RedHat或CentOS6平台上可以使用sudoyuminstallgcclibc-devel命令安装。
安装完成后可以输入gcc--version命令验证是否成功安装。
2、获取golang源代码
2.1直接从官网下载源代码压缩包。
golang官网提供golang的源代码压缩包,可以直接下载,最新的1.4.1版本源代码链接:/golang/go1.4.1.src.tar.gz
2.2使用git工具获取。
golang使用git版本管理工具,也可以使用git获取golang源代码。推荐使用这个方法,因为以后可以随时获取最新的golang源代码。
2.2.1首先确认ARM平台上已经安装了git工具,可以使用git--version命令确认。一般linux平台都安装了git,没有的话可以自行安装,不同平台的安装方法可以参考:download/linux
2.2.2克隆远程golang的git仓库到本地
在终端cd到你想要安装golang的目录,确保该目录下没有名为go的目录。然后以下命令获取代码仓库:
gitclone/go
大陆地区可能会获取失败,在不翻墙的情况下我试了几次都没成功,原因大家都懂的。好在google已经将golang也托管到github上面,所以也可以通过下面命令获取:
gitclone/golang/go.git
视网络情况,下载可能需要不少时间。我2M的带宽花了将近两个小时才下载完,虽然整个项目不过几十兆==
下载完成后,可以看到目录下多了一个go目录,里面即为golang的源代码,在终端上执行cdgo命令进入该目录。
执行下面命令检出go1.4.1版本的源代码,因为现在汪敏指已经有新的代码提交上去了,最新的代码可能不是最稳定的:
gitcheckoutgo1.4.1
至此,最新1.4.1发行版的源代码获取完毕
3、设置golang的编译环境变量
主要有GOROOT、GOOS、GOARCH、GOARM四个环境变量需要设置,先解释四个环境变量的意义。
3.1GOROOT
主要代表golang树结构目录的路径,也就是上面git检出的go目录。一般可以不用设置这个环境变量,因为编译的时候默认会以go目录下src子目录中的all.bash脚本困配运行时的父目录作为GOROOT的值。为了保险起见,可以直接设拿芹置为go目录的路径。
3.2GOOS和GOARCH
分别代表编译的目标系统和平台,可选值如下:
GOOSGOARCH
darwin386
darwinamd64
dragonfly386
dragonflyamd64
freebsd386
freebsdamd64
freebsdarm
linux386
linuxamd64
linuxarm
netbsd386
netbsdamd64
netbsdarm
openbsd386
openbsdamd64
plan9386
plan9amd64
solarisamd64
windows386
windowsamd64
需要注意的是这两个值代表的是目标系统和平台,而不是编译源代码的系统和平台。树莓派的RaspBian是linux系统,所以这些GOOS设置为linux,GOARCH设置为arm。
3.3GOARM
表示使用的浮点运算协处理器版本号,只对arm平台有用,可选值有5,6,7。如果是在目标平台上编译源代码,这个值可以不设置,它会自动判断需要使用哪一个版本。
总结下来,在树莓派上设置golang的编译环境变量,可编辑$HOME/.bashrc文件,在末尾添加下面内容:
exportGOROOT=你的go目录路径
exportGOOS=linux
exportGOARCH=arm
编辑完后保存,执行source~/.bashrc命令让修改生效。
4、编译源代码
环境变量配置完成自后就可以开始编译源代码。在go目录下的src子目录中,主要有all.bash和make.bash两个脚本(另外还有两个all.bat和make.bat脚本适用于window平台)。编译实际上就是执行其中一个脚本,两者的区别在于all.bash在编译完成后还会执行一些测试套件。如果希望只编译不测试,可以运行make.bash脚本。使用cd命令进入go下src目录,执行./all.bash或者./make.bash命令即可开始编译。由于硬件情况不同,编译耗费的时间不同。在我的B型树莓派编译过程花费了将近半个小时,编译完成后执行的测试套件又花费了差不多一个小时,总共花费了一个半小时左右。
5、配置golang运行环境变量
编译完成后,go目录下会生成bin目录,里面就是go的运行脚本。为了以后使用方法,可以将这个bin路径添加到PATH环境变量中。同样编辑~/.bashrc文件,因为前面设置过GOROOT环境变量指向go目录了,所以只需要在末尾加上
exportPATH=$PATH:$GOROOT/bin
保存后同样执行source~/.bashrc命令让环境变量生效。
至此,golang源代码编译安装成功。执行goversion应该就能看到当前golang的版本信息,表示编译安装成功。
‘贰’ 三、内核&文件系统编译
一、编译官方提供的内核源码
1、解压官方提供的内核源码包
2、根据官方提供的配置文件对内核进行配置,方式如下
make ARCH=arm xxxxx_defult_config
cp arch/arm/xxxxx_config .config
3、打开图形界面对内核进行配置,根据需要增加或者删除模块和其他内容
4、对内核进行编译
make ARCH=arm CROSS_COMPILE=arm-hisiv300-linux-uclibcgnueabi- uImage -j6
或者编辑Makefile文件,对其中的ARCH变量和CROSS_COMPILE变量进行修改,然后执行make uImage
5、在编译编译的时候回出现mkimage命令缺失,这个命令是UBootr提供的,在编译的UBoot路径下面找到这个命令,即可直接使用
6、编译的时候各个方面需要一致性,
1、编译的内核的交叉编译工具链如果支持硬件浮点数运算那么在配置内核的时候也需要添加硬件浮点数的支持
Kernel Features --->
[*] Use the ARM EABI to compile the kernel
2、在编译的内核的时候注意保持不要做太多的修改,否则会出问题
7、编译内核模块
make ARCH=arm CROSS_COMPILE=arm-hisiv300-linux-uclibcgnueabi- moles -j6
8、安装内核模块到指定的目录中去
make moles_install ARCH=arm CROSS_COMPILE=arm-hisiv300-linux-uclibcgnueabi- INSTALL_MOD_PATH=/home/fu/hisi/kernel/build
9、不要采用内核模块安装的命令来安装内核,因为内核不需要安装,在arch/arm/boot/uImage就是所需要的内核文件
二、编译官方提供的busybox来构建根文件系统
1、解压需要编译的busybox源码
2、进入源码中对busybox进行配置,主要是配置交叉编译工具链
Busybox Settings --->Build Options ---> 下面有关于busybox是否配置为采用共享库的模式,还有添加交叉编译工具链的前缀
3、配置需要的文件和命令进行添加或者删除
4、然后执行命令make -jn && make install
5、创建根文件系统需要的其他的文件和目录,在一个空白的目录中首先拷贝busybox/_install下面的bin、sbin、usr目录到空白目录中,在空白目录中创建其余的所需要的目录文件 bin dev etc home lib linuxrc mnt opt proc sbin sys tmp usr var等以上目录
6、接下来在lib目录中复制内核模块,在编译内核的时候模块安装在了指定的地方,直接拷贝过来就行。
6、创建文件系统所需要的其他文件,配置文件(最简单的办法就是直接复制busybox文件下面的example文件夹里面的东西)
1、/etc/inittab 填写或者 一下是最基本的,还有其他的需要填写
# /etc/inittab
::sysinit:/etc/init.d/rcS //指定初始化脚本
::askfirst:-/bin/sh //指定第一次输入回车后打开的shell
::ctrlaltdel:/sbin/reboot //指定这三个按键按下后的反应
::shutdown:/bin/umount -a -r //指定关机是进行的操作
2、/etc/init.d/rcS //这个就没有详细额硬性规定了,写入需要初始化的东西即可
#!/bin/sh
mount -a
3、/etc/fstab //写入mount -a是要自动挂载的文件系统
# device mount-point type options mp fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
7、拷贝需要用到的库文件,在交叉编译工具链下面存放
arm-linux-xxxxxx-gcc/lib
海思的开发板是在和tahet/lib下面,切记。
‘叁’ kiel tutinstm32文件能编译吗
可以。
STM32是ARM7核,而KEIL是ARM旗下的,KEIL只是一个开发环境,支持什_还需要下载相应的编译器,你原来如果是学51的,肯定有C51编译器,但是你需要去官网下载KEIL MDK就是所说的RVMDK,就是ARM的编译器,包含STM32,然后安装,然后看着教程打开KEIL选择相应的芯片来建立工程就行了,不过需要破解。
一般在STM32工程使用Keil编译之后,keil的build output窗口中会出现如图所示的输出信息,其中会显示code_笮。_O-data、RW-data、ZI-data大小。ARM程序的组成(ARM系统中正在执行的程序,而非保存在ROM中的BIN映像文件,请注意区别):一个ARM程序包含3个部分:RO,RW和ZI,RO是程序中的指令和常量;RW是程序中已经初始化的变量;ZI是程序中未经初始化的变量;以上3点可以理解为:RO就是readonly,RW就是read/write,ZI就是zeroARM映像文件的组成:所谓的ARM映像文件就是烧录到ROM中的BIN文件,也称为Image文件,以下用Image文件来替代。Image文件包含了RO和RW数据,之所以Image文件不包含ZI数据,那是因为ZI数据都是0,没必要包含,运行之前将ZI数据数据所在的区域清零即可,包含进去反而浪费存储空间补充一个问题:Q:为什么Image必须O,RW?A:因为RO中的指令和常量以及RW中初始化过的变量是不能像ZI那样无中生有的。
‘肆’ 为什么对arm进行裸机开发的时候不需要交叉编译环境,而进行linux移植的时候就需要呢
交叉编译只是用arm-linux-gcc,为什么要用这个编译器,因为Linux系统是用这个编译的,你想运行在linux平台运用程序,必须和系统是同一个版本的编译器。不是同一个版本都不能运行。
逻辑开发你也可以用gcc编译器啊,同样可以编译出bin文件,同样可以运行。
我们平时用的都是IDE,说白了就是在gcc的基础上加了简单容易操作的窗口,像添加断电、查看运行状态,这些在gcc下也是可以实现的,调试工具叫gdb。
‘伍’ 关于ARM的Linux系统的编程搭建
希望能帮到你,
1)让linux 在arm上运行,安卓底层也是linux.
2)gcc, arm-gcc等交叉编译工具,linux 源码,arm烧录工具。
3)一般用linux环境,win7可以编应用,驱动我没编过。
4)好象只能编应用,需要安装相应的插件
5)是arm , linux 是运行在电脑上的,要用交叉编译工具编译才能在arm上用
6)参考arm给的手册和工具,
7)可以。