• 嵌入式Linux固件升级

    2018-03-26 13:25:16
    嵌入式Linux固件升级开发需求• 基于TCP/IP完成驱动模块和应用程序的更新、升级特殊声明该文档中驱动程序和应用程序统称为“固件”。 • 主 机:VMWare--Fedora 9• 开发板:yc2440--64MB Nandflash;Kernel:...

    嵌入式Linux固件升级

    开发需求

    • 基于TCP/IP完成驱动模块和应用程序的更新、升级

    特殊声明

    该文档中驱动程序和应用程序统称为“固件”。

     

    • 主  机:VMWare--Fedora 9

    • 开发板:yc2440--64MB Nandflash;Kernel:2.6.24.4

    • 编译器:arm-linux-gcc-4.0.0

     

    设计原理图

     

     

    说明:

    •  开发板启动FileServer应用程序,作为TCP/IP的Server端,提供接收升级文件的服务。

    • 当需要进行固件升级时,PC启动FileClient应用程序,作为TCP/IP的Client端,提供发送升级文件的服务。

    • Shell脚本文件StartShell判断是否有固件需要升级,如果有更新现有固件后,启动更新后的固件,如果没有,启动现有固件。

     

    文件名称

    所在目录

    功能

    FileClient

    Linux PC下任意目录

    PC机TCP/IP客户端,

    向开发板发送升级固件。

    FileServer

    Linux开发板

    /tmp/update/

    开发板TCP/IP服务端,

    接收客户端发送的升级固件。

    StartShell

    Linux开发板

    /etc/init.d/

    替换相应固件,

    启动相应固件。

     

    实现步骤

    1.      配置启动文件(开发板:192.168.1.168)

    在开发板中,编辑开机启动脚本/etc/init.d/rcS

    #cp ~/StartShell /etc/init.d/

    #vi /etc/init.d/rcS

     

    在该文件的最后面,填写下面信息:

    ./StartShell

     

    重新启动开发板。

     

    2.      发送更新文件文件(Linux PC:192.168.1.200)

    #./fileclient ./AppMain 192.168.1.168

    #./fileclient ./helloworld.ko 192.168.1.168

     

    上述更新文件,被发送至开发板的/tmp/update/(FileServer所在的目录)目录中。

     

    重新启动开发板,文件升级完成。

     

    注:如果要动态加载驱动模块,首先必须在开发板上创建/lib/modules/2.6.24.4目录。

    附件:

    •  TCP/IP源码文件

    http://download.csdn.net/source/2996852

     

    注:TCP/IP 服务尽量使用大端口号,如:50000,否则服务器端会有Bind失败的情况出现。

    服务器端如果有防火墙,需要开放该端口号,否则客户端会有connect失败的情况出现。

     

    • StartShell脚本

     

    #! /bin/sh

     

    #判断是否有新的驱动文件,如果有进行替换

    if [ -f /tmp/update/helloworld.ko ]

    then

            echo "it is a new ko file"

     

            rm /lib/modules/helloworld.ko -f

            cp /tmp/update/helloworld.ko /lib/modules/

            rm /tmp/update/helloworld.ko -f

     

    else

            echo "it is not a new ko file"

    fi

     

    insmod helloworld

    #判断是否有新的应用程序文件,如果有进行替换

    if [ -f /tmp/update/AppMain ]    

    then

            echo "it is a new app file"

     

            rm /root/application/AppMain -f

            cp /tmp/update/AppMain /root/application/

            chmod 777 /tmp/update/AppMain

            rm /tmp/update/AppMain -f

                  

    else

            echo "it is not a new app file"

    fi

     

    #启动应用程序

    cd /root/application/

    ./AppMain &

     

    #启动TCP/IP服务程序

    cd /tmp/update/

    ./FileServer &

     

     

     

    Embedded Linux firmware upgrade 
    Development requirement
    • Based on TCP/IP to complete the driver modules and application updates, upgrades 
    Special Statement 
    Drivers program and application program in this document are collectively called the "firmware". 

    • Main machine: VMWare-Fedora 9 
    • Development Board: yc2440-64MB Nandflash; Kernel: 2.6.24.4 
    • Compiler: arm-linux-gcc-4.0.0 

    Design schematic
     

    Description: 
    • Start FileServer application on development board, as the TCP/IP server, providing service to receive the upgrade file. 
    • When you need a firmware upgrade, PC starts FileClient application, as the TCP/IP client, providing service to send the upgrade file. 
    • Shell script file StartShell determine whether there is the firmware need to upgrade, if it is existed, launch the updated firmware, if not, start the existing firmware. 

    File

    directory

    function

    FileClient

    any directory in linux PC

    PC TCP/IP client, 
    Send upgrade firmware to  development board.

    FileServer

    /tmp/update/ in

    linux development board

    Development board TCP/IP server,

    receive the upgrade firmware from client.

    StartShell

    /etc/init.d/ in

    linux development board

    Replace firmware,

    Start frimware.


    Implementation steps 
    1. Configuration startup files (development board: 192.168.1.168) 
    In the development board, edit the boot script file /etc/init.d/rcS, input the following information: 
    # cp ~ /StartShell /etc/init.d/ 
    # vi /etc/init.d/rcS 

    Finally, in the end of the document, input the following information: 

     

    ./StartShell 

    Restart the development board. 

    2. Send the update file file (Linux PC: 192.168.1.200) 
    #./Fileclient ./AppMain 192.168.1.168 
    #./Fileclient ./Helloworld.ko 192.168.1.168 

    The update file is sent to the development board of the /tmp/update/(FileServer  directory) directory. 

    Restart the development board, file upgrade is OK. 

    Note: If you want to dynamically load the driver module, first the directory /lib/modules/2.6.24.4 must be created in development board.


    Attachment: 
    • TCP/IP source code file
    http://download.csdn.net/source/2996852 

    Note: TCP/IP service port to make use of large numbers, such as: 50000, otherwise there will be bind server failure situation. 
    If the server has a firewall, you need to open up the port number, otherwise the client will connect failure situation. 

    • StartShell script

    #! /bin/sh 

    # Determine whether there is a new driver file, if there is to be replaced 
    if [ -f /tmp/update/helloworld.ko ] 
    then 
            echo "it is a new ko file" 

            rm /lib/modules/helloworld.ko -f 
            cp /tmp/update/helloworld.ko /lib/modules/ 
            rm /tmp/update/helloworld.ko -f 
    else 
            echo "it is not a new ko file" 
    fi 

    insmod helloworld 
    # Determine whether there is a new application file, if there is to be replaced 
    if [ -f /tmp/update/AppMain ] 
    then 
            echo "it is a new app file" 

            rm /root/application/AppMain -f 
            cp /tmp/update/AppMain /root/application/ 
            
    chmod 777 /tmp/update/AppMain 
            rm /tmp/update/AppMain -f 
    else 
            echo "it is not a new app file" 
    fi 

    # Start the application program 
    cd /root/application/ 
    ./AppMain &

    # Start TCP/IP service program 
    cd /tmp/update/ 
    ./FileServer &


    展开全文
  • 嵌入式linux设备要进行软件升级有很种多方式方法,总的来说可以分为本地升级和远程升级。本地升级包括升级工具升级,存储介质升级等,远程升级是指通过网络进行程序升级。这里介绍一种同时至此本地和远程升级的方法...

        嵌入式linux设备要进行软件升级有很种多方式方法,总的来说可以分为本地升级和远程升级。本地升级包括升级工具升级,存储介质升级等,远程升级是指通过网络进行程序升级。这里介绍一种同时至此本地和远程升级的方法,以供参考。

    本地升级:

        (1)升级工具升级

        现在的升级工具有很多,不同的芯片支持不同的工具,比如jlink,串口等,海思的芯片提供Hitool升级工具。升级工具升级直接参考芯片手册就可以了,这里不再介绍。

        (2)存储设备升级

        常见的存储设备有SD卡,TF卡,U盘,硬盘等。将升级文件拷贝到存储设备中,设备启动的时候,通过uboot去检索存储设备中是否有升级文件,如果有,则直接进行升级。

     

    远程升级:

        (1)uboot通过FTP服务下载升级文件升级

        其实该方法可以说是本地升级也可以说是网络升级,uboot启动之后,设置uboot的网络参数和FTP服务,通过网络将升级文件下载到内存中,然后再通过uboot的flash擦除了写入指令,将升级文件直接写入到flash的指定位置上。这种方式用来进行设备调试就可以,方便快捷,但它不能批量操作,也不能程序自动升级,需要人为的辅助。

        (2)通过应用程序网络升级

        该方法是嵌入式linux设备远程升级的最常用的方式。基本流程是:linux系统启动之后,通过应用程序从服务器中下载升级文件进行程序升级。该方法不需要认为操作,可设计程序自动全部升级。

    下面介绍一种可以同时至此本地升级和远程升级的方法,首先看下图:

    Flash数据分布示意图
    Flash 数据分布示意图

        假设有个64M的flash,间Flash分成uboot,kernel,roootfs,app,para 五个分区。然后我们在参数区para分区的开始一段空间用来存储升级文件的版本信息。参数区的深蓝色区域用来存储软件的版本信息,橙色区域用来存储网络升级参数。下面以kernel升级为例,具体说明本地升级与网络升级的流程,其它模块升级于此相同。

     

    (1)制作升级文件

        编译器或是交叉编译工具编译生成的文件多数是二进制文件,也就是单纯的一个升级文件,不包含其他信息。携带更多的升级信息,我们可以将二进制升级文件.bin 打包成img 文件。在Linux系统中可以直接使用mkimage命令,该命令可以指定CPU类型,img类型,压缩类型,内核的入口地址,头结构的名字,image的载入地址等等信息。

     

    (2)本地升级实现

        将img文件拷贝到U盘中插入设备。uboot需要为升级做如下操作:uboot起来之后,去扫描是否有插入存储设备,如果有存储设备,则扫描存储设备中是否有升级文件,以升级kernel为例,假设升级文件名为update_kernl.img。当uboot检测到update_kernel.img文件后,去解析该img文件的文件头。将有用信息提取出来,比如文件头里的时间,img的创建时间等。以这些作为升级参数,与上面flash图参数区中的Kernel Para版本做比较,如果一样则不进行升级操作,如果不一样,则将img文件中的升级文件数据写入到flash的指定位置中去。最后更新Flash参数区kernel的版本信息。也就是上面图中参数区深蓝色中的Kernel Para。到此就完成了本地升级的操作。

     

    (3)远程升级实现

        首先将升级文件update_kernel.img从服务器中下载下来,与本地升级类似,提取update_kernel.img的头文件信息与Kernel Para参数做比较,如果不一样就升级。一般升级地址是存在uboot的参数里,所以我们可以先将升级文件放到内存中(Hi3520芯片有一部分内存是用来做编解码的,软重启内存的数据不会被清空),uboot重启之后再进行升级操作。在重启之前,将升级文件存放的地址AddrPhy,升级文件的校验信息DataCrc32,版本信息Version存放到flash的参数区去。也就是上图参数区的橙色位置。uboot重启之后,去读取上图中flash参数区的橙色区域信息,看是否有需要升级的文件,如果有就按照升级参数的地址去读取升级文件,然后再将升级文件写到flash的固定位置去,最后更新参数区的升级信息。这样就完成了远程的升级操作。

        上面介绍的升级方法,只介绍了基本的思路,详细实现内容太多不再介绍。如有更好的方法,欢迎评论指导。

      

    展开全文
  • 锋影email:174176320@qq.com嵌入式 Linux 系统在线升级策略对于运行 Linux 系统的嵌入式产品,很多时候我们发现了当前版本内核、驱动、或者应用程序的 bug 并对之修复之后,或者研发出了功能更丰富、性能更突出的...

    如果你认为本系列文章对你有所帮助,请大家有钱的捧个钱场,点击此处赞助,赞助额1元起步,多少随意

    锋影

    email:174176320@qq.com


    嵌入式 Linux 系统在线升级策略

    对于运行 Linux 系统的嵌入式产品,很多时候我们发现了当前版本内核、驱动、或者应用程序的 bug 并对之修复之后,或者研发出了功能更丰富、性能更突出的应用软件时,想要对当前运行的设备进行相应程序替换和升级。很多人的做法是通过对每一台设备烧写新版软件的方式进行软件版本更新,如果产品数量少且分布地点比较集中,这种方案具有一定的实效性。但是当设备数量庞大且地点分散时,这种本地烧写的升级方式将会变得非常难以操作,且升级结果可视化具有一定难度,需要通过串口等终端才能确认。

    针对采用 Linux 系统且具有互联网接入能力的嵌入式设备,不论这种接入方式是有线网络、wifi、2G 或者 4G,本文将为其提供一种通过服务端后台对在线的所有或者部分设备进行远程批量升级的高效、可靠、直观的升级策略。升级内容可以是内核、驱动、文件系统、应用程序或者某些配置文件。接下来,将首先展示该方案的架构图,紧接着一步步讲述各个功能或者逻辑模块的细节。

    方案概述

    此升级方案由后台服务端程序、web 页面、终端升级程序三部分组成。如图 1 展示了升级方案 的架构图。

    图 1. 升级方案架构图

    自动草稿

    自动草稿

    服务端程序

    服务端程序用来监测终端设备状态,管理升级包,升级流程控制并且提供 web 端响应以及数据库访问。本策略中的服务端为 apache-tomcat,程序采用 java servlet,数据库为 MySQL,web 页面为 JSP 编写。您可以使用任何一种后台语言(如 php、python 等)实现本文所描述的服务端功能。

    服务端功能有:

    • 终端消息处理
    • 升级包管理
    • 升级指令处理

    终端消息处理

    服务端程序通过 getParameter("version")获得终端软件版本号,通过 queryLatestVersion()查询数据库中最新软件版本号,然后将二者进行对比。如果相同,则证明该终端设备软件版本已经是最新,返回 latest 指令;如果不同且服务端没有收到 web 端用户的升级指令,则通过 queryAddress()从数据库中查询最新升级包的地址,将之返回给终端,以便终端设备从该地址下载升级包,另外,如果此时用户在 web 界面执行了升级命令,则返回 update 指令给终端,终端设备执行升级操作。详细请查看清单 1。

    清单 1. 终端消息处理代码片段

    public void doGet(HttpServletRequest request, HttpServletResponse response)\
    throws ServletException, IOException {
        String msg = null;
        String version_latest = null;
        String address_latest = null;
        String version = request.getParameter("version");
    
        PrintWriter out = response.getWriter();
        version_latest = queryLatestVersion();
        if(version.equals(version_latest)){ 
            msg = "|latest|null|null|";
        }else if(UpdateServlet.update_status){
            msg = "|update|"+version_latest+"|null|";
            UpdateServlet.update_status = false;
        }else{
            address_latest = queryAddress();
            msg = "|download|172.x.x.x"+address_latest+"|"+MD5+"|";
        }
        out.print(msg);
        out.flush();
        out.close();
    }

    升级包管理

    服务端程序处理 web 端上传的升级包,首先确认存放升级包的路径是否存在,没有则创建。升级包接收完成之后,从升级包文件名中截取版本号,然后将文件名、版本号、升级包在服务端的存放路径信息插入到数据库中。类似的,服务端程序也响应 web 端用户对升级包的更改、删除等操作。详细的升级包管理请查看清单 2。

    清单 2. 升级包管理代码片段

    protected void doPost(HttpServletRequest request,\
        HttpServletResponse response) throws ServletException, IOException {
        String uploadPath = "/xx/xx";
        File uploadDir = new File(uploadPath);
        if (!uploadDir.exists()) {
            uploadDir.mkdir();
        }
        try {
        List<FileItem> formItems = upload.parseRequest(request);
        if (formItems != null && formItems.size() > 0) {
             for (FileItem item : formItems) {
                 if (!item.isFormField()) {
                     String fileName = new File(item.getName()).getName();
                     Patternp=Pattern.compile("update_package-(.*?).tar.gz");
                     Matcherm=p.matcher(fileName);
                     while(m.find()){
                         version = m.group(1);
                     }
                    String filePath = uploadPath + File.separator + fileName;
                    sql = "INSERT INTO package(name,version,address)\
                    VALUES('"+fileName+"','"+version+"','"+filePath+"');";
                    dbOperate(sql);
                    File storeFile = new File(filePath);
                    item.write(storeFile);
                    request.setAttribute("message",\
                    "Package Has beed uploaded successfully!");
                }
            }
       }
       } catch (Exception ex) {
            request.setAttribute("message","error info: " + ex.getMessage());
        }
    }

    升级指令处理

    如果用户从 web 端选择了升级设备并且点击了升级按钮,服务端程序则会记录该指令,当下一次收到终端设备的 POST 消息时,则会对指定的终端下发 update 升级指令,终端收到 update 命令后执行升级程序。升级完成之后终端会再次周期性上报其版本号,通过 web 端设备列表即可查看所有设备升级结果,做到升级流程、结果的可视化。

    终端升级程序

    终端升级程序由升级管理程序和升级执行程序两部分组成。本文所描述的升级策略先决条件是构建合理的磁盘、Flash 分区,以便支持本策略中各种程序的正常运行。

    终端磁盘分区示例

    图 2. 终端设备磁盘分区图

    自动草稿

    自动草稿

    图 2 是一个针对本策略的基本 Flash 分区示例。Flash 的总容量为 128M,第一个分区为启动分区,用来存放启动 Linux 系统的引导程序,容量 2M;第二个分区为 Linux 内核分区,用来存放 Linux 内核镜像文件,容量 8M;第三个分区为根文件系统分区,用来存放根文件系统镜像文件且作为运行时用户操作空间,容量 100M;第四个为备份分区,用来存放想要备份的内容,以便升级完成后被拷贝到新的文件系统中,容量 16M;最后一个为固化信息分区,用来存放设备软件版本号、设备类型、设备 id 等信息,容量 2M。该分区信息仅作为参考,分区数量、大小需要根据具体项目做相应修改。当然如果项目没有特殊性,且硬件资源与该示例匹配,此分区方案亦可直接被沿用。

    升级管理程序

    升级管理程序功能如下:

    • 管理软件版本信息
    • POST 设备信息给服务端
    • 从服务端下载升级包
    • 校验,管理升级包
    • 启动升级执行程序

    升级管理程序随着系统开机启动且作为守护进程运行。第一次运行时从宏定义中读取软件版本号并固化到 info 分区中,每隔一段时间从 info 分区中读取设备类型、设备 id、软件版本号。并将这些信息通过 HTTP POST 给服务端。服务端收到设备信息之后解析出其中的软件版本号,并和数据库中的最新升级包版本号进行对比。如果升级包版本号高于设备版本号,则返回 download 指令以及升级包地址、升级包 MD5 码给终端设备。

    表 1. 终端设备信息消息格式

    设备 id设备类型软件版本
    000001家庭网关1.0.1
    000002摄像头1.0.2

    表 2. 服务端返回消息格式

    指令参数 1参数 2
    download<ip>/dir/update_package.<version>.tar.gz<MD5 code>
    update<update package version>null
    latestnullnull

    表 1、表 2 分别展示了终端设备发送、服务端返回的消息格式以及内容。

    升级管理程序收到服务端返回消息对其解析,根据不同指令做如下响应:

    • 指令为 download,则根据参数 1 提供的地址下载对应的升级包到终端设备本地的 tmp 目录中。下载完成之后取得升级包的 MD5 码和参数 2 中的进行对比,完成升级包校验。
    • 指令为 update,则把参数 1 中的版本号和本地 tmp 目录中的升级包版本号进行对比,如果相同才会启动升级执行程序进行升级。
    • 指令为 latest,则证明当前终端设备的软件版本和服务端中的最新升级包版本相同,已经是最新版本,不予理会。

    升级执行程序

    升级执行程序功能如下:

    • 解压升级包
    • 备份文件
    • 格式化内核、文件系统分区
    • 加载升级包中的文件到内核、文件系统分区
    • 重启操作系统
    • 拷贝备份文件到文件系统中

    当升级执行程序被升级管理程序启动之后,首先解压升级包,并对之校验、检测。如果检测通过则开始备份用户文件,需要说明的是 backup 分区挂载在文件系统根目录 backup 文件夹上,因此备份方式是将需要备份的文件拷贝到 backup 文件夹中且记录其原始路径。下一步进行内核、文件系统分区格式化操作,此后将升级包中新版的内核镜像、文件系统镜像写到内核、根文件系统分区中,完成新老替换。然后自动重启操作系统,启动成功之后,将备份文件拷贝到对应的文件系统路径中。此时的终端设备升级完毕,运行新版系统和软件。如果升级内容仅仅为应用程序或者配置文件,则只需进行相应文件的替换即可。

    设备和服务端的交互

    终端设备通过 HTTP 协议与服务端进行交互。终端程序每隔 10 秒向服务端 HTTP POST 发送一次设备信息,服务端根据版本号对比结果以及 web 端升级指令状态返回三种不同指令给终端设备。终端通过解析指令做出相应响应。其中下载功能调用 libcurl 库,具有断点续传能力。10 秒的请求频率可根据具体项目应用场景做出调整,如果终端数量比较少且服务端能够承受连接压力,想要响应更加快速、及时,可考虑将 HTTP 改为 socket 长连接的通信方式。

    web 端

    Web 端提供用户进行升级操作的人机接口,显示、接收、跟踪整个升级过程。采用 JSP 编写。其功能如下:

    • 显示设备状态。显示设备在线、离线状态、设备类型、设备 id、软件版本号。
    • 升级包管理。显示所有升级包,对已有的升级包进行修改、删除等操作。上传新的升级包。
    • 升级操作管理。用户可通过设备列表多选、全选设备,点击升级按钮生成升级指令。

    总结

    本文提供了一种远程在线方式对嵌入式 Linux 设备进行批量升级的策略,升级内容包括内核、驱动、文件系统、应用程序、配置文件等。能够快速、稳定完成升级操作。描述了服务端程序、终端设备升级程序、web 端功能、设备和服务端交互方式,完整地展示了升级流程的细节,供开发者参考。

    需要注意的是,该策略的实施过程中,需要确保升级设备具有足够电量以保证升级程序的顺利执行。该策略仅仅提供功能性的描述,为了确保可靠性和适应更加复杂的环境,开发者需要增加双分区启动备份机制。此外,由于升级包存放在 tmp 目录中,因此可支持的升级包大小受限于内存物理空间,开发者可将升级包存放在指定磁盘分区对该功能进行优化。


    展开全文
  • 在总结这些嵌入式linux学习书籍之前,我在各个linux学习讨论群,都能看到许多新手在问关于嵌入式linux学习书籍推荐这样的问题。在这里,整理了一些值得推荐的嵌入式linux学习书籍,希望对新手学习linux有一定的帮助...

    在总结这些嵌入式linux学习书籍之前,我在各个linux学习讨论群,都能看到许多新手在问关于嵌入式linux学习书籍推荐这样的问题。在这里,整理了一些值得推荐的嵌入式linux学习书籍,希望对新手学习linux有一定的帮助。

    1.《嵌入式Linux C语言程序设计基础教程》

    内容简介:

    本书作为嵌入式专业的C语言教材。全书共11章,第1章介绍了嵌入式Linux下常用的C语言开发工具,为后面的学习打下基础。第2章~第5章讲解了嵌入式Linux C语言中的基础知识。包括嵌入式Linux C语言中的数据、数据的输入和输出、运算符和表达式、程序结构和控制语句。第6章到主要讲解了嵌入式Linux C语言中的数组,包括一维数组、多维数组、字符数组和字符串等。第7章主要讲解了嵌入式Linux C语言中的指针。第8章主要讲解了嵌入式Linux C语言的函数。第9章主要介绍了嵌入式Linux C语言中用户自定义的数据类型。第10章介绍了嵌入式Linux C语言的高级用法。第11章介绍了嵌入式Linux内核中常见的数据结构。

    本书由冯利美主编。本书的完成需要感谢华清远见嵌入式学院,教材内容参考了学院与嵌入式企业需求无缝对接的、科学的专业人才培养体系。同时,嵌入式学院从业或执教多年的行业专家团队也对教材的编写工作做出了贡献,孙天泽、刘洪涛、曾宏安、穆煜、赵苍明、季久峰、贾燕枫、关晓强等在书稿的编写过程中认真阅读了所有章节,提供了大量在实际教学中积累的重要素材,对教材结构、内容提出了中肯的建议,并在后期审校工作中提供了很多帮助,在此表示衷心的感谢。

    下载地址:http://www.embedu.org/xuexi/books/3294.html?szt-csdn

    2.《嵌入式Linux应用程序开发标准教程》

    内容简介:

    隆重申明:本书为嵌入式与移动开发系列,国家信息技术紧缺人才培养工程系列丛书,内容最末尾提供免费下载

    嵌入式Linux应用程序开发标准教程这本书,在业内有着非常多的赞美,非常适合嵌入式初学者在嵌入式Linux应用开发这一块的学习,非常系统全面的介绍。详细讲解了Linux系统的基本知识、Linux系统的安装、Linux图形界面、Linux字符界面、Linux常用命令、Linux应用软件、Linux系统启动、Linux系统管理和维护、Linux服务器配置、shell编程、Linux C语言基础、Linux程序编译和调试维护等内容。

    本书由冯利美主编。本书的完成需要感谢华清远见嵌入式学院,教材内容参考了学院与嵌入式企业需求无缝对接的、科学的专业人才培养体系。同时,嵌入式学院从业或执教多年的行业专家团队也对教材的编写工作做出了贡献,孙天泽、刘洪涛、曾宏安、穆煜、赵苍明、季久峰、贾燕枫、关晓强等在书稿的编写过程中认真阅读了所有章节,提供了大量在实际教学中积累的重要素材,对教材结构、内容提出了中肯的建议,并在后期审校工作中提供了很多帮助,在此表示衷心的感谢。

    《嵌入式Linux应用程序开发标准教程》是众多专家、厂商联合推荐,业界权威培训机构的经验总结,也是曾经华清远见嵌入式培训的经典教材。

    下载地址:http://www.embedu.org/xuexi/books/3369.html?szt-csdn

    3.《嵌入式操作系统(Linux篇)》

    内容简介:

    本书介绍了Linux操作系统对软件、网络、文件系统、用户、中断及设备的管理机制以及Linux系统环境shell语言、Makefile的编写。本书主要以Linux实践为主,旨在帮助不了解Linux系统的读者学会使用Linux操作系统,学会在Linux操作系统上搭建自己的嵌入式开发环境,从而为更深入的学习打下基础。

    本书可作为高等院校嵌入式技术专业以及电子信息类其他专业的教材,也可供中等职业技术院校使用。

    下载地址:http://www.embedu.org/xuexi/books/5483.html?szt-csdn

    4.《从实践中学嵌入式Linux应用程序开发》

    内容简介:

    《从实践中学嵌入式linux应用程序开发》结合大量实例,讲解了嵌入式linux应用程序设计各个方面的基本方法及必要的核心概念。主要内容包括搭建嵌入式linux开发环境、嵌入式文件i/o编程、嵌入式linux多任务编程、嵌入式linux进程间通信、嵌入式linux多线程编程、嵌入式linux网络编程、嵌入式linux设备驱动编程、android应用编程、android播放器项目设计等。重视应用是贯穿全书的最大特点,在各章和全书结尾分别设置了在项目实践中常见和类似的应用实例。

    本书可作为大学院校电子、通信、计算机、自动化等专业的嵌入式linux开发课程的教材,也可供嵌入式开发人员参考。学习本书应具有linuxc语言编程和java编程的基本知识。

    下载地址:http://www.embedu.org/xuexi/books/5487.html?szt-csdn

    5.《Linux设备驱动开发详解》

    内容简介:

    《Linux设备驱动开发详解》此书出自华清远见嵌入式学院,作为嵌入式领域中的职业培训老大,从2004年至今出了80余本相关教材,很多书籍已经成为了高校相关专业用书。不仅很好地延续了上一版经典图书的风格,同时也基于最新Linux内核和LDD6410平台进行了讲解内容和案例的全面升级和更新,书中汇聚的大量Linux驱动开发的参考代码和技术资料,相信对广大的Linux开发人员和嵌入式工程师都具有非常重要的价值和意义。本书全面介绍了Linux设备驱动开发详细内容,重点讲解了驱动设计的硬件基础、Linux内核及内核编程、Linux内核模块、Linux文件系统与设备文件系统、字符设备驱动、Linux设备驱动中的并发控制等,内容丰富,实用易懂。

    下载地址:http://www.embedu.org/xuexi/books/5142.html?szt-csdn

    以上是个人做的linux学习书籍汇总推荐,都是非常好的书,对linux学习很有帮助。

    展开全文
  • 本文就结合笔者经历写一写个人的嵌入式Linux入门的一些步骤和经验。不当之处,望方家指正。 在正式开始之前,先花一点时间写写笔者学习的经历。我是计算机专业,因此,对于模拟电路、数字电路、操作系统原理、...

    李迟按:

    嵌入式入门文章比比皆是,不同的人有不同的入门方法。本文就结合笔者经历写一写个人的嵌入式Linux入门的一些步骤和经验。不当之处,望方家指正。

    在正式开始之前,先花一点时间写写笔者学习的经历。我是计算机专业,因此,对于模拟电路、数字电路、操作系统原理、数据库原理、编译原理、计算组成原理、计算机体系结构、数据结构等等课程,都是必修课。我虽然都不精通,但起码是学习了。

    我从大二开始就已经接触51和AVR单片机,当时机缘巧合,由同专业的同学——也是我老乡带我开始的。然后开始画板、做板、焊板、写程序这些路子,前后陆续接触大约一两年时间,这些经历对于自学嵌入式Linux打下很好的基础。——事实上,在我开发单片机时,我已经计划好要学嵌入式,而且是偏向软件方向。

    同时我也开始安装Linux,自己捣鼓,包括虚拟机安装、物理机安装。因为考试和困难放弃一段时间,但最后还是继续。

    后来大三买了一块ARM9的开发板,自己捣鼓(不用“研究”,是因为以纯粹的门外汉去进行的)uboot、内核、根文件系统。本着不服输的精神,虽然一度放弃,但还是坚持下去。

    在毕业时慢慢摸到一些门道。但此时技术还不够,代码量还不够,后来工作多年,大量接触各式不同的技术,虽然并没有很深入,但足够养成习惯,——解决问题、研究新技术的方法、习惯。

    综上,我走的路子概括为:单片机-->使用Linux-->嵌入式Linux(u-boot->kernel->rootfs)。软件知识:基础必修课->linux环境编译->Linux驱动。

    从上文可以看到,笔者是作为计算机专业的学生而进入嵌入式Linux领域的。但并不是说一定要在学校学习那些课程才能入门。无论学习什么知识,都是靠自己进行的,但有了过来人指点、带你入门,往往省时省力很多——而这正是本文的目的。

    下面进入正文部分。

    一、系统环境

    1、环境搭建

    开发嵌入式需要大量辅助软件,一般来说,我们是在电脑上开发好程序,然后通过某些方式将程序下载到开发板上运行。按这个顺序列出一些我认为必须的:

    Linux系统:主要作为程序开发的系统,选择多人使用并资源丰富的版本,建议ubuntu或fedora,目前我使用ubuntu。可以使用在虚拟机或物理机上。

    虚拟机:有条件的推荐使用物理机安装,但一般经常使用vmware这类虚拟机软件,通过这个软件安装ubuntu系统,然后设置共享。然后在这个系统上交叉编译。

    共享方式:有的人喜欢用vmware自带共享功能,有的人喜欢用samba共享。个人建议在ubuntu中设置samba共享,这样可以在windows上将ubuntu共享目录映射成为其中一个盘符,这样做,就可以在windows下操作linux系统的目录、文件了,不过前提是需要网络性能良好。另一种常见的共享方式是nfs,多用于主机和开发板之间的文件传输。

    开发IDE:有的人建议在linux系统中用vim或emacs,但作为初学者入门,不要如此,使用vim、emacs学习成本高,而会打击积极性。在samba共享情况下,建议使用Notepad++、source insight进行代码编辑

    交叉编译:交叉编译是嵌入式一个很重要的概念。由于我们编译的程序是在开发板(开发板又称目标板)上运行的,但开发板又没有环境进行编译,所以带出“交叉编译”概念。即在一台linux主机系统上使用交叉编译器对代码进行编译,但编译得到的二进制文件无法在该主机运行,只能在开发板上运行。不同的板子使用的交叉编译器不同。一般使用商家自带的交叉编译器。

    下载手段:根据应用场合,可以用jtag烧录器下载程序(适用如u-boot开发)。可以使用tftp方式下载程序(适用kernel开发)。在开发板系统启动后且网络正常情况下,可以使用tftp下载、nfs拷贝等方式进行调试(适用于应用层程序开发)。

    另外对于USB转串口线、网络这类的东西,就不一一详细说明了。

     

    掌握程度:不同人使用的开发环境不尽相同。原则上只要是自己熟悉的环境就可以了,以提高开发效率为准则。

    推荐软件:vmware、notepad++、source insight、tftpd32(均为windows系统软件)。

    2、系统使用

    工欲善其事,必先利其器。系统环境使用熟悉程度越高,越能提高开发速度。举个例了,曾经遇到过别人在设备上调试应用程序,步骤是:编码、编译、制作软件包、用工具升级软件包到设备上,设备上电看效果。这一系列步骤中,制作包、升级软件包耗时很长,对于调试十分不利。如果使用NFS,时间能省至少三分之二。所以说,环境的熟悉是十分重要和必要的。

    本节主要针对Linux系统,对于入门者而言,Linux系统的使用是一个大坎。但要知道,嵌入式开发是离不开linux系统的,是必须学的。目前网络资料十分广泛,几乎遇到的问题都在找到答案,但质量往往良莠不齐,有些甚至会误导人。因此,建议一边学一边做笔记,把自己的疑问、心得、步骤都记录下来(比如,记录第1小节提到的nfs、samba服务安装的步骤)。

    如果时间允许,最好找书本来学习,边看书边敲命令。因为书籍介绍比较系统,有利于了解全貌,再逐个知识点深入,做到胸有成竹。下面列一下需要学习的知识点。

    1、掌握常用命令。必须要学的命令不多,像查看文件、拷贝文件、创建文件、查找文件、显示日期、查看/修改IP,等等。这些常用命令只要使用次数多了,就能熟练掌握。具体的自行搜索。

    2、掌握软件安装步骤。一般linux系统发行版自带有安装工具,如unbutu,在联网情况下直接输入命令apt-get install tool-name,就能安装了。

    3、编译源码方式安装软件。有些工具提供源码需要自己进行编译(比如要在开发板上运行的程序,则无法通过apt-get来安装,需要交叉编译)。linux编译一般有三个步骤:

    配置:./configure

    编译:make

    安装:make install。

    这个知识点自行百度。

    4、了解linux文件系统、目录结构、设备文件。如根目录名称是“/”,配置文件一般位于/etc目录,运行程序一般位于/bin、/sbin、/usr/bin、/usr/sbin,等等。因为嵌入式涉及到根文件系统概念,因而需要对linux目录结构有了解。如果感兴趣,可以去搜索一下LFS。

    5、学习IO重定向、管道概念,学习并会写简单shell脚本。

    6、学习编辑器vi的简单使用(因为有些情况下只有这个编辑器可用)、编译器gcc用法、Makefile知识、gdb调试。(此项针对开发而言)

    推荐资源:

    笔者的主页和博客有大量linux系统使用、软件编译、Makefile,等等文章,欢迎前来围观。

    学习建议:

    1、看书、网络搜索

    2、学会man命令(这是linux内置的帮助命令,比如要了解cp命令的用法,则输入man cp)

    3、记录笔记

    二、应用层

    1、C/C++语言

    C/C++语言本身与具体平台相关不大,但必须结合具体环境平台才能展现其作用。比如,MFC使用C/C++,QT也使用C/C++,Linux内核中使用C,单片机使用C,等等。环境不同,其侧重点不同。在学校里学习C/C++语法,考完试,却没有结合实际项目编程,就有人纠结学了C/C++不懂能做什么。只有真正在某一领域使用了C语言,它才是一个可以看得见、摸得着的东西,而不再是抽象的。

     

    这里结合Linux系统,列举出一些要掌握、学习的知识点。

    1、linux系统编程基本概念:Makefile、gcc、gdb。

    2、文件IO操作。

    3、进程控制、进程间通信、多线程操作

    4、信号处理

    5、网络编程

    6、串口编程

     

    另外也列举C/C++语言的学习点:

    1、标准库

    输入输出(fprintf、sscanf)、文件操作(fopen、fclose)、字符类操作(isalpha、islower)、字符串操作(strcpy、strcmp、memcpy)、信号处理(signal)、日期时间(mktime、ctime)

    2、C++ STL

    向量vector、队列queue、栈stack、列表list。

    推荐网站:http://www.cplusplus.com/reference/

     

    下面列出一些我认为较好的书籍。每种类型的书籍应用场合不同,按需求学习。——不仅嵌入式Linux领域,其它很多领域同时需要C,因而要提高C技能。

    入门篇:

    《Linux C 编程一站式学习》

    《Linux C从入门到精通》

    《Linux C编程从初学到精通 》

    《Linux C编程实战》

    《嵌入式linux应用开发完全手册》 (该书对嵌入式Linux开发整体都有讲述,一书以看窥全貌,入门适用)

    linux网络编程篇:

    《UNIX网络编程》

    《UNIX环境高级编程》

    C/C++提高篇:

     

    《C陷阱与缺陷》

    《C专家编程》

    《C和指》

    《C++沉思录》

    《C/C++深层探索》

    《Effective C++中文版》

    《提高c++性能的编程技术》

    《0 bug:C/C++商用工程之道》 (这本书网络有一定争论,笔者认为有部分的确有可取之处,请辩证看待)

     

    学习路线:

    环境:安装虚拟机linux,配置好samba,有windows下用notepad++编写代码,然后在命令行使用gcc编译并运行。像ubuntu安装必要开发工具sudo apt-get install build-essential 这类的知识点本文就不涉及了。

    实践:首先了解linux下gcc编译基本概念,然后逐个知识点学习。以上每点均是一个知识块,需要手动写代码。建议在github上建立仓库,形成自己的代码库,方便日后使用。

    2、版本控制

    版本控制可以提高开发效率,目前很多公司使用svn或git进行代码管理,很多开源项目——包括kernel,都使用git来管理。对于不涉密的代码,推荐使用github托管,而不便公开的代码,可以在bitbucket或csdn上托管。养成保存代码的习惯很重要。笔者很多年前没有代码托管意识,一次电脑被偷,导致很多代码消失了,如今想找也想不回来了。

    版本控制学习成本不大,无非创建仓库、提交代码这些过程,结合日常编码练习,慢慢熟悉掌握即可。

     

    笔者录制了一个git教程,欢迎观看:

    http://edu.csdn.net/course/detail/4562

    3、脚本

    Linux系统的脚本语言有很多,使用场合也不同,主要目的是提高开发效率。比如:在shell脚本中完成代码的编译并拷贝到nfs共享目录(或tftp服务目录)。这样只需要执行脚本就完成多项工作,节省很多时间。

    4、界面开发

    界面开发不是笔者强项,就写一写笔者的经历。笔者接触过的界面开发有QT、SDL、MFC。这些都是作为工具而存在的,不是专门研究,都是工作需要时再去学习,边学习边实践。

    比如,做一个视频采集的软件,使用了SDL进行显示。

    比如,为了显示YUV格式的文件,使用MFC编写一个播放器。

    5、其它书籍推荐

    内功修炼篇:

    《程序员的自我修养——链接、装载与库》(偏底层的人建议看看)

    《高效程序员的45个习惯 敏捷开发修炼之道》

    《高质量程序设计指南》(建议看看,工作中编写代码一定要注意编码规范,否则维护难度太大)

    《Linux开发工具箱:项目开发的最有效途径》(对应英文版本《The Linux Programmer's Toolbox》,网络有资源)

    (注:入门级别书籍不建议购买,通过网络资源或去图书馆借书等手段来学习就行了。当然经济条件允许的除外)

    笔者这几年也积累一定的文章,欢迎阅读:http://blog.csdn.net/subfate/article/category/752115

    三、底层

    这里说的底层包括三大方面,这三大方面缺一不可。

    bootloader:作为上电运行的第一个程序,负责最原始的初始化操作,初始化芯片、初始化内存、初始化IO复用,读取内核代码并将控制权移交到内核,从而完成使命。

    kernel:提供基本的运行环境,提供外设操作控制接口。

    rootfs:向用词(应用层)提供基本操作环境,包括命令行、程序库等。

    1、bootloader(启动装载程序)

    嵌入式Linux常见的bootloader是u-boot,而X86领域中一般称为BIOS。u-boot的学习没有捷径,最好是在有ARM开发板情况下进行研究,通过打印信息的方法跟踪其流程。但是,看懂u-boot代码需要电路基本知识、芯片手册知识等等。——这些知识,同样适用于内核驱动的开发。

    首先要建立的是整体概念和认识。建议先把厂商提供的u-boot源码编译通过,并下载到开发板上看到正常结果后,再用串口打印信息搜索代码,以了解u-boot的代码流程。然后再慢慢研究。如果bootloader不是学习重点,在有一定概念前提下就可以跳过到内核驱动层了,不过就笔者经验来看,bootloader和内核关系十分密切且部分代码是相通的。

    一般初始化的代码是汇编代码,对于入门者而言,初学阶段不用追究,等有一定基础后再回头研究也不晚。

    笔者许多年前移植过u-boot,写了几篇文章,版本旧了一些,但对于学习而言还有有好处的:

    http://blog.csdn.net/subfate/article/category/751064

    笔者曾经研究过x86的开源bios,写了几篇文章,大家可以看看。虽然对于u-boot学习帮助不大,但可以了解笔者如何从零开始学习一个未知的知识。地址:http://blog.csdn.net/column/details/15826.html

    2、kernel(内核)

    内核是比较大的一块,涉及内容十分多。作为入门者,与u-boot类似,首先要建立的整体概念。先把厂商提供的内核源码编译通过,并下载到开发板上,串口会打印很多启动信息,这些启动信息能帮助我们学习内核,自己也可以在内核中打印语句,以了解其流程。

    每一个平台芯片不同,外设不同,内核均不同,需要进行移植。所谓的“移植”,就是找到合适的驱动,修改适应到该平台的过程。比如,某平台使用2个LCD屏,一个是3.5寸的,另一个是4.3寸的,这需要对内核进行修改。比如,这个平台使用nand flash是1GB的,另一个平台使用的是512MB的,也需要修改内核。其它如EEPROM、电源芯片、网卡,等等,均如此。

    内核知识点分2部分,一是kernel本身的知识点,如内存管理机制(MMU)、时间管理、同步机制,等等。二是外设驱动,如LED灯、GPIO、按键。

    初学者建议学习:

    1、了解内核编译的过程:配置内核、编译uImage。

    2、了解platform驱动模型(笔者文章有现成的模板,已经应用于很多个平台上)。

    3、了解一般外设驱动模型。建议从简单的LED、GPIO入门。

     

    高阶知识点:

    1、学习各种子系统,如MTD、USB、IIC、SPI、RTC、WDT。

    2、学习内核知识,如延时队列、时间管理,同步机制,等等。

    以下是笔者笔记关于内核专题的目录:

     

    推荐资源:

    《Linux设备驱动程序》第三版

    《Linux设备驱动开发详解》

    笔者开了一个专栏讲内核的,欢迎阅读:http://blog.csdn.net/column/details/15829.htm

     

    3、rootfs(根文件系统)

     

    一般情况下,开发板厂商会提供根文件系统,如果没有,则可以自己编译制作。一般嵌入式Linux使用busybox制作文件系统必要的程序、库、配置文件。因为busybox编译出来的内容体积小,节省空间,所以很多ARM开发板上都是用busybox的。另外还涉及到文件系统格式,像Yaffs2、ramfs、ext4、UBI,等等。所有这些知识点,请自行搜索学习。

    掌握程度:

    1、知道系统启动过程涉及到哪些脚本。知道上电启动时如何添加自己程序启动。

    2、了解各目录功能、存储哪些文件(如改IP在哪个配置文件,动态库在哪些目录)。

    四、其他知识

    1、电路原理图、datasheet

    作为底层开发人员来说,能看懂硬件原理图和datasheet是必要的一项技能。

    看懂硬件原理图,就可以知道这个系统上有什么器件,哪些器件有什么功能,如何连接(使用什么协议),提供什么接口。有了这些认知后,才会对系统有一个全局整体的认识掌握。对于开发人员来说绝对是有利的。

    看懂datasheet,才能知道如何访问器件,如何操作器件,了解其时序。

    另外,对于嵌入式经常接触到的如I2C协议,SPI协议等等的协议也要掌握。

     

    掌握程度:不需要像硬件专业同学那样学习数电、模电课程。但起码掌握上升沿、下降沿的概念,知道高电平、低电平概念,懂得看I2C协议的时序图。懂得如何找到datasheet中关键信息(寄存器说明、时序图)。

    学习路线:碎片时间多的人,建议在遇到不懂知识点时上网搜索学习。有条件的建议借书或买来学习。

     

    2、英文

    作为开发人员,英文是无涯逾越的坎,因为datasheet还有开发手册,几乎都是英文的。英文资料的特点是长句子多,而技术性术语多。初看英文的资料,可能进展很慢,但只要坚持下去,就会发现,英文手册也就那些术语而已。遇到不懂的术语,就记录下来。积累多了,阅读就慢慢顺畅了。除了术语外,语法难度,远低于高考、四级水平。

    值得说的是,国外原版书籍或手册,用词往往通俗易懂,但翻译成中文后,有的术语不对,有的句子顺序不对。这加大了阅读难度,也是造成技术书籍难懂的原因之一。

    个人经历:在某次旅途火车上,用手机看了一遍ONVIF协议手册,多年后再回看,基本已掌握。但目前ONVIF中文资料还是少。看懂英文资料,无疑有很大帮助。

    某次工作遇到网络问题,中文搜索无果,去各大英文论坛看,无意发现pause frame,继而看ieee802.3标准手册找权威说明,最后解决。这里英文资料帮了很大忙。

     

    3、其它

    其实很有许多其它知识,无法一一列举。

    本文提及的众多知识点,但绝不是在炫耀水平——因为那是笔者工作被逼去了解掌握的。但总而言这,在认清自己专注核心技能外,多掌握一些技能,总归有好处的。

    五、入门路线

    这里以偏重嵌入式Linux(ARM)驱动开发为例,给出一条入门的路线。

    1、买一款使用广泛、资料多的ARM开发板。因为使用的人多,你遇到的问题别人可能早就遇到并解决了,这样能省很多时间,并且提高自信心。可以到某宝上看看板子。因为是学习使用,最好便宜又适用的。

    2、使用vmware安装一个ubuntu系统。在vmware软件中设置物理桥接方式上网。在ubuntu设置好samba服务、nfs服务、tftp服务。

    3、首先自己动手亲自编译u-boot、kernel,烧写到板子上(注:有可能rootfs不提供源码,而是提供img镜像文件)。

    4、自己修改kernel,并编译busybox,烧写到板子,在板子挂载NFS,在虚拟机交叉编译一个Helloworld程序,并在板子上运行。

    5、根据兴趣,开始捣鼓:u-boot、kernel、应用层开发、QT开发。

    5、选择自己重点关注方面,继续研究。

    这个路线不一定要严格遵守时间轴。

    六、补充

    以上这些项,因不同人的基础而异。像硬件专业的同学,数电、模电和电路图已经掌握,就要加强C和Linux系统的学习。反之,计算机软件专业的同学,就要去学习硬件知识。等等。

    对于书籍,有的可能一下子无法理解,那是因为功力不到。有的可能觉得没有用处,那是因为还没有涉及此方面。比如,非计算专业的人看《编译原理》,《操作系统原理》,《计算机体系结构》,肯定是看不懂的,而且初学者也不必要看。又比如,嵌入式有的领域使用到H264编码、MPEG编码,802.11、CDMA,如果不是进入有关行业的,也不必学习。另外网上很多人写的嵌入式入门文章提到0.11内核版本、2.4内核版本的书,还有离散数字、算法导论的书,并不是都适用所有人。 所以大家一定要量体裁衣,有多大胃口吃多少饭,有多大头戴多大帽,根据自己已有的知识和所处的阶段进行选择。

    另外要说明的是,很多知识点是密不可分的,且界线是很模糊的。比如应用层和底层。因为有时出现问题,并不知道具体哪里的问题,这就需要站在比较高的层面(系统视野)看问题,才会快速定位并解决问题。建议以某一方面为核心点,另一方面做了解掌握。如果有能力,最好都学。

    本文所列举的项目条款,根据个人实际情况学习。建议逐步学习,各个击破。理论上知识点学得越多,越有利于看问题深度、广度的提高。

    一般情况下,嵌入式Linux没有速成。但可以达到入门速成,根据个人能力,我认为大约半个月~2个月即可,不过入门后就要不断学习和积累了,——这个积累,需要精力、时间的投入。

    在后续的系列文章中,笔者将介绍嵌入式Linux入门的一些方法和步骤,当然,不会详细到每个命令,每个驱动,只是根据笔者经验来描述,因此,更多的是经验的分享。

    PS:

    本文提到的服务设置这类操作,自行搜索了解。

    本文提到硬件、协议这类知识,自行搜索了解。

    文中提到书籍的机构与笔者无利益关系,不构成购买理由,请自行把控。

    李迟 2017.6.1 周四 (在远方顺祝我家大锤节日快乐,礼物上周已经网购回去了)

     

    展开全文
  • 第一种 使用 mtd-utils 工具进行在线升级uboot、kernel、rootfs。 这个方法有局限性,仅仅在你硬件上支持NAND Flash的时候才能使用。eMMC或者SD卡则不能使用该方法。 参考文章如下 ...http://www.linux-mtd...
  • https://www.ibm.com/developerworks/cn/linux/1712_anxiang_online_upgrade_strategy/index.html ...针对这种现状,本文提供一种对基于 Linux 系统的嵌入式设备进行在线、远程、批量升级的策略,
  • 嵌入式linux简介

    2020-02-19 19:19:41
    嵌入式linux系统应用非常广泛,涵盖各行各业,基于ARM、mips等微处理器架构的硬件平台。基于嵌入式linux系统的设备已经深入生活中各个角落,随处可见。   我们常说的嵌入式linux系统,其实与电脑端运行的linux...
  • 本文主要就是介绍,在嵌入式Linux 系统下,已经实现了nand 驱动后, 如何利用mtd 工具,进行在线升级u-boot,Linux和文件系统。主要使用到的工具是mtd-utils-1.3.1,如果你需要源码,可以到官网下载...
  • 公司linux嵌入式产品,使用的3G网络,需要远程升级二进制软件,大概十几兆,不算大也不算小,如果每次都完全替换的话,在产品开发初期估计也是不小的流量,所以开始考虑是不是能通过打补丁的方法实现远程升级二级制...
  • 由于市面上大多数嵌入式设备的分散、数量庞大、部署地点情况复杂,因此对于这些设备进行个体、本地升级的实施非常费时费
  • 通过网络升级嵌入式系统的linux内核 1、首先修改u-boot分配两个kernel分区,kernel_old和kernel_new开机的时候默认从kerner_old启动 2、通过网络将数据拷贝到nandflash的kener_new分区,这步还不知道怎么实现,希望...
  • 嵌入式Linux应用开发完全手册.pdf 作者:韦东山 这是一本非常不错的,Linux嵌入式相关的书籍写的通俗易懂。这本书的电子版本,找了一圈找不到。 最终在他们官网找到相关线索。其实,他们的企业云盘中就有免费的完整...
  • 本帖将全程连载《嵌入式Linux开发教程》这本书的全部内容,对Linux有兴趣的小伙伴,可以在本帖中,挑选喜欢的章节进行学习,有疑问可在相应帖子页面进行跟帖回复,以下便是本社区连载的全部链接: 1、本书简介:...
  • 在进行嵌入式Linux应用程序开发时,经常会用到gdb对崩溃日志进行分析,一般情况下,可以直接定位到崩溃的位置。但有时分析core文件时,却看不到有意义的崩溃栈,这时问题就有点复杂了,出现这种现象的原因可能有这么...
  • [嵌入式Linux应用开发完全教程——韦东山],包含项目源码,视频教程,相关资料等,齐全
  • 本文主要介绍了如何在嵌入式Linux系统运行的时候,进行升级整个Linux系统,包括uboot,kernel和rootfs。以及简介Linux中的已有的通用的Nor Flash驱动m25p80,和简介mtd util以及相关工具mtdinfo,flash_erase,flash_...
  • 嵌入式Linux应用开发完全手册,韦东山,完整扫描版,Linux移植
  • 原文首发于跟韦东山学嵌入式Linux 韦东山嵌入式 学嵌入式Linux,就看韦东山视频。 我是1999年上的大学,物理专业。在大一时,我们班里普遍弥漫着对未来的不安,不知道学习了物理后出去能做什么。你当下的...
  • 我把之前在学习嵌入式Linux和工作中遇到问题和相关经验等,一起整理到这里,方便自己查阅和学习,温故而知新,如果能帮助到您,请帮忙点个赞;
1 2 3 4 5 ... 20
收藏数 19,610
精华内容 7,844