1. bread电子发烧友论坛/
  2. 嵌入式论坛/
    1. 电子论坛综合区
    2. 嵌入式论坛
    3. 电源技术论坛
    4. 硬件设计论坛
    5. 测试测量论坛
    6. 检测技术与质量
    7. EDA设计论坛
    8. 综合技术与应用
    9. 开源硬件
    10. IC设计论坛
    11. 消费电子论坛
    12. 无线通信论坛
    13. 个人版区
    14. 厂商专区
    15. 论坛服务区
    16. 高校联盟
    17. 供求信息发布
  3. ARM技术论坛
    1. Android论坛
    2. Linux论坛
    3. 单片机/MCU论坛
    4. FPGA|CPLD|ASIC论坛
    5. DSP论坛
    6. 嵌入式系统论坛
  4. / 嵌入式Linux系统与单片机比较及快速搭建系统 ...
    关闭提示

[经验] 嵌入式Linux系统与单片机比较及快速搭建系统

[复制链接]
版主
发表于 2017-4-21 16:26:56   3857 查看 4 回复 只看该作者 倒序浏览
分享
本帖最后由 weidongshan 于 2017-6-1 11:19 编辑

嵌入式Linux系统与单片机比较及快速搭建系统
作者:韦东山

注意:
作为入门,首选JZ2440开发板,资料丰富,视频齐全。
原理是相同的,使用JZ2440所学知识完全适用于其他板子。
本文使用nanoPI作为例子,所涉及主要知识都来自JZ2440的资料及视频。                        


  
类别
  
内容
关键词
单片机、嵌入式linux
摘要
1)单片机与linux系统的对比
  
2)嵌入式Linux系统组成
  
3)怎么快速构建自己的根文件系统,以nanoPI为例
当前版本
V1
编辑
韦东山,王辉,黄成
审核
韦东山



修订历史
  
版本
  
更改日期
更改说明
v1
2017.04.18
初建,2017.04.19腾讯直播前夜发布





1.  嵌入式Linux与单片机的比较
现在的电子专业,仍以单片机C51为基础教程,条件好点的使用STM32单片机。
单片机还有用吗?
有用!看看现在热卖的小米智能插座,它就是使用Cortex-M4核的MW300做的。
单片机容易学吗?
相对来说,单片机挺容易学的。
问题来了,容易学的东西,会的人就多;
会的人多了,工资就低。
为了前途,为了钱途,我们必须升级!

从知识的角度来说,会Linux操作系统的人,肯定会单片机;反过来,会单片机的人,不一定会Linux。
所以,如果你对电子专业有兴趣,开始学习嵌入式Linux吧。
那还要不要学习单片机?对于这个问题,我有专门的论述:http://bbs.elecfans.com/forum.ph ... &tid=1122109&extra=
请看“2.2.4 要不要专门学习Windows下的单片机开发”。

1.1  以全志H3、STM32F407为例进行比较
以下是芯片资源的比较:

最直观的区别:主频、内存、GPU、显示系统。

以下是开发板价格的比较:
STM32:

nanoPi:

可以得出这样的结论:
①  在硬件性能方面,H3秒杀STM32F407
②  在硬件价格方面,以核心板为例,它们差不多
③  在对外接口方面,各有千秋
④  在软件可扩展方面,H3超越STM32F407太多

看了这些比较,你还会因为“精通STM32”而自得吗?我见过很多工作多年的单片机工程师,30多岁、40多岁发邮件给我们团队、电话联系我们团队,希望从单片机转型到linux提供一些学习的建议和帮助。
如果你不具备特殊行业(如:医疗、工业)的相关算法(如:传感器、电机控制),你只会使用STM32点亮一个LED灯,会操作UART、SPI、I2C等外设,很可能下一个转型的就是你!
但是,请你千万不要误会,我没有看不起“单片机”。
设计产品时,我会选择最优方案:
① 如果使用1、2元钱的C51可以实现同样的功能,我干嘛选用30元的STM32,干嘛选用更贵的嵌入式Linux?
② 性价比相同之下,我当然选择开发难度更小的单片机
③ 并且对于功耗要求更低的系统,经常是“单片机+嵌入式Linux”组合

我只是从学习的角度说,你掌握了嵌入式Linux,再回头很容易掌握单片机;而掌握了单片机,需要再升级一下进入Linux的世界。

1.2  实际产品对比嵌入式Linux、单片机
  
  
单片机
  
如51、STM32、AVR、MSP430等
嵌入式linux SOC芯片
  
如s3c2440、全志H3、s3c4412
主频
51      :12Mhz
  
STM32F1:72Mhz
  
STM32F4:128Mhz
S3c2440:单核400Mhz
  
全志H3: 4核1.2G
  
s3c4412: 4核1.4G
内存
内部自带RAM,一般32KB—128KB
SDRAM、DDR2、DDR3
  
常见:64MB、256MB、512MB
存储设备
Flash,一般为64KB ---512KB
Nand   flash、emmc
  
常见256MB、512MB、1GB
显示设备
一般为TFT显示屏
  
缺点:由于主频限制,在切换图片显示时,卡顿不流畅。
可外接VGA显示器、HDMI显示器、
  
消费类电子产品,越来越趋向于分辨率大,多屏显示
摄像头
有些高端一点的单片机可外接cmos摄像头
  
缺点:由于主频限制,对摄像头的数据处理仍然卡顿
Usb接口的摄像头、mipi接口的摄像头
  
网络
使用简单的网络协议栈如lwip
  
缺点:网络应用程序太少,没有实现完整的网络协议栈
完整的网络协议栈、
  
应用程序:socket编程,HTTP服务器、PHP服务器

所以:
单片机只能适合于简单的命令控制、数据采集、数据处理、数据传输等场合。
嵌入式Linux适用于人机交互的场合,适用于多任务的场合。

以下是一些产品。

2.  嵌入式Linux系统上的第1个程序
2.1  编写、编译HelloWorld
hello.c:
  • #include <stdio.h>
  • int main(int argc, char **argv)
  • {
  • printf("Hello, world!\n");
  • return 0;
  • }
  • 复制代码

    编译:
  • $ gcc -o hello hello.c    // 为PC编译
  • $ ./hello                    // 测试一下
  • $ arm-linux-gcc -o hello hello.c   // 为ARM编译,这个程序需要放到开发板上
  • 复制代码

    注意:要使用arm-linux-gcc编译,需要先安装交叉编译工具链,请参考后面的4.1节。

    2.2  怎么执行:放到板子上,然后运行
    可以通过U盘,也可以通过NFS。
    开发过程中,多用NFS,调试很方便

    2.3  想自动运行,怎么办?
    你要先看完第4课,制作好自己的根文件系统后,再修改/etc/inittab或/etc/init.d/rcS。
    比如对于hello程序,可以这样修改:
    (1)   hello程序只执行一次,修改/etc/inittab,添加这行:
  • ::once:/bin/hello >
  • /tmp/hello.log  2>&1
  • 复制代码
    它的含义是只执行hello程序一次,里面的printf信息写到/tmp/hello.log(文件句柄为1);“2>&1”表示如果有错误信息(文件句柄2),也打印到文件句柄1对应的文件/tmp/hello.log去。

    (2)   hello程序退出后又重新执行,修改/etc/inittab,添加这行:
  • ::respawn:/bin/hello >
  • /tmp/hello.log  2>&1
  • 复制代码
    (3)   hello程序只执行一次,修改/etc/init.d/rcS,添加这行:
  • /bin/hello >
  • /tmp/hello2.log 2>&1  &
  • 复制代码
             最后的“&”表示让hello程序在后台运行。
    3.  嵌入式Linux系统组成
    3.1  系统组成
    嵌入式Linux系统包含哪些东西?不要急,举一个例子你就知道了。

    ①      PC里,BIOS首先运行,做一些自检,然后启动Windows;
    嵌入式Linux里,对应的程序被称为bootloader,它的目的也是启动Linux内核

    ②      操作系统内核:Windows、Linux
    提供文件管理、内存管理、进程调度、驱动程序等功能;
    工作中,我们一般会编写驱动程序,通过驱动程序访问硬件。

    ③      我们买电脑、手机、平板,目的是为了使用各种APP:游戏、QQ、微信
    这些程序在哪里?
    对于PC,它位于C盘、D盘上;C盘是系统盘,存放各种系统文件;D盘给我们自己用
    对于嵌入式Linux,这些系统文件位于“根文件系统”里,挂载了“根文件系统”后,可以再挂载位于其他分区上的其他“文件系统”。

    所以,嵌入式Linux+Android系统包含以下3部分内容:
    (1)  bootloader
    (2)  Linux内核
    (3)  根文件系统:里面含有系统文件、驱动程序、应用程序

    3.2  分析nanoPi的刷机包
    分析依据:友善之臂官方WIKI
    http://wiki.friendlyarm.com/wiki/index.php/NanoPi_NEO/zh
    http://wiki.friendlyarm.com/wiki/index.php/NanoPi_M1/zh

    (1)   更新u-boot:
    WIKI中说更新TF卡上的U-boot的方法为:
  • $ ./fuse_uboot.sh /dev/sdx
  • 复制代码
    分析fuse_uboot.sh,可知它实际上做如下事情:
    boot0_fex=boot0_sdcard.fex
    uboot_fex=u-boot.fex
    cd tools/pack/out/ >/dev/null
    [ -e ${boot0_fex} ]&& dd if=${boot0_fex} of=${SDCARD} bs=1k seek=8
    [ -e ${uboot_fex} ]&& dd if=${uboot_fex} of=${SDCARD} bs=1k seek=16400
    sync
    A.  bootloader分为两部分:boot0_sdcard.fex、u-boot.fex
    B. 分别位于SD卡上偏移地址8K、16400K处,大小分别有32K、900K左右。

    (2)   更新内核:
    WIKI中说更新TF卡上的内核的方法为,先编译:
  • $ ./build.sh -p
  • sun8iw7p1 -b nanopi-h3 -m kernel
  • 复制代码
    编译完成后内核boot.img和驱动模块均位于linux-3.4/output目录下,将boot.img拷贝到TF卡的boot分区的根目录即可。

    分析整个过程,发现它编译内核的方法为:
    $ cd linux-3.4
    $ cp arch/arm/configs/sun8iw7p1smp_defconfig.config

    $ make ARCH=armCROSS_COMPILE=arm-linux-gnueabi- -j4 uImage modules

    上述命编译出了内核映象uImage、bImage,也编译出了各个模块(.ko)文件;
    最后,把bImage、一个RAMFS根文件系统rootfs.cpio.gz一起打包为boot.img。
             更新内核时,把boot.img放入SD卡的第1个分区。

            如果我们要重新配置内核,可以这样做:
    $ export PATH=/your_lichee_dir/brandy/toolchain/gcc-arm/bin:$PATH
    $ cd linux-3.4
    $ make ARCH=armCROSS_COMPILE=arm-linux-gnueabi-  menuconfig
    $ cd ..
    $ ./build.sh -psun8iw7p1 -b nanopi-h3 -m kernel

    然后把linux-3.4/output目录下的boot.img复制到SD卡的第1个分区里。
    (3)   更新文件系统
    WIFI上没有说明,但是可以从启动信息看出,它位于SD卡第2个分区,启动信息如下 :
  • Kernel command line:
  • console=ttyS0,115200 console=tty0 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait
  • init=/sbin/init
  • 复制代码

    总结,nanoPI的SD卡里,有如下内容:



    4.  构造最小根文件系统
    4.1  自己制作最小根文件系统
    参考《嵌入式Linux应用开发完全手册》“第17章 构建Linux根文件系统”,韦东山Linux视频第1期的第11课。看完这一章书,一课视频,相信你就可以完全掌握根文件系统了。
    下面只是罗列出制作根文件系统所用的命令。

    (1)   准备材料:交叉编译工具链、busybox。全志提供的编译器只能编译内核,无法编译应用程序,我们从友善之臂官网下载新的编译器。它的WIFI上是这样说明的:
    $ git clone https://github.com/friendlyarm/prebuilts.git
    $ sudo mkdir -p/opt/FriendlyARM/toolchain
    $ sudo tar xfprebuilts/gcc-x64/arm-cortexa9-linux-gnueabihf-4.9.3.tar.xz -C/opt/FriendlyARM/toolchain/
    但是在国内访问github实在太慢,我把它上传到git.coding.net去了,可以用以下命令下载、安装:
    $ git clone https://git.coding.net/weidongshan/nanoPI_app_toolchain.git
    $ sudo mkdir -p/opt/FriendlyARM/toolchain
    $ sudo tar xf  \
    nanoPI_app_toolchain/gcc-x64/arm-cortexa9-linux-gnueabihf-4.9.3.tar.xz\
    -C /opt/FriendlyARM/toolchain/
    以后使用这个编译前,需要先设置PATH环境变量:
  • $ export PATH=/opt/FriendlyARM/toolchain/4.9.3/bin/:$PATH
  • 复制代码
    busybox: 从官网https://busybox.net/,下载busybox-1.26.2.tar.bz2

    (1)   编译安装busybox
    看直播视频,下面是简单的笔记。
    $ tar xjfbusybox-1.26.2.tar.bz2
    $ cd busybox-1.26.2/
    $ make menuconfig // 设置交叉编译工具链前缀为arm-linux-, 并选择支持mount NFS
    $ make
    $ make install
    (2)   从交叉编译工具链中复制lib库
    $ cp -rf _install//work/nfs_root/fs_mini_nanoPI
    $ mkdir/work/nfs_root/fs_mini_nanoPI/lib
    $ cd/opt/FriendlyARM/toolchain/4.9.3/arm-cortexa9-linux-gnueabihf/lib
    $ cp *so* -d  /work/nfs_root/fs_mini_nanoPI/lib
    (3)   构建etc目录:
    只需要创建3个文件:etc/inittab、etc/init.d/rcS、etc/fstab。
    内容如下。
    etc/inittab:
    #/etc/inittab
    ::sysinit:/etc/init.d/rcS
    ttyS0::askfirst:-/bin/sh
    ::ctrlaltdel:/sbin/reboot
    ::shutdown:/bin/umount-a -r
    etc/init.d/rcS:
    #!/bin/sh
    mount-a
    mkdir/dev/pts
    mount-t devpts devpts /dev/pts
    echo/sbin/mdev > /proc/sys/kernel/hotplug
    mdev-s
    还要改变它的属性,使它能够执行:
    $ chmod+x etc/init.d/rcS
             
             etc/fstab
    #device     mount-point    type  options        dump  fsck order
    proc           /proc        proc  defaults        0     0
    tmpfs          /tmp         tmpfs defaults        0     0
    sysfs          /sys         sysfs defaults        0     0
    tmpfs          /dev         tmpfs defaults        0     0
    (4)   构建dev目录:
    $ cd/work/nfs_root/fs_mini_nanoPI
    $ mkdirdev
    $cd dev
    $ sudomknod console c 5 1
    $ sudomknod null c 1 3
    (5)   其他空目录,比如proc、mnt、tmp、sys等,如下创建:
    $ cd/work/nfs_root/fs_mini_nanoPI
    $mkdir proc mnt tmp sys var
    4.2  修改配置文件自动启动APP
             修改文件系统中etc/inittabetc/init.d/rcS即可,参考第2课。
    5.  自制刷机包
    5.1  准备工作
             按照友善之臂官方WIKI
    http://wiki.friendlyarm.com/wiki/index.php/NanoPi_NEO/zh
    http://wiki.friendlyarm.com/wiki/index.php/NanoPi_M1/zh
    先下载源码包得到lichee目录,再下载交叉编译工具链并放入lichee/brandy/toochain/目录下。你得到的可能是文件h3-lichee-20170119.7z,在ubuntu下需要先安装7zip工具才能解压,可以用以下命令:
    $ sudoapt-get install p7zip
    $7zr  x -r  h3-lichee-20170119.7z
    然后执行如下命令编译:
    $ cd lichee
    $./build.sh -p sun8iw7p1 -b nanopi-h3
             接着,对于nanoPINEO,执行以下命令打包系统组件:
    $./gen_script.sh -b nanopi-neo
             对于nanoPI M1,执行以下命令打包系统组件:
    $./gen_script.sh -b nanopi-m1
             
             本文适用于nanoPINEOnanoPI M1,它们的操作命令只有上述这一处差别。

    5.2  制作映象文件,并分区
             制作一个256M的空白映象文件,你可以制作得更小或更大:
    ddif=/dev/zero of=fs_nanoPI_256M.img  bs=1Mcount=256
             
             把映象文件设置为回环设备
    sudolosetup /dev/loop0 fs_nanoPI_256M.img
    划出2个分区,注意第1个分区起始地址要大于(16400K+1000K),我们取它的偏移地址为20M,大小为32M;第2个分区只要大过fs_mini_nanoPI即可,我们取为128M。
    $sudo fdisk /dev/loop0
    分区信息如下:
    Device Boot     Start         End      Blocks  Id  System
    /dev/loop0p1           40960      106495       32768  83  Linux
    /dev/loop0p2          106496      368639      131072  83  Linux
    识别分区,并格式化:
    $ sudopartprobe /dev/loop0
    $sudo mkfs.vfat -I /dev/loop0p1
    $sudo mkfs.ext4 /dev/loop0p2
    5.3  烧写bootloader
    $ cdtools/pack/out/
    $ sudodd if=boot0_sdcard.fex of=/dev/loop0 bs=1k seek=8
    $ sudodd if=u-boot.fex of=/dev/loop0 bs=1k seek=16400
    5.4  烧写内核
    $ cdlinux-3.4/output/
    $sudo mount -t vfat /dev/loop0p1 /mnt
    $ sudocp boot.img /mnt
    $sudo umount /mnt
    5.5  烧写文件系统
    $ cd cd /work/nfs_root/fs_mini_nanoPI/
    $sudo mount /dev/loop0p2 /mnt
    $sudo cp * -rfd /mnt
    $sudo umount /mnt
    5.6  卸载回环设备,烧写SD
    $ sudolosetup -d /dev/loop0
            至此,得到映象文件fs_nanoPI_256M.img,可以使用工具win32diskimager把它烧到SD卡中,此SD卡即可用来启动nanoPI
    5.7  辅助命令
             本节的命令是在开发板上运行的。
    (1) 挂载NFS
    #ifconfig eth0 192.168.1.18
    # mount-t nfs -o nolock,vers=2 192.168.1.123:/work/nfs_root/fs_mini_nanoPI  /mnt

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?注册
    x
    标签:单片机 嵌入式 linux
    举报
    实习生
    发表于 2018-1-16 17:22:48  
    楼主好人
    回复 举报
    实习生
    发表于 2018-2-6 15:02:38  
    好详细,虽然还是看不懂
    回复 点赞 举报
    版主
    发表于 2018-2-9 10:11:34  
    韦老师的经典
    回复 点赞 举报
    版主
    发表于 2018-2-9 10:11:39  
    学习了
    回复 举报
    高级模式
    您需要登录后才可以回帖 登录 | 注册
    关闭

    站长推荐 上一条 /8 下一条

    快速回复 返回顶部 返回列表
    1. time最新主题
    2. recommend推荐主题
    3. hot热门主题
    4. post 我的帖子
    -

    推荐专区

    技术干货集中营

    专家问答

    用户帮助┃咨询与建议┃版主议事

    工程师杂谈

    工程师创意

    工程师职场

    论坛电子赛事

    社区活动专版

    发烧友活动

    -

    嵌入式论坛

    ARM技术论坛

    Android论坛

    Linux论坛

    单片机/MCU论坛

    FPGA|CPLD|ASIC论坛

    DSP论坛

    嵌入式系统论坛

    -

    电源技术论坛

    电源技术论坛

    无线充电技术

    -

    硬件设计论坛

    PCB设计论坛

    电路设计论坛

    电子元器件论坛

    控制|传感

    总线技术|接口技术

    -

    测试测量论坛

    LabVIEW论坛

    Matlab论坛

    测试测量技术专区

    仪器仪表技术专区

    -

    EDA设计论坛

    multisim论坛

    PADS技术论坛

    Protel|AD|DXP论坛

    Allegro论坛

    proteus论坛|仿真论坛

    EasyEDA-中国人自已的EDA工具

    Orcad论坛

    -

    综合技术与应用

    电机控制

    智能电网

    光电及显示

    参考设计中心

    汽车电子技术论坛

    医疗电子论坛

    -

    开源硬件

    -

    无线通信论坛

    无线通信技术专区

    天线|RF射频|微波|雷达技术

    -

    IC设计论坛

    芯片测试与失效分析

    Mixed Signal/SOC[数模混合芯片设计]

    Analog/RF IC设计

    设计与制造封装测试

    -

    厂商专区

    TI论坛

    TI Deyisupport社区

    -

    检测技术与质量

    电磁兼容(EMC)设计与整改

    安规知识论坛

    检测与认证

    -

    消费电子论坛

    手机技术论坛

    平板电脑/mid论坛

    音视/视频/机顶盒论坛

    -

    电子论坛综合区

    聚丰众筹官方社区

    新人报道区

    聚丰供应链

    -

    论坛服务区

    -

    供求信息发布

    供需广告

    招聘┃求职发布区

    电子展览展会专区

    鸿运国际手机版