嵌入式设备开发专题《tiny4412开发,嵌入式linux开发环境搭建》

    xiaoxiao2021-04-15  32

    嵌入式linux开发基础:

    1.系统组成:

    嵌入式linux系统的组成包括三部分:bootloader程序、linux内核、根文件系统

    bootloader程序:系统上电后首先要执行的程序,主要功能是硬件初始化,为启动linux内核准备环境

    linux内核:操作系统的核心部分,是一个单一的文件(zImage或uImage)

    根文件系统:包括操作系统的一些系统工具,c函数库等

    2.启动流程

    系统上电后,启动bootloader程序,完成硬件的初始化工作--》将内核加载到内存,启动内核--》挂载根文件系统,启动一个用户进程init--》启动一个shell程序

    3.交叉开发环境

    交叉开发的原意是将编译和运行分开,在高性能的pc上进行编译(使用交叉编译器),在ARM板上运行经过pc编译的程序

     

    嵌入式linux开发原理图:

     

    嵌入式linux开发环境配置:

    1.U-BOOT和内核配置:

     

    U-BOOT源码:uboot_tiny4412-org.tar.bz2U-BOOT补丁文件:uboot.patch

    内核源码:linux-4.4.19.tar.gz内核源码补丁文件:linux-4.4.19.patch

    问:什么是补丁?

    在linux内核社区中,补丁是通用语,你可以以补丁的形式发布对代码的修改,也可以以补丁的形式接收其他人所做的修改。增量补丁可以作为版本转移的桥梁。你不再需要下载庞大的内核源码的全部压缩,而只需给旧版本打上一个增量补丁,让其旧貌换颜。这不仅节约了宽带,还节省了时间。应用增量补丁,从你的源码树目录中运行:patch -p1 < ../patch-x.y.z

    -----------------------------------------------------------------------------------------------------------------------------

     

    解压,修改,编译U-BOOT,烧写到SD卡:(这里看官方文档写的,没什么好解释的!)

    tar  -jxvf  uboot_tiny4412-org.tar.bz2

    cd uboot_tiny4412

    patch –p1 < ../uboot.patch//打补丁(提醒一下,-p1中的‘1’是“123”中的1)

    make tiny4412_config

    make

    cd sd_fuse

    make

    sudo umount /media/FRIENDLYARM

    cd tiny4412

    sudo ./sd_fusing.sh  /dev/sdb

    等待烧写完毕

    ------------------------------------------------------------------------------------------------------------------------------

    解压、修改、配置编译内核

     

    tar  -zxvf  linux-4.4.19.tar.gz

    cd linux-4.4.19

    patch –p1 < ../ linux-4.4.19.patch//打补丁(提醒一下,-p1中的‘1’是“123”中的1)

    make exynos_defconfig//这条命令会基于默认的配置为你的体系结构创建一个配置

    make menuconfig//启动利用基于ncurse库编制的图形配置工具

     这里会出现一个蓝色的GUI配置菜单(注意这时候虚拟机不能够缩放过小,不然配置菜单不能显示而且提示出错,我在这里犯了错)

    General setup  ---> 

    (-xxxx) Localversion - append to kernel release     版本中加入自己的姓名拼音

    DeviceDrivers  --->

     [*] Network device support  ---> 

    <*>   USB NetworkAdapters  ---> 

    <*>  Davicom DM96xxbased USB 10/100 ethernet devices

    [*] USBsupport  --->

    <*>   USB4640 HSIC toUSB20 Driver

     

    配置完成后保存,保存后别忘记了一下工作,不然上面的配置就白做了!!

    编译内核:make uImage  LOADADDR=0x40008000 -j2(编译后得到内核路径:arch/arm/boot/uImage)

    编译设备树:make dtbs(编译后得到设备树路径:arch/arm/boot/dts/ exynos4412-tiny4412.dtb)

    ---------------------------------------------------------------------------------------------------------------------------

    2.把pc机上编译的内核加载到开发板内存中

    SD卡插入开发板,启动方式选择SD卡启动,上电后3s内按下键盘上任意键

    putty串口终端输入:

     

    setenv bootargs root=/dev/nfs rw//指定文件系统为基于nfs的文件系统 nfsroot= 192.168.1.88:/opt/rootfs//虚拟机ip地址(serverip)和网络挂载根文件路径 ethmac=c2:01:0d:30:3a:88//(这里我理解不深入) ip= 192.168.1.230: 192.168.1.88: 192.168.1.1:255.255.255.0::eth0:off console=ttySAC0,115200 //开发板ip:虚拟机ip:两者网关:两者掩码::etho:off 指定开发板特定的串口,波特率 init=/sbin/init//内核启动后,进入系统中第一个运行的程序

     

    然后运行命令:save

    这里介绍一下U-BOOT常用命令:

     

    help帮助,列出所有命令printenv打印环境变量setenv设置环境变量(格式:setenv 变量名 变量值)saveenv保存设定的环境变量(例如:bootcmd、bootargs)save保存所做的配置bootm直接跳转到可执行文件的入口地址并执行bootargs(非命令)启动linux内核时,传递给内核的字符串参数bootcmd(非命令)自动启动的命令序列

     

     

     

    192.168.1.88 :虚拟机 ip 192.168.1.230: 开发板 ip 192.168.1.1:虚拟机和开发板 网关要一致   255.255.255.0 :虚拟机和开发版子网掩码要一致   注意:使用虚拟机和开发板网络挂载根文件系统的方式,虚拟机一定要设置成桥接,并设置合适ip,子网掩码,默认网关              

     

     

     

    敲以下代码:

     

    开发板串口终端putty linux虚拟机dnw 0x40600000sudo dnw arch/arm/boot/uImage

    dnw 0x41000000

    sudo dnw arch/arm/boot/dts/ exynos4412-tiny4412.dtb

    bootm 0x40600000 – 0x41000000

     

    开发板端下载内核、设备树以及启动内核的这3条命令可设置进U-BOOT环境变量bootcmd:

     

    setenv bootcmd dnw 0x40600000\;dnw0x41000000\;bootm 0x40600000 - 0x41000000//自动启动的命令序列

    save

    这样下次启动开发板就会自动执行者三条命令

     

    3.内核启动后,自动挂载网络文件系统,登录开发板的linux系统

     

    串口终端输入:uname –r查看内核版本

    4.交叉开发

    在pc机上,交叉编译一个"hello.c"程序,在开发板上运行

    在pc机上交叉编译源码hello.c:

    arm-linux-gcc -g hello.c -o hello-arm

    将编译好的程序hello-arm拷贝到共享目录中:

    cp hello-arm /opt/roofs

    在开发板上运行程序hello-arm(在putty终端上操作)

    ./hello-arm

    这时候你该看到hello world!

    5.交叉调试

    pc机上的调试器arm-linux-gdb通过网络与目标板的gdbserver通信,由gdbserver去控制调试目标,具体操作如下:

    (1)将交叉编译器里面的gdbserver复制到开发板的根文件系统/opt/rootfs/usr/bin目录(gdbserver在解压后的交叉编译器里面:/opt/crosstool/4.8.2/arm-none-linux-gnueabi/debug-root/usr/bin)

    在pc机上运行:cp  /opt/crosstool/4.8.2/arm-none-linux-gnueabi/debug-root/usr/bin/gdbserver  /opt/rootfs/usr/bin/

    (2)在开发板(putty串口终端操作),启动调试服务器(gdbserver)

    gdbserver 192.168.1.230:2345 ./hello-arm(其中192.168.1.230表示开发板的ip地址,2345表示端口号)

    (3)在pc机上启动交叉调试器调试程序

    arm-linux-gdb hello-arm(这里要注意hello-arm在什么目录下,我就不多说了)

    进入调试界面后,要输入下面的命令来连接目标版的调试服务器

    (gdb)target remote 192.168.1.230:2345

     

    注意:gdbserver只是提供了交叉调试过程中pc机和开发板通信的一种方法(和tcp/ip协议相似),而真正进行调试的是arm-linux-gdb命令(虚拟机上安装,开发板一般不会安装)

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    转载请注明原文地址: https://ju.6miu.com/read-671417.html

    最新回复(0)