找回密码
 立即注册
  • QQ空间
  • 回复
  • 收藏

7天实现基于嵌入式开发板的云计算平台搭建!第一步,移植操作系统

admin 2019-7-19 22:27 242人围观 嵌入式相关


我是张权,今日起正式入驻达尔闻,将给大家分享我在嵌入式系列研究的经验和成果。




> 复旦大学微电子在读硕士

> 从事数字芯片设计及嵌入式系统开发研究

> 擅长RISC-V指令集架构及AI处理器架构

> 树莓派爱好者

> 喜欢打篮球和慢跑

跟着我一起,一步步操作,7天实现基于嵌入式开发板的驱动设计和云计算平台的搭建!3篇超详细全文档攻略助你操作无障碍:本篇教你完成操作系统的移植,第二篇是驱动的设计,第三篇用网页调用设计的驱动和扩展部分云计算平台的搭建!”




正式进入今天分享的第一步,在开发板中移植一个操作系统和文件系统:


移植u-boot至SD卡

安装toolschain的命令:

    tar ‐zxvfarm‐linux‐gcc‐4.5.1‐v6‐vfp‐20120301.tgz
    在.bashrc文件里面添加工具链bin文件和lib文件路径:



    (点击可放大)

    生成u-boot文件:



    观察看到没有../../u-boot.bin与../mkbl2两个文件,但是在../目录夹Makefile下找到以下命令可生成mkbl2与sd_fdisk,下一步考虑怎么生成u-boot.bin文件。





    跳到../../目录夹下直接执行make all O=build发现有Error,如下图:



    通过观看Makefile,感觉如下有些东西暂时没有配置,后面会再尝试确定:



    下图可见config.mk基本奠定了此次编译的基调



    Build uboot的步骤:

    a)安装好toolchain (arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz)

    b)设置好环境变量PATH,保证可以正常使用,PATH设置在bin目录下

    c)配置 uboot 并编译
      cd uboot_tiny4412
      make tiny4412_config
      make

      d) 编译 用于生成bl2 的工具
        make ‐C sd_fuse
        或者
          cd sd_fusemake
          在执行make过程中,发现即使路径设置正确,仍爆出No such file or directory

          经过debug发现是32位程序运行在64位系统的错误,参考以下解决:
            # 确定有一个64架构的内核dpkg ‐‐print‐architecture# 结果会提示如下amd64# 确认打开多架构支持功能dpkg ‐‐print‐foreign‐architectures# 结果会如下提示i386# 打开多架构支持sudo dpkg ‐‐add‐architecture i386sudo apt‐get update# 检查拥有的库文件是否需要更新版本sudo apt‐get dist‐upgrade# 执行下面语句安装sudo apt‐get install lib32ncursesw5 lib32ncursesw5‐dev
            接着发现无法调用动态链接库



            问题仍是64位系统不能调用32位的动态链接库,解决方法如下

              sudo apt‐get install zlib1g:i386
              之后买了一张8G的内存卡,用读卡器接到PC主机上,内存被识别为/dev/sdb

              执行以下命令,烧入u-boot至内存卡中:
                cd sd_fuse/tiny4412./sd_fusing.sh /dev/sdb



                启动设备后,第一次没有看到虚拟机有任何反应,并没有进入到uboot终端,经考虑发现需要串口工具(原谅我第一次接触嵌入式系统开发,有点蠢),之后选用IPOP作为串口调试工具,并安装相关驱动



                之后会看到如下交互界面:



                每一次烧写都要重拔USB




                将u-boot移植至emmc

                首先需要格式化emmc,u-boot模式下输入以下指令来格式化emmc设备

                  >fdisk ‐c 1 320 2057 520
                  执行后会返回分区信息,继续格式化分区,需要注意第一分区是fat格式化,分区2,3,4作ext3格式化,至此格式化完成。
                    >fatformat mmc 1:1>ext3format mmc 1:2>ext3format mmc 1:3>ext3format mmc 1:4

                    然后需要下载固件到开发板内存中。首先打开emmc设备,u-boot下输入:
                      >emmc open 1eMMC OPEN Success.!!!!!Notice!!!!You must close eMMC boot Partition after all image writing!!eMMC boot partition has continuity at image writing time.!!So, Do not close boot partition, Before, all images is written.!

                      上面提示emmc开启成功,注意说明,emmc一旦打开,需要连续烧录,烧录完成后可以关闭emmc。

                      接下来运行dnw,u-boot下面输入:


                        >dnwOTG cable Connected!Now, Waiting for DNW to transmit data

                        提示等待数据输入,这里就是等待我们从PC端通过DNW传送数据过来。

                        此时在PC端加载到E4412_N.bl1.bin目录夹下,确认bl1.bin已经烧进去了,但是执行mmc write 1 0xc0000000 0x10没有反应,是为什么?



                        是因为我在上面少了一个0
                          mmc write 1 0xc0000000 0 0x10

                          之后同理,将bl2.bin, u-boot.bin, E4412_tzsw.bin加载进emmc
                            Board: emmc open 1Board: dnwPC : sudo dnw sd_fuse/tiny4412/E4412_N.bl1.binBoard: mmc write 1 0xc0000000 0 0x10Board: dnwPC : sudo dnw sd_fuse/bl2.binBoard: mmc write 1 0xc0000000 0x10 0x1CBoard: dnwPC : sudo dnw u‐boot.binBoard: mmc write 1 0xc0000000 0x30 0x21DBoard: dnwPC : sudo dnw sd_fuse/tiny4412/E4412_tzsw.binBoard: mmc write 1 0xc0000000 0x2c0 0xB8Board: emmc close 1

                            编译内核

                              tarxzf linux‐3.5‐20150929.tgzcdlinux‐3.5/cptiny4412_linux_defconfig .config(如果不执行这一步会遇到很多莫名的错误)makemenuconfig:去掉 Support TrustZone‐enabled Trusted Execution Environmentmake zImage
                              在运行make zImage时遇到三个没有找到头文件的问题,这里直接从其他路径下复制过来即可解决





                              然后又遇到以下问题



                              经在网上查询得知,是因为perl版本升级到了v5.22.1,将defined(@array)去掉了,可以直接使用数组判断非空。将if (!defined(@val))改为if (!@val),再次编译就 OK。

                              在编译mkfs_ext2.c文件的时候,会遇到没有ext2_fs.h的问题,里面许多宏和结构变量无法使用,这里我从工具链中将头文件放在内核根目录include子目录下直接调用







                              最终内核编译结果如下




                              制作根文件系统

                              一、根文件系统创建

                              1、编译、安装busybox
                                tar xzf busybox‐1.17.2‐20101120.tgzmake menuconfig :添加交叉编译选项(arm‐linux‐) //也可以通过修改Makefile实现makemake CONFIG_PREFIX=/work/nfs_root/francis_linux_fs install
                                2、安装链接库

                                找到工具链下的库的目录并将lib库复制粘贴到自己的根文件系统中
                                  mkdirlibmkdirusr/libcd/opt/FriendlyARM/toolschain/4.5.1/arm‐none‐linux‐gnueabi/sys‐root/usr/libcp*so* /work/nfs_root/francis_linux_fs/usr/lib ‐dcd/opt/FriendlyARM/toolschain/4.5.1/arm‐none‐linux‐gnueabi/sys‐root/libcp*so* /work/nfs_root/francis_linux_fs/lib ‐d

                                  3、构建etc目录

                                  在etc目录下创建inttab文件,内容如下:
                                    # /etc/inittab::sysinit:/etc/init.d/rcS //初始化执行rcS文件console::askfirst:‐/bin/sh::ctrlaltdel:/sbin/reboot //重启指令::shutdown:/bin/umount ‐a ‐r // 关机
                                    在etc目录夹下继续创建init.d文件夹,并在init.d目录下创建rcS脚本文件,文件内容如下:
                                      #!/bin/shmount ‐amkdir /dev/ptsmount ‐t devpts devpts /dev/ptsecho /sbin/mdev > /proc/sys/kernel/hotplug
                                      在rcS里面可以添加:
                                        #PATH变量PATH=/sbin:/bin:/usr/sbin:/usr/binrunlevel=S //单用户模式prelevel=Numask 022//决定用户创建目录夹的权限,加起来为666export PATH runlevel prelevelmount ‐a //挂载所有应该被挂载的文件系统,这些文件以及格式包含在fstab里面/bin/hostname ‐F /etc/sysconfig/HOSTNAME //设置主机名ifconfig eth0 xxx.xxx.xxx.xxx //设置 ip地址
                                        并给这个文件加上可执行权限:chmod +x rcS

                                        在etc目录下创建fstab文件,内容如下:
                                          # device mount‐point type options dump fsck orderproc/proc proc defaults 0 0tmpfs/tmp tmpfs defaults 0 0sysfs/sys sysfs defaults 0 0tmpfs/dev tmpfs defaults 0 0
                                          4、构建dev目录

                                          在这个目录下添加两个设备文件:console和null文件,执行以下命令
                                            sudo mknod console c 51sudo mknod null c 13
                                            5、构建其他目录
                                              mkdir proc sys tmp mnt root
                                              二、根文件系统镜像文件制作
                                                ddif=/dev/zero of=francis_linux_fs_64M.img bs=1M count=64sudolosetup /dev/loop0 francis_linux_fs_64M.imgsudomkfs.ext4 /dev/loop0cd/work/nfs_root/francis_linux_fs/sudomount /dev/loop0 /mntsudocp * ‐rfd /mntsudoumount /mntsudolosetup ‐d /dev/loop0

                                                通过fastboot烧写内核和根文件系统


                                                1、fastboot指令的安装

                                                  sudo apt‐get updatesudo apt‐getinstall android‐tools‐fastboot
                                                  2、移植内核和根文件系统镜像

                                                  将开发板设置为emmc启动,在u-boot命令行模式下让开发板执行:fastboot

                                                  在PC机上(装有fastboot命令)执行下面命令下载内核和根文件系统镜像:
                                                    fastbootflash kernel zImagefastbootflash fat francis_linux_fs_64M.imgfastbootreboot
                                                    在u-boot下设置一下启动参数
                                                      set bootargs "root=/dev/mmcblk0p1 rootfstype=ext4 console=ttySAC0,115200init=/linuxrc ctp=2 lcd=S70"set bootcmd "movi read kernel 0 0x40008000; bootm 0x40008000"savefast

                                                      开发板挂接NFS文件系统

                                                      1、主机安装NFS服务

                                                      首先要确认linux主机是否安装有NFS服务
                                                        $ ls ‐al /etc/init.d/nfs‐kernel‐server // 查看是否存在nfs服务
                                                        如果没有需要手动安装nfs-kernel-server服务
                                                          $ sudo apt‐get install nfs‐kernel‐server
                                                          修改 /etc/exports 文件,增加需要挂在的目录 /mnt *(rw, sync),(其中/mnt是要被挂在的目录,*表示任何服务器,也可以写客户端的IP地址,(rw,sync)表示挂载文件系统时的策略,rw表示读写,sync表示同步进行IO操作,还有其他的一些选项async(非同步进行IO操作)),然后重启nfs服务
                                                            $ sudo /etc/init.d/nfs‐kernel‐server restart
                                                            2、确保主机,网关,开发板在同一网段

                                                            因为是在笔记本上操作,所以需要将准备三根网线和一个交换器,其中一根连接以太网,一根连接笔记本,最后一根连接开发板。

                                                            查询host主机ip作为serverip为192.168.100.107



                                                            随后查询笔记本ip作为网关为192.168.100.106



                                                              ifconfigeth0 192.168.100.108# 设置网关routeadddefaultgw 192.168.100.106
                                                              之后在板子上执行以下命令进行挂载
                                                                $ sudo mount ‐o ‐nolock ‐t nfs 10.24.21.143:/home/edision/work/nfs_root/francis_linux_fs /test




                                                                结果如上图所示,至此,7天实现嵌入式开饭云计算平台搭建的第一步移植操作系统就完成了。

                                                                步骤很详细,祝你成功,如在移植过程中遇到问题,可以进达尔闻技术交流群找我。

                                                                第一步完成的老铁,可以进入第二篇,继续升级学习驱动的设计。









                                                                ----------------------------------------------------------------------------------------------------------------------
                                                                我们尊重原创,也注重分享,文章来源于微信公众号:达尔闻说,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
                                                                ----------------------------------------------------------------------------------------------------------------------

                                                                鲜花

                                                                握手

                                                                雷人

                                                                路过

                                                                鸡蛋

                                                                yafeilinux和他的朋友们微信公众号二维码

                                                                微信公众号

                                                                专注于Qt嵌入式Linux开发等。扫一扫立即关注。

                                                                Qt开源社区官方QQ群二维码

                                                                QQ交流群

                                                                欢迎加入QQ群大家庭,一起讨论学习!

                                                                我有话说......