Day1 一些基础知识和想法

想法

  1. 为什么要在Linux上操作,而不是Windows或者mac,mac是arm不是更好吗
    最初的理解:
  • 厂家对mac的支持太少,基本上软件都是x86且Windows系统的,基本上摆脱嵌入式使用mac的可能

  • 嵌入式设备本身使用的是Linux内核,从逻辑上来说,使用Linux编程它更符合操作习惯
    学习后发现:

  • 前面理解基本正确

  • 在Linux中,很多操作例如链接文件在Windows中机制不同,很多嵌入式设备的操作必须要在Linux中编译完成.(在Windows中解压Linux文件时就常遇到链接错误)

基础知识

  1. 磁盘分区挂载在某个目录
    理解: Linux将分区挂载到目录,意味着当你访问某个目录时,Linux会确认这个目录是被哪个分区挂载,然后去访问这个分区中的内容

即将分区1挂载在/下,进行一系列文件操作
然后也将分区2挂载在/下,现在访问/将访问分区2,之前的操作将无法访问

  1. 环境变量的几种设置
  • 只对当前终端有效
    1
    export PATH=$PATH:/path
  • 对当前用户有效
    1
    2
    # 在~/.bashrc中添加
    export PATH=$PATH:/path
  • 对所有用户有效
    1
    2
    # 在etc/environment中添加
    export PATH=$PATH:/path
  1. 嵌入式设备的启动过程
  • 加载uboot :

    1. 选择启动设备(闪存、SD卡、网络等)
    2. 加载内核镜像(uImage)到内存
  • 加载内核kernel :

    1. 内核被引导到内存后初始化基本功能,
    2. 挂载根文件系统,配置文件为/etc/fstab
    3. 等待登陆
  • 启动系统初始化进程init :

    1. 其配置文件为/etc/inittab或/etc/systemd ,该进程负责启动并管理其他用户空间进程,该进程在整个系统运行期间都存在
    2. 根据配置文件,找到并执行初始化脚本rcS,rcS一般会进行主机名配置(获取/etc/sysconfig/HOSTNAME)、启动级别配置
  • 用户空间初始化 :

    1. 用户登陆(配置文件为/etc/passwd和/etc/shadow)其中passwd指定了shell的启动路径,shell被启动
    2. Shell 读取并执行用户配置文件(例如 /etc/profile 和用户的 ~/.bashrc)配置完后显示配置的命令提示行,例如root@buweihao
  • 进入应用程序 :
    这些应用程序可能包括各种任务,如通信、传感器数据采集、控制外设等。

根目录各个文件夹

C001
具体内容跳到2.1.4

命令解释器shell的逻辑

以下是shell的执行步骤

  1. shell会从键盘或串口接收命令,并将其显示于终端
  2. 当shell接收回车时开始解析命令
  3. 查找PATH中的命令对应的可执行文件
  4. 将命令和参数输送到对应的程序,并执行
  5. 输出程序返回的结果到终端

开发环境网络设置

目的: 使用NFS或者tftp.NFS可以将嵌入式设备的目录挂载在ubuntu中,tftp则是一种轻量级传输协议,可以提供方便的文件互传,都可以提高开发效率
操作:

一、理解网卡

  • NAT网卡
    通过和宿主机交换信息,宿主机和外网相连的方式达到目的

  • 桥接网卡(一般为真实物理网卡)
    将服务器直接于嵌入式设备相连交换信息

  • 在虚拟机中添加一个网卡,选择桥接模式

  • 在Windows的虚拟网络编辑器中选择正确的网口

二、人工指定网络IP
三者的网段要一致

  • 设置Ubuntu的ipv4网络(机器码设为11)
  • 设置Windows的ipv4网络(机器码设为10)
  • 设置开发版网络(机器码设为9)
    1
    2
    setenv ip 192.168.1.9
    setenv gateway 192.168.1.1
  • 实现互ping

Day2开发环境的进一步建立

在Windows端配置软件

  • MobaXterm 用于登陆Linux命令终端 (可以直接在虚拟机操作,但它也可以连开发版,切换方便)
  • Source Lnsight 用于编程 (轻量级阅读代码)
  • FileZilla 用于与Linux文件互传 (VMtools不是可以直接通过拖拽吗,要它何用?)

在Linux端配置软件

  • tftp(轻量级传输协议,通过网络传输文件、引导、更新固件)
  • nfs(将目录挂载到本地)
  • vim

BSP

配置专用gcc交叉编译器

一、将交叉编译工具放到Linux中后,环境变量添加以下几行

1 export ARCH=arm # 表示为arm架构编译文件

2 export CROSS_COMPILE=arm-none-linux-gnueabi- # 编译工具gcc的前缀

3 export PATH=$PATH:/home/book/Desktop/arm-2009q3/bin # 编译工具的bin地址

以下是代码,也可以通过vim来手动添加

1
2
3
echo 'export ARCH=arm
export CROSS_COMPILE=arm-none-linux-gnueabi-
export PATH=$PATH:/home/book/Desktop/arm-2009q3/bin' >> ~/.bashrc

二、通过env命令查看环境变量是否设置正确

三、在交叉编译软件目录下使用.sh文件批量建立gcc交叉编译软件符号链接?是否意味着编译软件中的大量gcc需要一一对应不同的具体交叉编译情况,具体如何操作暂时存疑

配置u-boot

配置kernel内核

移植rootft根文件系统

根文件系统有镜像文件形式(内化格式)和文件夹形式

镜像形式生成根文件系统

  1. 创建dev、proc、sys、tmp、var、root、lib文件夹,移植一些必要的内容, 跳转到文件夹内容详情
  • lib为库文件,将特定的编译器下lib文件复制到此处

  • etc下创建profile脚本,在用户登陆时将会自动运行,示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # Global profile configuration for all users

    # No core files by default
    ulimit -S -c 0 > /dev/null 2>&1

    # Set user-related environment variables
    USER="`id -un`"
    LOGNAME=$USER
    PS1='[\u@\h \W]\# '
    PATH=$PATH

    # Get the hostname
    HOSTNAME=`/bin/hostname`

    # Export environment variables
    export USER LOGNAME PS1 PATH HOSTNAME
  • root为root用户文件夹

  1. 进行挂载
1
2
3
4
5
6
7
8
# 从/dev/zero设备中读取数据,然后写入到名为rootfs.ext2的文件中,每次写入的块大小为1MB,总共写入10块,这里创建出一个空内容的镜像文件
dd if=/dev/zero of=rootfs.ext2 bs=1M count=10
# 将前面的空映像文件映射到块设备1
losetup /dev/loop1 rootfs.ext2
# 在设备1中创建一个ext2文件系统
mke2fs -m 0 /dev/loop1 10240
# 将设备1挂载到./rootfs/下
mount -t ext2 /dev/loop1 ./rootfs/
  1. 将1中创建的文件夹导入到./rootfs/下,rootfs.ext2就已经可以用啦 ! 可以通过fastboot烧录到开发版
  2. 开发版在uboot命令行下输入fastboot进入fastboot状态
  3. Windows将根文件镜像文件放到fastboot目录,在fastboot目录开启命令行,执行fastboot flash system rootfs.ext2

文件夹形式生成根文件系统

如前面的1,将文件夹创建完就已经是完整的根文件系统

通过Source Lnsight查看内核源码

内核源码在工作中非常重要,需要熟悉如何查看它

  1. 在option中的file type option文件类型中添加*.s文件,这样才能识别汇编文件
  2. 创建new project导入源码文件夹
  3. 识别文件时勾选add all且递归所有子目录
  4. 再在project下Synchronize Files中勾选强制重加载所有文件
  5. 在search中点击Browse Project Symbols,就可以在project files中选择要查看的源文件
    C002

将通过串口使电脑连接开发版

目的:使Windows通过串口将指令发送到嵌入式开发版设备

操作:

  • 用串口线连接两台设备
  • 通过MobaXterm创建新的session,选择Serial,完成配置后开机开发版

通过nfs将开发版的目录挂载到ubuntu中

目的: 挂载操作使得开发效率大大提高

操作:

嵌入式设备nfs配置

由于使用的嵌入式设备X210是已经配置过,因此只需要学会阅读信息即可
使用命令printenv打印信息

1
2
3
4
5
6
7
8
9
10
11
x210 # printenv
mtdpart=80000 400000 3000000
bootdelay=3
baudrate=115200
ethaddr=00:40:5c:26:0a:5b
ipaddr=192.168.1.88
serverip=192.168.1.141
netmask=255.255.255.0
gatewayip=192.168.1.1
bootcmd=tftpboot 30008000 zImage;bootm 30008000
bootargs=root=/mnt/nfs/ nfsroot=192.168.1.141:/root/rootfs/rootfs_test ip=192.168.1.88:192.168.1.141:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC2,115200

可以看到设备1.88被设置为从1.141这个服务器下载/root/rootfs/rootfs_test目录下的文件,因此我们的服务器ip和目录都应该相应设置正确

ubuntu配置nfs

首先,我们需要创建/root/rootfs/rootfs_test目录

1
mkdir -p /root/share_nfs

然后,将这个目录设置为允许1.88访问的nfs的服务器目录,重启服务

1
2
3
4
echo '/root/share_nfs 192.168.1.88(rw,sync,no_subtree_check)' >> /etc/exports
sudo exportfs -a
sudo service nfs-kernel-server restart

最后,进行挂载操作
share_nfs为本地文件夹路径

1
sudo mount -t nfs 192.168.1.88:/root/rootfs/rootf_test  /root/share_nfs