8.1 概述

在前一节课,我们必须手动挂载TF卡到mnt,然后输入./a.out程序才能启动。而在嵌入式系统里面,我们很多时候需要实现开机启动程序。很多时候我们会把程序固化到FLASH,然后从EMMC启动APP程序。除了MZ701Amini的开发板没有EMMC其他所有开发板的核心版都带了EMMC。

8.2 TF卡启动并自动运行EMMC的APP

修改在第七节课用到的开机自动格式化EMMC的脚本,修改后的脚本源码如下

case "$1" in

start)

    echo "开始挂载EMMC,创建路径/mnt/emmc"

    mkdir -p /mnt/emmc

    mount -t ext2 /dev/mmcblk1p1 /mnt/emmc

    ret=$?

    if [ $ret -ne 0 ]; then

    echo "EMMC正在格式化..."

    echo -e "n \n p \n 1 \n \n \n w \n" | fdisk /dev/mmcblk1

    mkfs.ext2 /dev/mmcblk1p1

    mount -t ext2 /dev/mmcblk1p1 /mnt/emmc

    fi

    echo "EMMC挂载成功!"

if [ -f "/mnt/emmc/a.out" ]; then

        cd /mnt/emmc

        ./a.out

    else

echo "开始挂载TF,创建路径tmp"

     mkdir -p /tmp

     mount /dev/mmcblk0p1 /tmp

     if [ -f "/tmp/a.out" ]; then

     cp /tmp/a.out /mnt/emmc/a.out        

echo "程序从TF卡复制到EMMC成功"

     cd /mnt/emmc

     ./a.out

     fi

    fi

    ;;

    stop)

    ;;

*)

    echo "Usage: $0 {start|stop}"

    exit 1

esac

 

exit $?

在开机后,首先会尝试挂载到 /mnt/emmc路径,如果挂载不成功,就格式化EMMC。然后格式化。之后判断EMMC里面是否有a.out的应用程序。如果有就运行a.out否则就会挂载TF卡并且从TF卡复制a.out程序到EMMC,然后再在EMMC里面启动a.out.

8.3 make_rootfs.sh

修改make_rootfs.sh批处理命令(CH06已经做好)

通过sudo cp ${script_dir}/S60mount_emmc.sh /${ZN_ROOTFS_MOUNT_POINT}/etc/init.d/S60mount_emmc.sh 复制S60mount_emmc.sh文件到开机自动启动的路径下。

8.4 编译

之后执行以下指令

cd /mnt/workspace/osrc/scripts

source settings64.sh

make_rootfs.sh

执行完成后查看ramdisk文件系统是否有S60mount_emmc.sh文件了

执行以下指令

mount_roots.sh

查看路径

ls /mnt/workspace/osrc/boards/mz7x/mylinux/output/rootfs/etc/init.d

可以看到S60mount_emmc.sh已经存在于ramdisk中了

执行

umount_rootfs.sh

然后执行

make_sdcard_image.sh

插入SD卡后执行

deploy_sdcard_image.sh

8.5 测试

拔掉TF卡插入到开发板,开发板以SD启动模式,接通USB串口,打开putty软件查看串口输出,通电。可以看到EMMC挂载成功了,并且运行了hello,world程序。由于笔者已经做过一遍,所以下面的打印结果直接从EMMC挂载后,输出了。如果你是第一次做这个实验,还会有更多关于EMMC格式化,复制a.out程序到emmc的过程。

 

8.6 QSPI启动并自动运行EMMC的APP

从QSPI启动LINUX然后运行EMMC的应用程序,是很多嵌入式设备的最佳方案,因为EMMC是焊接在核心板上的,比插卡的TF卡更加可靠。前面的内容已经制作成功了,所以现在读者只要执行以下几条简单的指令把嵌入式LINUX烧录到FLASH就行了。

cfg_uboot.sh
make_uboot.sh
make_qspi_image.sh

 

1、复制qspi_image.bin到TF卡入下图。

2、插入TF卡到开发板,模式开关切换到SD模式,串口接通到LINUX,在控制台输入
cd /mnt/workspace/osrc/scripts
open_serial_console.sh
打开串口控制台然后给开发板通电。
在控制台可以看到串口的打印信息,启动完成后输入
ls/dev查看设备,入下图所示,mmcblk0就是我们的TF,其中分区mmcblk0p1就是boot分区,里面有我们的linux系统和qspi_image.bin
 
执行以下指令完成烧录到QSPI
# mount /dev/mmcblk0p1 /mnt
# cd /mnt
# ls
# dd if=/mnt/qspi_image.bin of=/dev/mtdblock0

 
开发板断电,切换模式开关到QSPI模式,然后通电,可以看到开发板从QSPI正常启动了,并且输出了helloworld

 

CH08 QSPI启动并从EMMC运行APP的更多相关文章

  1. 重新想象 Windows 8 Store Apps (69) - 其它: 自定义启动屏幕, 程序的运行位置, 保持屏幕的点亮状态, MessageDialog, PopupMenu

    [源码下载] 重新想象 Windows 8 Store Apps (69) - 其它: 自定义启动屏幕, 程序的运行位置, 保持屏幕的点亮状态, MessageDialog, PopupMenu 作者 ...

  2. iOS- 解决iOS10 App启动时放大铺满App Icon的问题

    0.前言 iOS10 App启动时放大铺满App图标 iPad Application shows app icon as launch screen in iOS 10 如图,点击APP后APP图标 ...

  3. 解决Ubuntu 16.04 上Android Studio2.3上面运行APP时提示DELETE_FAILED_INTERNAL_ERROR Error while Installing APKs的问题

    本人工作环境:Ubuntu 16.04 LTS + Android Studio 2.3 AVD启动之后,运行APP,报错提示: DELETE_FAILED_INTERNAL_ERROR Error ...

  4. .NET 实现启动时重定向程序运行路径及 Windows 服务运行模式部署

    日常工作中有时候会遇到需要将程序直接在服务器上运行,而不依赖于 IIS 托管的情况,直接运行有两种方式,一种是部署为 服务模式,另一种则是 直接启动 .NET 发布之后的 exe 文件以 控制台模式运 ...

  5. XE6 & IOS开发之免证书真机调试(2):连接真机并运行App(有图有真相)

    网上能找到的关于Delphi XE系列的移动开发的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 连接真机前,请先确保真机 ...

  6. windows 2008 开机启动 Docker Toolbox 并运行容器

    新建 docker-startup.bat @echo off REM Set the name of the VM configuration where dockerd will be hoste ...

  7. Android之在linux终端执行shell脚本直接打印当前运行app的日志

    1.问题 我们一般很多时候会需要在ubuntu终端上打印当前运行app的日志,我们一般常见的做法是 1).获取包名 打开当前运行的app,然后输入如下命令,然后在第一行TASK后面的就可以看到包名 a ...

  8. docker容器的启动、停止、运行、导入、导出、删除

    原文:docker容器的启动.停止.运行.导入.导出.删除 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/jiang425776024/articl ...

  9. Android Studio运行app时提示Error: Please select Android SDK

    最近开启了一个android项目,点“Run”键运行app,并报错Error:Please select Android SDK: 选择 File -> Project Structure 调整 ...

随机推荐

  1. Java 面向对象(十六)

    多线程 一.并发与并行 并发:指两个或多个事件在同一个时间段内发生. 并行:指两个或多个事件在同一时刻发生(同时发生). 在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上有多个程序同时运行, ...

  2. QTextToSpeech Win7奔溃

    在linux下,它是调用speech-dispatcher.在其它不同的平台上,调用各自平台的TTS引擎.所以在使用的时候,要确保本地的TTS引擎是可用的. 本地TTS引擎不可用可能会在声明QText ...

  3. 判断x的m次方和y的m次方末尾三位数是否相等

    /*==============================================对于任意给定的两个正整数x和y,是否存在一个不超过100的正整数m使得x^m与y^m的末尾三位数相等呢? ...

  4. postgre级联更新

    常规写法 update t_table_copy a set content=( select content from t_table b where a.id = b.id ); 这些法,数据少了 ...

  5. Python之Django之views中视图代码重复查询的优化

    Django框架中views视图中如果多个函数都有同样的查询语句,例如: allcategory = Category.objects.all() remen = Article.objects.fi ...

  6. IDEA 修改某个Module名称

    一.选择module右键——>Refactor——>Rename 二.修改该module下的pom.xml文件对应module名改掉 三.修改项目的pom文件中modules里的modul ...

  7. IFC构件位置信息—ObjectPlacement

    在IFC标准中,采用相对坐标系对构件定位.如柱(IfcColumn)的定位信息(局部坐标系及参考坐标系)由ObjectPlacement描述.ObjectPlacement由两部分组成: (1)Pla ...

  8. Spring cloud微服务安全实战-3-3 API安全机制之流控

    首先要保证你的服务是可用的,其中一个重要的手段就是流控.就是流量控制.比如我的系统每秒只能处理500个请求,那么多余的请求就拒绝掉.这样我的系统不会被压死 实际的开发中,所要面对的流控场景实际是非常复 ...

  9. 【Mac】解决macos安装升级时报错安装所选更新时发生错误的问题

    1 系统更新macjave 更新一直失败: 2  解决方法为:重新启动Mac,并按住Command+R进入恢复模式,找到Terminal后输入csrutil disable,然后重启Mac,再次下载并 ...

  10. v关于使用Glide加载图片失败时显示自己特定的图片

    Glide是Android加载图片的一个框架. 常用加载图片到imageView:Glide.with(this).load(url).into(ImageView imageview). 当加载失败 ...